当前位置: 首页 > news >正文

伪随机码PRBS与线性反馈移位寄存器LFSR

伪随机码PRBS

PRBSPseudo-Random Binary Sequence(伪随机二进制序列)的缩写,它是一种在数字通信、测试测量和系统控制等领域应用非常广泛的信号。它是一种可以预先确定、可重复生成,但又具备随机统计特性的二进制序列。

PRBS按照不同阶数可分为PRBS7,PRBS15,PRBS23,PRBS31;

伪随机序列中“0”和“1”的出现概率大致相等,能够很好地模拟真实通信信号中的随机数据,因此也通常采用伪随机序列对通信系统进行测试,在高速串行总线(如PCIe, USB, Ethernet)的物理层测试中,通常用PRBS码型作为激励信号,在接收端测量眼图、抖动和误码率,以此来评估链路的信号完整性。一个能通过PRBS31考验的链路,其传输质量无疑是过硬的。

PRBS的生成原理

PRBS是由“线性反馈移位寄存器(Linear Feedback Shift Register,简称LFSR)”生成。

线性反馈移位寄存器就像一个由多个寄存器排成一排组成的队列,在每一个时钟周期,队列里的数据都会向右移动一格,而最左边空出来的位置,则会根据队列中某些特定位置(抽头)的值进行异或(XOR)运算后填入。这个循环往复的过程,就能生成一串看似随机、实则有规律的序列。

这些抽头由反馈多项式决定,例如x³ + x² + 1,它决定了从寄存器的哪些位置(我们称之为“抽头”)取出数据进行异或运算。

用线性反馈移位寄存器生成伪随机码的Verilog代码如下:

//采用PRBS15,多项式为X15 + X14 + X13 + 1 module PRBS( input clk , input rst , output [31:0] o_prbs ); parameter PRBS_INIT = 16'ha076; reg [31:0] ro_prbs ; wire [47:0] w_prbs ; reg [15:0] r_prbs ; assign o_prbs = ro_prbs; assign w_prbs[47:32] = r_prbs; always @(posedge clk or posedge rst) begin if(rst) r_prbs <= PRBS_INIT; else r_prbs <= w_prbs[15:0]; end genvar i; generate for (i = 0;i < 32;i = i+1 ) begin:prbs_loop assign w_prbs[31-i] = w_prbs[47-i] ^ w_prbs[46-i] ^ w_prbs[45-i] ^ w_prbs[32-i]; //依次将高位舍弃,将亦或后的结果拼接到低位 end endgenerate always @(posedge clk or posedge rst) begin if(rst) ro_prbs <= 32'h0; else ro_prbs <= w_prbs[31:0]; end endmodule

仿真如下:

module PRBS_sim(); reg clk ; reg rst ; always #10 clk = ~clk; initial begin clk = 0; rst = 1; #100; rst = 0; #1000; $finish(); end PRBS PRBS_u0( .clk (clk ), .rst (rst ), .o_prbs ( ) ); endmodule

还可以用线性反馈移位寄存器对数据进行加扰和解扰,下面的代码是GT收发器IP核官方例程中对输入数据的加扰和解扰。

加扰代码:

`timescale 1ns / 1ps `define DLY #1 //***********************************Entity Declaration******************************* module SCRAMBLER # ( parameter TX_DATA_WIDTH = 32 ) ( // User Interface input wire [(TX_DATA_WIDTH-1):0] UNSCRAMBLED_DATA_IN , input wire DATA_VALID_IN , output reg [(TX_DATA_WIDTH-1):0] SCRAMBLED_DATA_OUT , // System Interface input wire USER_CLK , input wire SYSTEM_RESET ); //***************************Internal Register Declarations******************** integer i ; reg [57:0] poly ; reg [(TX_DATA_WIDTH-1):0] scrambled_data_i ; reg [57:0] scrambler ; reg [(TX_DATA_WIDTH-1):0] tempData ; reg xorBit ; //*********************************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 (SYSTEM_RESET) begin SCRAMBLED_DATA_OUT <= `DLY 'h0; scrambler <= `DLY 58'h155_5555_5555_5555; end else if (DATA_VALID_IN) begin SCRAMBLED_DATA_OUT <= `DLY tempData; scrambler <= `DLY poly; end end endmodule

解扰代码:

`timescale 1ns / 1ps `define DLY #1 //***********************************Entity Declaration******************************* module DESCRAMBLER # ( parameter RX_DATA_WIDTH = 32 ) ( // User Interface input wire [(RX_DATA_WIDTH-1):0] SCRAMBLED_DATA_IN , input wire DATA_VALID_IN , output reg [(RX_DATA_WIDTH-1):0] UNSCRAMBLED_DATA_OUT , // System Interface input wire USER_CLK , input wire SYSTEM_RESET ); //***************************Internal Register Declarations******************** reg [57:0] descrambler ; integer i ; reg [57:0] poly ; reg [(RX_DATA_WIDTH-1):0] tempData ; reg [(RX_DATA_WIDTH-1):0] unscrambled_data_i ; reg xorBit ; //*********************************Main Body of Code*************************** always @(descrambler,SCRAMBLED_DATA_IN) begin poly = descrambler; for (i=0;i<=(RX_DATA_WIDTH-1);i=i+1) begin xorBit = SCRAMBLED_DATA_IN[i] ^ poly[38] ^ poly[57]; poly = {poly[56:0],SCRAMBLED_DATA_IN[i]}; tempData[i] = xorBit; end end //________________ Scrambled Data assignment to output port _______________ always @(posedge USER_CLK) begin if (SYSTEM_RESET) begin UNSCRAMBLED_DATA_OUT <= `DLY 'h0; descrambler <= `DLY 58'h155_5555_5555_5555; end else if (DATA_VALID_IN) begin UNSCRAMBLED_DATA_OUT <= `DLY tempData; descrambler <= `DLY poly; end end endmodule
http://www.jsqmd.com/news/486315/

相关文章:

  • 纯水设备专业厂家
  • 3:《死亡笔记》功利主义+报应正义:基拉如何让重罪率暴跌并拯救潜在受害者
  • 智能净水器九大安全防护技术解析
  • Mac电脑配置环境变量
  • 欧姆龙CP1H与台达VFD - M变频器的MODBUS RTU通讯实战
  • 在 Kata Containers 中编译支持 eBPF 的 Guest Kernel 并验证生效
  • MySQL【基本查询下 - 表的增删改查】
  • 为2026年营销活动找富士山素材,这五类站点的筛选顺序很重要
  • 信号与系统分析2026(春季)作业要求:第五次作业
  • Agent Hub:给你的 OpenClaw 装一个多模型军团
  • 基于C语言的轻量级在线商城服务端设计与实现
  • sdut-程序设计基础Ⅰ-实验7-函数(函数题)
  • 淘宝商品详情字段解析:SKU、价格、库存接口全梳理
  • HakcMyVM-Darkside
  • Java Map 集合深度解析(HashMap / ConcurrentHashMap 原理详解)
  • 创建了项目实训博客
  • 基于VirtualLab Fusion的复合光源仿真
  • 计算机毕业设计springboot基于Spark的豆瓣电影数据分析与可视化系统 基于SpringBoot与Spark的豆瓣影片数据挖掘及可视化平台 SpringBoot框架下融合Spark的豆瓣影视信
  • 一篇看懂:进程、服务、启动项、计划任务到底是什么?
  • hot 100 300.最长递增子序列
  • 六城高端腕表维修实操指南:36品牌故障应急+正规网点避坑(表主实测版) - 时光修表匠
  • 第三章:机器学习初醒:从数据中寻找规律
  • 算法设计与分析-习题4.3
  • 2026年青浦区高质量家电门店TOP榜:哪几家值得优先光顾?
  • 零基础Java Web初学者(三):Servlet的两种配置方法
  • 2026 最新|语言发育迟缓优质机构推荐,家长安心选 - 品牌测评鉴赏家
  • 2026少儿英语口语培训机构推荐:三大核心解锁自信沟通力 - 品牌2026
  • 哪个语音公司靠谱?如何选择安全稳定的语音通知平台? - Qqinqin
  • web三个组成部分
  • 2026致孤独症孩子家长:选对训练机构,是给“星星的孩子”最好的底气 - 品牌测评鉴赏家