基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。

前言

在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“0”,或很长一段序列都是“1”的情况,这样会给接收端进行同步、定时信息的提取带来困难。这时,就需要用到扰码,阻止过长的“0”或“1”的出现。在接收端就需要用到解扰码,恢复出原始数据。

一、扰码器

关于扰码器,请查看我上一篇博文。
基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

二、解扰码器

解扰码器就是将已经经过扰码操作的数字信号序列恢复成原始数字信号序列的模块。

三、Descrambler的Verilog实现

1、descrambler.v

module	descrambler(
use_descrambler	,		//开始使用解扰码器
clk,				
reset,			
ena_d,					//解扰码器的时钟信号
din_d,					//解扰码器的输入,可以直接连到扰码器的输出端
dout_d					//解扰码器的输出
);

parameter		WIDTH=32'd64;//64位的数据

input		use_descrambler;
input		clk;
input		reset;
input		ena_d;
input		[WIDTH-1:0]din_d;
output		[WIDTH-1:0]dout_d;

reg			[57:0]scram_state;
wire		[WIDTH-1:0]dout_w;
reg			[WIDTH-1:0]dout_r;

wire		[WIDTH+58-1:0]history;
assign		history={din_d,scram_state};
//定义变量i,用于在generate中的循环,i不会被综合
genvar	i;
//产生并行的赋值块,完成对64位值的更新
generate
for(i=0;i<WIDTH;i=i+1)
	begin: gen_history
			assign dout_w[i]= history[58+i-58]^history[58+i-39]^ history[58+i];
	end
endgenerate

always @(posedge clk,posedge reset)
if(reset)begin
	scram_state		<=58'h3FF_FFFF_FFFF_FFFF;
	dout_r			<=0;
	end
else if(ena_d)begin
	dout_r			<=dout_w;
	scram_state		<=history[WIDTH+58-1:WIDTH];
	end

assign		dout_d=use_descrambler?dout_r:din_d;
endmodule

2、descrambler_tb.v

`timescale 1ns/1ns
module	descrambler_tb();
reg		use_descrambler;
reg		clk;
reg		reset;
reg		ena_d;
reg		[63:0]din_d;
wire	[63:0]dout_d;

descrambler	inst0(
.use_descrambler(use_descrambler),
.clk(clk),
.reset(reset),
.ena_d(ena_d),
.din_d(din_d),
.dout_d(dout_d)
);

initial clk=1;
always #10	clk=~clk;

initial
begin
reset=0;
use_descrambler=0;
ena_d=0;
din_d=0;
#20;
reset=1;
#200;
reset=0;
use_descrambler=1;
din_d=64'h19AB_B210_FFEE_AABB;
#200;
ena_d=1;
#20;
ena_d=0;
#1000;
$stop;
end

endmodule

四、扰码器与解扰码器的联合仿真

为了更清晰地表示扰码器与解扰码器模块功能正确,本博文单独做了一个联合仿真来验证扰码器与解扰码器的功能,所以解扰码器的仿真就没有单独列出来了。

1、scrambler_test.v

将扰码器与解扰码模块例化到顶层文件scrambler_test中,具体的逻辑实现如下:

module	scrambler_test(
clk,
reset,
ena,
ena_d,
use_scrambler,
use_descrambler,
din,
dout,
dout_d
);

input		clk;
input		reset;
input		ena;
input		ena_d;
input		use_scrambler;
input		use_descrambler;
input		[63:0]din;
output		[63:0]dout;
output		[63:0]dout_d;

scrambler	inst_s(   //扰码器模块
.use_scrambler(use_scrambler),
.clk(clk),
.reset(reset),
.ena(ena),
.din(din),
.dout(dout)
);

descrambler	inst_d(		//解扰码器模块
.use_descrambler(use_descrambler),
.clk(clk),
.reset(reset),
.ena_d(ena_d),
.din_d(dout),
.dout_d(dout_d)
);
	
endmodule

2、scrambler_test_tb.v

测试平台中,进行了两次的测试,将输入数据进行了一次改变,之后仍然可以恢复出原始数据。

`timescale 1ns/1ns
module	scrambler_test_tb();
reg		clk;
reg		reset;
reg		ena;
reg		ena_d;
reg		use_scrambler;
reg		use_descrambler;
reg		[63:0]din;
wire	[63:0]dout;
wire	[63:0]dout_d;

scrambler_test	inst0(
.clk(clk),
.reset(reset),
.ena(ena),
.ena_d(ena_d),
.use_scrambler(use_scrambler),
.use_descrambler(use_descrambler),
.din(din),
.dout(dout),
.dout_d(dout_d)
);

initial clk=1;
always #10 clk=~clk;

initial
begin
reset=0;
ena=0;
ena_d=0;
use_scrambler=0;
use_descrambler=0;
din=0;
#200;
reset=1;
#200;
reset=0;
use_scrambler=1;
use_descrambler=1;
din=64'h0101_1010_FFEE_AABB; //第一个输入数据
#200;
ena=1;
#20;
ena=0;
#200;
ena_d=1;
#20;
ena_d=0;
#200;
din=64'h9988_0011_1100_8899; //数据更改,第二个输入数据
#200;
ena=1;
#20;
ena=0;
#200;
ena_d=1;
#20;
ena_d=0;
#200;
#2000;

//ena=1;
//#20;
//ena=0;
//#2000;
//ena_d=1;
//#20;
//ena_d=0;
//#2000;
$stop;
end

endmodule

3、联合仿真结果

本次联合仿真采用的是ModelSim 10.7仿真平台,原始的输入信号首先是64’h0101_1010_FFEE_AABB,之后变成另一个原始信号64’h9988_0011_1100_8899,仿真结果显示,经过扰码器和解扰码器后,原始序列可以正确恢复。具体的仿真结果如下:
在这里插入图片描述
其中,din信号时扰码器的输入端,dout信号是扰码器的输出端,而dout_d是解扰码器的输出端。

五、总结

本博文,首先介绍了什么是解扰码器,并给出了解扰码器的实现代码,为了更清晰的说明扰码器与解扰码器模块的功能,本博文进行了联合仿真,仿真结果显示,经过扰码器与解扰码器后,原始信号可以正确的恢复。

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿__星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值