Verilog数字系统基础设计-扰码与解扰

扰码可以对原始的用户数据进行扰乱,得到随机化的用户数据。发送电路在发送数据前先对数据进行随机扰乱,接收电路使用相同的扰乱算法重新恢复出原始的数据。

什么是扰码与解扰

扰码器使用LFSR实现,用来产生伪随机比特序列,它和串行输入的数据进行异或,从而实现对输入数据的随机化。正如我们在LFSR部分讨论过的,伪随机序列也是周期重复的,其周期长度取决于LFSR中触发器的级数和所选择的多项式。接收电路本地有一个和发送电路中相同的伪随机序列产生器,它产生的数据与接收数据进行异或,可以恢复出发端原始的串行数据。

这里用到了一个逻辑运算表达式:如果A^B=C,那么C^B=A,此处A为原始数据,B为扰码器的输出,C为扰码后的数据。如图6.4所示。

扰码的作用

扰码有以下两个作用:

(1)扰码可以使重复的数据图案的频谱被展宽。例如,在数据流中重复出现序列10101010,这会导致高频离散频谱的出现从而产生较强的EMI(电磁干扰)。当进行扰码后,该数据被随机化,EMI噪声会大大减弱。

(2)扰码的另一用处是减少并行线路中的串扰。扰码可以使功率谱分布更为平滑和均匀,从而降低高频串扰。

串行扰码器

结合LFSR及其给出的多项式可以方便地设计串行扰码器。对于串行扰码器,一个时钟周期只有1比特的用户数据到达,每个时钟上升沿之后输出一位经过扰码后的数据,同时LFSR内部触发器的值被更新。然而,很多时候在一个时钟周期内到达多个比特的数据,此时我们需要设计并行扰码器,它可以在一个时钟周期内输入和输出多位数据。

并行扰码器

对并行数据加扰,遵循和串行加扰同样的算法。以每个时钟周期到达8位并行数据为例,LFSR伪随机序列产生器需要在每个时钟周期内产生8位随机数,同时扰码器在每个时钟周期内产生8位扰码后的随机数据。我们可以假定有一个8倍于当前并行数据工作时钟的虚拟时钟,在8个虚拟时钟周期之后,LFSR伪随机序列产生器可以产生8位数据(注意,LFSR伪随机序列产生器的输出与当前输入数据是无关的,与寄存器的当前状态有关),这8位数据与输入的8位原始数据进行异或,就可以得到并行扰码的最终结果。在后面的部分中,我们将对PCIe专用扰码器的实现进行讨论。并行扰码技术同样适用于16比特或32比特的并行数据。

扰码电路设计要点

我们讨论了如何对串行数据及并行数据进行加扰处理,然而,为了实现扰码电路,还需要注意以下三个要点。

(1)扰码器初始化

发送电路和接收电路必须可以独立地对扰码器和解扰器进行初始化,否则二者就不能实现同步,从而接收电路也无法恢复出原始数据。PCIe中使用了一个名为COM的字符,发送电路和接收电路都可以识別该字符,并在收到该字符后将电路中的扰码器置为预先约定的相同的初始始值。这些COM字符被周期性地发送,使得收发双方能够同步或者对LFSR进行周期性的初始化。

(2)扰码器暂停

正常工作时,LFSR内部触发器的值在每个时钟周期都会进行更新,然而,LFSR应该可以被暂停更新。例如,在PCIe中,数据流中会添加或删除SKIP字符,并且SKIP字符的数量在中间处理过程中还可能发生变化。无论是发送电路还是接收电路,SKIP字符都是不需要进行扰码和解扰处理的,因此扰码电路和解扰电路应该可以在这些字符出现时进入“暂停”状态,“跳过”对它们的处理。

(3)扰码器去使能

扰码器还应该可以工作在LFSR内部寄存器不断更新,但不产生有效输出的状态。例如,在PCIe中,训练字符(TS1/TS2)未被加扰,但LFSR内部仍能不断更新。

PCIe扰码电路

PCIe扰码器(如图6.5所示)是一个16位LFSR多项式如下:

  • ,它有16个LFSR触发器,图6.5是其具体电路;

  • COM字符将LFSR初始化为16’hFFFF;

  • SKP字符可以令其工作暂停。

PCIe扰码器工作波形如图6.6所示。

Verilog RTL-PCIe扰码器

// 每时钟周期处理8比特并行数据

module scrambler_8bits(clk,rstb,data_in,k_in,disab_scram,data_out,k_out);//****************************************************************
input clk;
input rstb;
input [7:0]data_in; // input data to be scrambled
input k_in; // when 1, the input is a control character.
// when 0, the data is regular datainput disab_scram; // when 1 scrambling is disabled ,
output [7:0] data_out; // scrambled data output
output k_out; // when 1 the output is a control character.//****************************************************************
localparam LFSR INIT = 16‘hFFFF;reg  [15:0] lfsr, lfsr_nxt;
wire [15:0] lfsr_int;
wire initialize_scrambler, pause_scrambler;
reg  [7:0] data_out, data_out_nxt;
wire [7:0] data_out_int;/* First find the equations for the LFSR flops. Since there are 8 bits of data coming input, the LFSR flops value moves 8 times (as there is an imaginary clock running 8 times faster). Find the intermediate value. Refer to PCIe sepe for the following algorithm */assign lfsr_int[0]  = lfsr[8];
assign lfsr_int[l]  = lfsr[9];
assign Ifsr_int[2]  = lfsr[10];
assign lfsr_int[3]  = lfsr[8] ^ lfsr[ll];
assign lfsr_int[4]  = lfsr[8] ^ lfsr[9]  ^ lfsr[12];
assign lfsr_int[51  = lfsr[8] ^ lfsr[9]  ^ lfer[10] ^ lfsr[13];
assign lfsr_int[6]  = lfsr|9] ^ lfsr[10] ^ lfsr[l1] ^ lfsr[14];
assign lfsr_int[7]  = lfsr[10]^ lfsr[ll] ^ lfsr[12] ^ lfsr[15];
assign lfsr_inr[8]  = lfsr[0] ^ lfsr[l1] ^ lfsr[12] ^ lfsr[13];
assign lfsr_int[9]  = lfsr[l] ^ lfsr[12] ^ lfsr[13] ^ lfsr|14];
assign lfsr_int[10] = lfsr|2] ^ lfsr|13] ^ lfsr[14] ^ lfsr[15];
assign lfsr_int[l1] = lfsr[3] ^ lfsr[l4] ^ lfsr[15];
assign lfsr_int[l2] = lfsr[4] ^  lfsr[15];
assign lfsr_int[13] = lfsr[5];
assign lfsr_int[14] = lfsr[6];
assign lfsr_int[15] = lfsr[7];// now use the special handles to define lfsr_nxt[15:0]
//****************************************************************
assign initialize_scrambler = (data_in == 8'hBC) && (k_in == 1); //COM char
assign pause_scrambler = (data_in == 8'h1C) && (k_in == 1) // SKP char
always @(*)beginlfsr_nxt = lfsr;if (disab_scram | pause_scrambler )lfsr_nxt = lfsr;else if (initialize_scrambler)lfsr_nxt = LFSR_INIT;elselfsr_nxt = lfsr_int;end// flop inferencealways @(posedge clk or negedge rstb)beginif(!rstb)lfsr <= LFSR_INIT;elselfsr <= lfsr_nxt;end
// Now we need to perform the XOR operation with the input data_in to derive
// scrambled data First derive data_outjnt[7:0]
//****************************************************************
assign data_out_int[0] = data_in[0] ^ lfsr[l5];
assign data_out_int[1] = data_in[1] ^ lfsr[l4];
assign data_out_int[2] = data_in[2] ^ lfsr[13];
assign data_out_int[3] = data_in[3] ^ lfsr[12];
assign data_out_int[4] = data_in[4] ^ lfsr[l1];
assign data_out_int[5] = data_in[5] ^ lfsr[l0];
assign data_out_int[6| = data_in[6] ^ lfsr[9];
assign data_out_int[7] = data_in[7] ^ lfsr[8];always @(*)
begindata_out_nxt = data_out_int;if (disab_scram || k_in) // scrambling disabled or input control characterdata_out_nxt = data_in;elsedata_out_nxt = data_out_int;
end// flop inference
//****************************************************************
always @(posedge clk or negedge rstb)
beginif(!rstb)data_out <= 'd0;elsedata_out <= data_out_nxt;
endendmodule

学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容,关注我,持续更新中......

Verilog数字系统基础设计-LFSR

推荐阅读

【Vivado那些事】如何查找官网例程及如何使用官网例程

【Vivado使用误区与进阶】总结篇

【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键

SystemVerilog数字系统设计_夏宇闻 PDF

图书推荐|ARM Cortex-M0 全可编程SoC原理及实现

简谈:如何学习FPGA

1202年了,还在使用虚拟机吗?Win10安装Ubuntu子系统及图形化界面详细教程

Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目

AD936x+ZYNQ搭建收音机(一)

AD936x+ZYNQ搭建OpenWIFI

无招胜有招-Vivado非工程模式下的详细设计

追寻ARM的起源-Acorn电脑简史及FPGA实现

面试中经常会遇到的FPGA基本概念,你会几个?

Xilinx FPGA MIPI 接口简单说明

介绍一些新手入门FPGA的优秀网站

Vivado ML(机器学习) 2021尝鲜

推荐一些可以获取免费的国外的原版书籍(电子版)网站

【Vivado那些事】FPGA的配置方式

FPGA 的重构

浅析FPGA局部动态可重构技术

ISP(图像信号处理)算法概述、工作原理、架构、处理流程

国产CPU概括

从电子游戏历史看IC发展的助推剂

80年代电子游戏及电脑游戏的发展历史

PCIe总线的基础知识

万字长文带你回顾电子游戏的七十多年历史(完整版)

FPGA中异步复位,同步释放的理解

OpenFPGA系列文章总结

用Verilog设计一个16 位 RISC 处理器

介绍一些新手入门FPGA的优秀网站(新增)

Verilog数字系统基础设计-CRC

Verilog数字系统基础设计-扰码与解扰相关推荐

  1. Verilog数字系统基础设计-LFSR

    Verilog数字系统基础设计-LFSR 引言 LFSR(线性反馈移位寄存器)用于产生可重复的伪随机序列PRBS,该电路由n级触发器和一些异或门组成.在每个时钟周期内,新的输入值会被反馈到LFSR内部 ...

  2. Verilog数字系统基础设计-数据转换器

    绪论 在一些应用中,两个电路模块交界处,一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时需要进行数据转换.例如,在SATA控制器中,内部数据位宽为32比特,但是与外部物理收发器PHY的接口 ...

  3. Verilog数字系统基础设计-CRC

    CRC(循环冗余校验) CRC介绍 临时"插播",后面有实例. CRC(Cyclic Redundancy Check,循环冗余校验)是数据帧传输中常用的一种差错控制编码方式,针对 ...

  4. WCDMA系统中的扰码规划

    摘要:宽带码分多址(WCDMA)系统采用码分多址的无线接入方式,不需频率规划,但需进行相邻小区扰码的规划用以区分各小区.通过WCDMA无线网络的扰码规划,可以确定两个使用相同扰码的小区的复用距离,区分 ...

  5. 数字系统课程设计——VHDL密码锁控制器

    @数字系统课程设计 VHDL密码锁控制器 VHDL语言设计的密码锁控制器,模拟仿真平台为vivado 2018.(学生:慌慌和张张) 使用器材:Nexys4 DDR Artix-7 FPGA 设计软件 ...

  6. 高速数字系统时钟设计-AD9516

    此篇是我在学习中做的归纳与总结,其中如果存在版权或知识错误请直接联系我,欢迎留言. PS:本着知识共享的原则,此篇博客可以随意转载,但请标明出处! 在高速数字系统中,时钟起到至关重要的作用,它决定系统 ...

  7. Verilog数字系统教程学习——Verilog语法的基本概念

    Verilog HDL是一种用于数字系统设计的语言.Verilog HDL既是一种行为描述语言也是一种结构描述语言. 行为描述--逻辑--reg型变量 结构描述--连线--wire型变量 这就是说,无 ...

  8. 基于 BS 模式的汽车售后服务系统的设计+源码

    1 概述 随着百姓购买力的提升, 各种车辆走进千家万户, 跟汽车相关的服务也呈现出蓬勃发展的势头.据悉, 汽车销售商的利润来源中, 售后服务占 50% , 汽车销售占 10% , 零部件销售占10% ...

  9. 计算机毕业设计Android的课程表系统app设计(源码+系统+mysql数据库+Lw文档)

    项目介绍 本软件是基于Eclipse的开发环境,依托Tomcat服务器上的后台数据,开发出了针对Android平台的课程表系统. 经过对课程表系统的了解.以及体验了流程,总结出本系统需要的功能如下: ...

最新文章

  1. 免费公开课报名 | 达观数据个性化推荐系统实践
  2. 图论-最短路Dijkstra算法详解超详 有图解
  3. 配置安全的windows2003服务器
  4. 利用Graphviz 画结构图
  5. 2021年春季学期-信号与系统-第八次作业参考答案-第十一小题
  6. IAAS、PAAS与SAAS
  7. 同行不支持鸿蒙系统,鸿蒙系统虽好,但也需要国内同行支持
  8. Windows安装Apache注册服务出现(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager,
  9. logging、hashlib、collections模块
  10. 【在线集成开发环境】Eclipse Che简单上手体验
  11. PHP SPhinx::SetLimits 注意事项
  12. C#调用C++的DLL所有数据类型转换方式
  13. 谈谈创业这点事(8)
  14. LUA C API接口
  15. Mac 安装VMware
  16. FIPS 140-3与140-2的差异-2
  17. 护眼郎与您分享各国如何千方百计帮孩子远离近视
  18. 算法题之计算哪一桶是红酒
  19. windows11及以下系统怎么修改账户名
  20. 大家好,我叫二哈识图

热门文章

  1. ZIL的价值评估报告
  2. pytorch计算分类验证精度acc1,acc5代码
  3. PDB python调试
  4. python抓取boss直聘招聘信息
  5. 2022T电梯修理考试试题及模拟考试
  6. oracle vm 缩放,如何缩小VirtualBox虚拟机并释放磁盘空间
  7. 服务器上运行Selenium
  8. 智慧树怎么导入教务系统的课_智慧树网学习手册导入选课之APP版.doc
  9. 关于电磁场中的E.B.D.H的理解
  10. FPGA蜂鸣器实现歌曲《两只老虎》