线性移位寄存器用于加扰与解扰的Verilog实现
创作时间:
作者:
@小白创作中心
线性移位寄存器用于加扰与解扰的Verilog实现
引用
CSDN
1.
https://blog.csdn.net/ChenLei_hust/article/details/144117804
线性反馈移位寄存器(LFSR)在通信系统中常用于数据加扰与解扰,其具有硬件实现简单、资源消耗少、伪随机性好等优点。本文将详细介绍LFSR的加解扰原理,并提供Verilog代码实现。
LFSR用于加解扰的原因
- 高效实现:LFSR硬件实现简单,资源消耗少。
- 伪随机性:生成的序列在统计上表现出良好的随机性,适合加扰需求。
- 可逆性:加扰和解扰使用相同的LFSR和初始状态,可以恢复原始数据。
- 简单反馈:通过XOR操作与反馈多项式结合,易于实现。
- 易同步:发送端和接收端同步容易,只要使用相同的初始状态。
- 抗干扰能力:生成的伪随机序列能有效抵抗干扰。
LFSR广泛应用于通信系统、加密、错误检测等领域,因其高效、可逆且具有较强的抗干扰能力。
加解扰原理图
Verilog代码实现
加扰模块代码
`timescale 1ns / 1ps
`define DLY #0
(* DowngradeIPIdentifiedWarnings="yes" *)
//***********************************Entity Declaration*******************************
module aurora_64b66b_0_SCRAMBLER_64B66B #
(
parameter TX_DATA_WIDTH = 62
)
(
// User Interface
UNSCRAMBLED_SYNC_HEAD,
SCRAMBLED_SYNC_HEAD,
UNSCRAMBLED_DATA_IN,
SCRAMBLED_DATA_OUT,
DATA_VALID_IN,
// System Interface
USER_CLK,
SYSTEM_RESET
);
//***********************************Port Declarations*******************************
// User Interface
input [1:0] UNSCRAMBLED_SYNC_HEAD;
input [0:(TX_DATA_WIDTH-1)] UNSCRAMBLED_DATA_IN;
input DATA_VALID_IN;
output [(TX_DATA_WIDTH-1):0] SCRAMBLED_DATA_OUT;
output reg [1:0] SCRAMBLED_SYNC_HEAD;
// System Interface
input USER_CLK;
input SYSTEM_RESET;
//***************************Internal Register Declarations********************
integer i;
reg [57:0] poly;
reg [57:0] scrambler = 58'h155_5555_5555_5555;
reg [0:(TX_DATA_WIDTH-1)] tempData = {TX_DATA_WIDTH{1'b0}};
reg xorBit;
reg [(TX_DATA_WIDTH-1):0] SCRAMBLED_DATA_OUT;
//*********************************Main Body of Code***************************
always @(scrambler,UNSCRAMBLED_DATA_IN)
begin
poly = scrambler;
for (i=0;i<=(TX_DATA_WIDTH-1);i=i+1)
begin
xorBit = UNSCRAMBLED_DATA_IN[i] ^ poly[38] ^ poly[57];
poly = {poly[56:0],xorBit};
tempData[i] = xorBit;
end
end
//________________ Scrambled Data assignment to output port _______________
always @(posedge USER_CLK)
begin
if (DATA_VALID_IN)
begin
SCRAMBLED_DATA_OUT <= tempData;
scrambler <= poly;
SCRAMBLED_SYNC_HEAD<= UNSCRAMBLED_SYNC_HEAD;
end
end
endmodule
解扰模块代码
module descrambler(
//Input
input wire clk_195p3125M ,
input wire rst_n ,
input wire [0:62 - 1] scrambled_data_in ,
input wire idle_b_check_en ,
//Output
output logic [62 - 1:0] unscrambled_data_out,
output logic idle_b_check_result
);
//---
// Parameters
//---
parameter POLY_WIDTH = 58;
//---
// Internal variables
//---
logic [POLY_WIDTH-1:0] poly ;
logic [POLY_WIDTH-1:0] poly_temp ;
logic [0:62-1] data_temp ;
logic xor_bit ;
//---
// Implementation
//---
always_comb begin
poly_temp = poly;
for(int i = 0;i < 62; i += 1)begin
xor_bit = scrambled_data_in[i] ^ poly_temp[38] ^ poly_temp[57];
poly_temp = {poly_temp[POLY_WIDTH-2:0],scrambled_data_in[i]};
data_temp[i] = xor_bit;
end
end
always_ff @(posedge clk_195p3125M or negedge rst_n)begin
if(!rst_n)begin
unscrambled_data_out <= {62{1'b0}};
poly <= {POLY_WIDTH{1'b1}};
end
else begin
unscrambled_data_out <= data_temp ;
poly <= poly_temp ;
end
end
/********************************Check idle_b********************************/
always_ff @( posedge clk_195p3125M or negedge rst_n ) begin : Check_idle_b
if(!rst_n)begin
idle_b_check_result <= 0;
end
else if(idle_b_check_en)begin
if(unscrambled_data_out == {{6'h2C},{7{8'hBC}}})begin
idle_b_check_result <= 1;
end
else begin
idle_b_check_result <= 0;
end
end
else begin
idle_b_check_result <= idle_b_check_result;
end
end
endmodule
测试平台代码
`timescale 1ns / 1ps
module testbench_scrambler_descrambler;
// Parameters
parameter TX_DATA_WIDTH = 62;
parameter POLY_WIDTH = 58;
// Inputs and Outputs for Scrambler
reg clk;
reg rst_n;
reg [1:0] unscrambled_sync_head;
reg [TX_DATA_WIDTH-1:0] unscrambled_data_in;
reg data_valid_in;
wire [TX_DATA_WIDTH-1:0] scrambled_data_out;
wire [1:0] scrambled_sync_head;
// Inputs and Outputs for Descrambler
reg idle_b_check_en;
wire [TX_DATA_WIDTH-1:0] descrambled_data_out;
wire idle_b_check_result;
// Instantiate Scrambler
aurora_64b66b_0_SCRAMBLER_64B66B #(
.TX_DATA_WIDTH(TX_DATA_WIDTH)
) uut_scrambler (
.UNSCRAMBLED_SYNC_HEAD(unscrambled_sync_head),
.SCRAMBLED_SYNC_HEAD(scrambled_sync_head),
.UNSCRAMBLED_DATA_IN(unscrambled_data_in),
.SCRAMBLED_DATA_OUT(scrambled_data_out),
.DATA_VALID_IN(data_valid_in),
.USER_CLK(clk),
.SYSTEM_RESET(!rst_n)
);
// Instantiate Descrambler
descrambler uut_descrambler (
.clk_195p3125M(clk),
.rst_n(rst_n),
.scrambled_data_in(scrambled_data_out),
.idle_b_check_en(idle_b_check_en),
.unscrambled_data_out(descrambled_data_out),
.idle_b_check_result(idle_b_check_result)
);
// Clock Generation
initial begin
clk = 0;
forever #5 clk = ~clk; // 100 MHz clock
end
// Test Sequence
initial begin
// Initialize signals
rst_n = 0;
unscrambled_sync_head = 2'b00;
unscrambled_data_in = 0;
data_valid_in = 0;
idle_b_check_en = 0;
// Apply reset
#20 rst_n = 1;
// Test case 1: Transmit random data
#10 unscrambled_sync_head = 2'b01;
unscrambled_data_in = 62'h3FFFFFFFFFFFFF;
data_valid_in = 1;
#10 unscrambled_data_in = 62'h123456789ABCDE;
#10 unscrambled_data_in = 62'h55555555555555;
#10 data_valid_in = 0;
// Enable idle_b_check for descrambler
#10 idle_b_check_en = 1;
// Wait for descrambler to process data
#100;
// Test case 2: Transmit known pattern
unscrambled_data_in = 62'hA5A5A5A5A5A5A5;
unscrambled_sync_head = 2'b10;
data_valid_in = 1;
#10 data_valid_in = 0;
// Check idle_b_check_result
#10 idle_b_check_en = 0;
// Finish simulation
#50 $stop;
end
// Monitor outputs
initial begin
$monitor($time,
" Unscrambled Data In = %h, Scrambled Data Out = %h, Descrambled Data Out = %h, Check Result = %b",
unscrambled_data_in, scrambled_data_out, descrambled_data_out, idle_b_check_result);
end
endmodule
仿真结果
(此处省略仿真结果图片,实际应用中应包含仿真波形图)
总结
LFSR加解扰的本质是在加扰和解扰时保持内部寄存器状态一致,通过两次异或操作恢复原始数据。这种机制在通信系统中得到广泛应用,特别是在需要数据加扰以改善信号传输特性的场景中。
热门推荐
怎样才算控股一家公司?
居民、工业、大工业用户的电费组成及计算实例
2025年北京中考改革方案详解:总分调整为530分,道德与法治改为开卷
全国名中医教你冬至养生
数据分析流程中的数据清洗怎么做
冰箱电磁阀的结构和工作原理
企业文化与社会责任共建可持续发展价值观
律师工作要求:技能、素养与专业素养的融合
象征堆砌下的孤独灵魂——《狗阵》
如何组建复合型人才团队
仓库经常发错货?这五大措施帮你加强管理
央视公布10大“宜居城市”!如果到了退休年龄,你会选择哪里呢?
电动执行机构是什么?
怎么恢复耳机的安全音量提醒
慈禧与缠足:一次改革的尝试与失败
虚拟仿真情景互动,我在三一职院当“财务主管”
塑料砧板好不好?在使用时需要注意什么
2024南京租房攻略:高效找房技巧分享
存量房贷利率下调,“房贷族”压力减轻?
人偷渡境外犯罪案件分析
电源管理技术如何开启能效优化新时代
深圳地铁5号线西延线最新建设进展,开通时间+线路图+站点介绍
深入探讨整数的定义、性质及其在生活中的应用与重要性
高考数学大题答题技巧有哪些
“营养”助你全面康复
故宫太和殿的楠木从何而来?
胸腺法新、胸腺五肽、胸腺肽,肿瘤患者提升免疫力,应该怎么选?
2024年全球二次元移动游戏市场研究报告
春节前后,HR们如何用AI玩转企业招聘?
儿科呼吸科专家解读:儿童哮喘的症状、诱因与管理方法