合肥本地网站,wordpress没有底部,2021年室内设计公司全国排名百强,怎么做好网站文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言
在数字信号处理系统中#xff0c;因为发送端的数字信号序列可能…
文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言
在数字信号处理系统中因为发送端的数字信号序列可能会出现很长一段都是“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 WIDTH32d64;//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 [WIDTH58-1:0]history;
assign history{din_d,scram_state};
//定义变量i用于在generate中的循环i不会被综合
genvar i;
//产生并行的赋值块完成对64位值的更新
generate
for(i0;iWIDTH;ii1)begin: gen_historyassign dout_w[i] history[58i-58]^history[58i-39]^ history[58i];end
endgeneratealways (posedge clk,posedge reset)
if(reset)beginscram_state 58h3FF_FFFF_FFFF_FFFF;dout_r 0;end
else if(ena_d)begindout_r dout_w;scram_state history[WIDTH58-1:WIDTH];endassign dout_duse_descrambler?dout_r:din_d;
endmodule2、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 clk1;
always #10 clk~clk;initial
begin
reset0;
use_descrambler0;
ena_d0;
din_d0;
#20;
reset1;
#200;
reset0;
use_descrambler1;
din_d64h19AB_B210_FFEE_AABB;
#200;
ena_d1;
#20;
ena_d0;
#1000;
$stop;
endendmodule四、扰码器与解扰码器的联合仿真
为了更清晰地表示扰码器与解扰码器模块功能正确本博文单独做了一个联合仿真来验证扰码器与解扰码器的功能所以解扰码器的仿真就没有单独列出来了。
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)
);endmodule2、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 clk1;
always #10 clk~clk;initial
begin
reset0;
ena0;
ena_d0;
use_scrambler0;
use_descrambler0;
din0;
#200;
reset1;
#200;
reset0;
use_scrambler1;
use_descrambler1;
din64h0101_1010_FFEE_AABB; //第一个输入数据
#200;
ena1;
#20;
ena0;
#200;
ena_d1;
#20;
ena_d0;
#200;
din64h9988_0011_1100_8899; //数据更改第二个输入数据
#200;
ena1;
#20;
ena0;
#200;
ena_d1;
#20;
ena_d0;
#200;
#2000;//ena1;
//#20;
//ena0;
//#2000;
//ena_d1;
//#20;
//ena_d0;
//#2000;
$stop;
endendmodule3、联合仿真结果
本次联合仿真采用的是ModelSim 10.7仿真平台原始的输入信号首先是64’h0101_1010_FFEE_AABB之后变成另一个原始信号64’h9988_0011_1100_8899仿真结果显示经过扰码器和解扰码器后原始序列可以正确恢复。具体的仿真结果如下: 其中din信号时扰码器的输入端dout信号是扰码器的输出端而dout_d是解扰码器的输出端。
五、总结
本博文首先介绍了什么是解扰码器并给出了解扰码器的实现代码为了更清晰的说明扰码器与解扰码器模块的功能本博文进行了联合仿真仿真结果显示经过扰码器与解扰码器后原始信号可以正确的恢复。