文章目录
- 前言
- 一、扰码器
- 1、什么是扰码器
- 2、扰码的原理
- 3、产生扰码的多项式
- 二、Scrambler的Verilog实现
- 1、scrambler.v
- 2、scrambler_tb.v
- 三、仿真结果
- 四、总结
前言
在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“0”,或很长一段序列都是“1”的情况,这样会给接收端进行同步、定时信息的提取带来困难。这时,就需要用到扰码,阻止过长的“0”或“1”的出现。在接收端就需要用到解扰码,恢复出原始数据。
一、扰码器
1、什么是扰码器
扰码器,顾名思义就是能实现数字信号扰码处理功能的模块。扰码器的作用是:如果输入数字序列是短周期的,将会把该序列以某种规律扰乱为长周期,并且使输出序列中的过判决点接近bit数的一半,这样可以使得接收机更容易提取同步信息。
2、扰码的原理
不用增加冗余度就可以扰乱信号,改变数字信号的统计特性,它的原理是建立在反馈移位寄存器上的。
3、产生扰码的多项式
根据IEEE标准,采用的多项式为 x^58 +x^39 +1,根据反馈移位寄存器,也就是分别在58、39和1的位置的反馈抽头系数为1,其他都为0。
二、Scrambler的Verilog实现
1、scrambler.v
实现扰码器的程序如下:
module scrambler(
use_scrambler, //开始使用扰码器
clk, //时钟,本代码的时钟频率选择为50Mhz
reset,
ena, //使能信号
din, //需要进行扰码的64位输入数据
dout //经过扰码之后的64位输出数据
);parameter WIDTH=32'd64;
input use_scrambler;
input clk;
input reset;
input ena;
input [WIDTH-1:0]din;
output [WIDTH-1:0]dout;
//以下都是进行扰码操作
reg [57:0]scram_state;
reg [WIDTH-1:0]dout_r;
wire [WIDTH+58-1:0]history;genvar i; //定义变量i,它不会被综合assign history[57:0]=scram_state;
//利用generate语句生成64个并行的赋值语句,完成64位的每一位的更新
generate
for(i=58;i<WIDTH+58;i=i+1)begin: gen_historyassign history[i]= history[i-58]^history[i-39]^ din[i-58];end
endgeneratealways @(posedge clk,posedge reset)
if(reset)begindout_r <=0;scram_state <=58'h3FF_FFFF_FFFF_FFFF;end
else if(ena)begindout_r <=history[WIDTH+58-1:58];scram_state <= history[WIDTH+58-1:WIDTH];endassign dout=(use_scrambler==1)?dout_r:din;endmodule
2、scrambler_tb.v
tb文件如下:
module scrambler_tb();
reg use_scrambler;
reg clk;
reg reset;
reg ena;
reg [63:0]din;
wire [63:0]dout;scrambler inst0(
.use_scrambler(use_scrambler),
.clk(clk),
.reset(reset),
.ena(ena),
.din(din),
.dout(dout)
);initial clk=1;
always #10 clk=~clk;initial
begin
reset=0;
use_scrambler=0;
ena=0;
din=0;
#40;
reset=1;
#200;
reset=0;
#200;
use_scrambler=1;
din=64'h0101_1010_ffee_aabb;
#200;ena=1;
#20
ena=0;
#200;ena=1;
#20
ena=0;
#2000;
$stop;
endendmodule
三、仿真结果
本次仿真采用的是ModelSim 10.7进行的仿真,每次ena信号拉高,则scrambler执行一次加扰,dout就是加扰后的输出。如果在之后将解扰器直接连接该扰码器,则每拉高一次扰码器的使能信号,需要在下一个扰码器使能信号来之气,拉高解扰码器的使能信号,这样可以保证恢复出正确的原信号。具体可以参考我之后的文章。
基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。
仿真结果如下:
四、总结
本博客展示了基于Verilog实现的扰码器,根据IEEE标准,扰码器的多项式为 x^58 +x^39 +1。 仿真结果中,dout信号也得出了扰码之后的64位输出值,解扰码器会在下一篇文章中给出,并进行扰码器与解码器的联合仿真,仿真结果显示可以恢复出正确的原始信号。
具体有什么问题,欢迎评论区讨论。