基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

前言

在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“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_history
		assign	history[i]= history[i-58]^history[i-39]^ din[i-58];
	end
endgenerate

always @(posedge clk,posedge reset)
if(reset)begin
	dout_r		<=0;
	scram_state	<=58'h3FF_FFFF_FFFF_FFFF;
	end
else if(ena)begin
	dout_r		<=history[WIDTH+58-1:58];
	scram_state <= history[WIDTH+58-1:WIDTH];
	end
	
assign	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;
end

endmodule

三、仿真结果

本次仿真采用的是ModelSim 10.7进行的仿真,每次ena信号拉高,则scrambler执行一次加扰,dout就是加扰后的输出。如果在之后将解扰器直接连接该扰码器,则每拉高一次扰码器的使能信号,需要在下一个扰码器使能信号来之气,拉高解扰码器的使能信号,这样可以保证恢复出正确的原信号。具体可以参考我之后的文章。
基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。
仿真结果如下:
在这里插入图片描述

四、总结

本博客展示了基于Verilog实现的扰码器,根据IEEE标准,扰码器的多项式为 x^58 +x^39 +1。 仿真结果中,dout信号也得出了扰码之后的64位输出值,解扰码器会在下一篇文章中给出,并进行扰码器与解码器的联合仿真,仿真结果显示可以恢复出正确的原始信号。
具体有什么问题,欢迎评论区讨论。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿__星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值