扰码器原理详解及verilog实现

这篇具有很好参考价值的文章主要介绍了扰码器原理详解及verilog实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是扰码

        扰码就是对原始的用户数据进行扰乱,得到随机化的用户数据。连续扰码两次就能得到原始数据,通常是发送电路在发送数据时先对数据进行随机扰乱,接收电路使用相同的扰乱算法就可以重新恢复出原始的数据。如图所示:

扰码器原理详解及verilog实现

扰码器的优点和作用

        扰码器产生伪随机的比特序列,它和输入的数据进行异或(相加模二),从而实现对输入串行数据的随机化,伪随机序列也是周期重复的,周期长度取决于反馈多项式中触发器的级数和所选择的多项式。接收电路本地有一个和发送电路相同的伪随机序列产生器,它产生的数据和接收数据进行异或,可以恢复出发送端原始的串行数据。

        反馈多项式通常是f(x) = x^n + x^(n-1) + ... + x^2 + x + 1结构,多项式含有x的几次方,在扰码器中就需要对第几个寄存器进行抽头然后异或(即相加模二)。

扰码器举例

        通常情况下,扰码器都是串行扰码,即下面举出的例子,每周期进行单bit的扰码和更新。如果输入是串行的数据,那么则可以在扰码器之前加一个串并转换模块,如下图所示。

扰码器原理详解及verilog实现

        下面以乐鑫科技领跑者实习笔试题为例写一个扰码器,题目描述:用verilog写一段代码,实现如下的扰码功能,其中扰码生成器的初始种子X7~X1=7'b1010101,每拍输入,输出和扰码器更新一次。初始种子就是扰码器在一开始,从X7~X1寄存器锁存的数据初值。

扰码器原理详解及verilog实现

        输入的数据data_in是串行的单bit数据,每次输入都会被从扰码器第4个位置和第7个位置的数据异或,从数据的箭头我们可以看出,每次单bit输入的data_in都要进行如下计算:

data_in_new = data_in ^ (x4 ^ x7)

        又因为移位寄存器每周期输入的数据是需要左移1bit的,所以我们可以将组成扰码器的移位寄存器结构,用“位拼接”的方式更新,代码如下:scramble_reg是一个7bit的寄存器

                scramble_reg <= {scramble_reg[5:0],scramble_reg[3]^scramble_reg[6]};

        低位的组成可以看图上的箭头知道,x1是由x4和x7相加得到的,相加对2取模,可以用异或操作实现。文章来源地址https://www.toymoban.com/news/detail-487378.html

代码

module scramble(
    input               clk         ,
    input               rstn        ,
    input               data_in     ,    //输入单bit数据
    input               data_in_en  ,    //输入数据有效位
    input       [6:0]   ini_seed    ,    //7bit 初始种子
    input               seed_en     ,    //种子有效使能信号

    output  reg         data_out         //输出单bit数据
);

reg  [6:0]  scramble_reg;                //扰码器为7bit的移位寄存器结构 
always @(posedge clk)begin
    if(!rstn)begin
        scramble_reg <= 7'd0;
    end
    else if(seed_en)begin
        scramble_reg <= ini_seed;        //种子有效,读入初始种子
    end
    else if(data_in_en)begin             //输入数据有效时,扰码器每周期更新
        scramble_reg <= {scramble_reg[5:0],scramble_reg[3]^scramble_reg[6]};  
    end
end

always @(posedge clk)begin
    if(!rstn)begin
        data_out <= 1'd0;
    end
    else if(data_in_en)begin             //输出数据是多项式抽头的值和data_in的异或
        data_out <= (scramble_reg[3] ^ scramble_reg[6]) ^ data_in;
    end
end

endmodule

testbench

module tb();

reg clk,rstn;
reg data_in,data_in_en,seed_en;
reg [6:0] ini_seed;

wire data_out;

initial begin
    forever #5 clk = ~clk;
end

initial begin
    rstn <= #1 1'b0;
    clk  <= #1 1'b0;
    data_in <= #1 1'b0;
    data_in_en <= #1 1'b0;
    #15
    rstn <= #1 1'b1;
    data_in_en <= #1 1'b1;
    repeat(10) #10 data_in <= $random%2;
    #50 $finish();                                        
end

initial begin  //initial seed 
    #15
    seed_en <= #1 1'b1;
    ini_seed <= #1 7'b1010101;
end

scramble u_scramble(
    .clk        (clk        ),
    .rstn       (rstn       ),
    .data_in    (data_in    ),
    .data_in_en (data_in_en ),
    .ini_seed   (ini_seed   ),
    .seed_en    (seed_en    ),

    .data_out   (data_out   )
);

initial begin
    $fsdbDumpfile("scramble.fsdb");
    $fsdbDumpvars(0);
end

endmodule

到了这里,关于扰码器原理详解及verilog实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Quartus | verilog 系列】实现 3-8译码器

    实验一: 3-8译码器(原理图输⼊设计)  2.1设计输⼊     1. 将3-8译码器A、B、C端作为输⼊,Y作为输出。     2. 其余引脚按照3-8译码器功能要求连接。     1. 激励⽂件的输⼊包含A、B、C的8种状态     2. 功能仿真 1. 给出3-8译码器的真值表: 2. 实验步骤、实验内容

    2024年02月11日
    浏览(39)
  • Verilog 实现优先编码器的两种方式

    1.1 定义:  为了防止多条线信号同时有效,规定只对序号最高的有效信号线进行编码,相当于该线的优先级别最高,称为优先编码器 。      优先编码器可以通过  if else 语句和case语句两种方式实现。 输入描述: ①输入描述: input      [8:0]         I_n 输出描述: ①输出

    2024年02月08日
    浏览(48)
  • 「Verilog学习笔记」用优先编码器①实现键盘编码电路

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网   分析  用此编码器实现键盘的编码电路。 注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的8421BCD码,是高电平有效。因此将编码器的输出取反就是8421编码输出

    2024年02月05日
    浏览(44)
  • CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    因为前段时间用到CRC校验码,所以在网上找到了很多有关CRC校验码计算原理以及生成CRC校验码的代码实现(包括C语言和Verilog语言的实现)的文章,但关于CRC校验码代码实现的原理未能找到相关文章,于是自己结合C语言和Veirlog语言的实现代码以及CRC校验码的计算原理,对CR

    2023年04月22日
    浏览(101)
  • 编码器测速原理与实现

    通常情况下编码器旋转一周会输出固定的脉冲数,即编码器的分辨率,通过测量固定时间T内编码器输出的脉冲数即可求得电机的转速。 假设编码器的分辨率为P,T时间内测得脉冲数m个,则单倍频(编码器转动一圈输出的脉冲数与分辨率相同)情况下电机转速为: (其中m/p为

    2024年02月17日
    浏览(49)
  • Python 3.11 版本是对线程安全做了什么更改吗

    问题:这份代码在 3.11.3 中它居然输出 0 ,一度以为自己写错了,抱着不信邪的态度,又搞了个 Python 3.9.7 的环境试了下,果然还是符合自己预期,输出不为 0,想问下 3.11 版本中是做了什么修改吗? 答案: 首先在 Python 字节码执行的时候 ,GIL 并不是随时能在任意位置中断切

    2024年02月09日
    浏览(40)
  • 实验一:38译码器的VHDL实现及原理图实现

    找了好多好多,感觉网上都不太人性化,所以自己记录了一下自己写的,还是有点意思的的,但是这前面的没啥意思,到后面连起来用的时候就有意思了! 1、项目的创建 1、File - New Project Wizard 后面没有选择, 一路无脑下来,项目就已经安装好了! 2、两种方法实现38译码器

    2024年02月02日
    浏览(54)
  • FPGA数字电路设计:三八译码器的原理与实现

    FPGA数字电路设计:三八译码器的原理与实现 三八译码器是常用于数字电路设计中的一种重要元件。它的作用是将三位二进制信号转换成八个输出信号,通常用于地址解码、选通控制、状态指示等应用场景。 在FPGA数字电路设计中,三八译码器的实现需要借助Verilog HDL语言进行

    2024年02月08日
    浏览(47)
  • 【Verilog七段译码器】

    本人只是初学,代码经过实验验证,仅供参考 我自己查找模仿编写运行的代码,如有侵权,联系删除。 这是译码器,其作用是将四位 BCD 码转换成七段数码管的段码,显示 1、 2、3…数字。 简单的译码器,书上的例题,只是我多设置了一个输出B

    2024年02月07日
    浏览(43)
  • verilog入门-38译码器

    一、组合逻辑电路与时序逻辑电路 组合逻辑电路: 任意时刻的输出仅仅由该时刻的输入决定,与电路当前的状态无关 。 时序逻辑电路: 任意时刻的输出不仅由该时刻的输入决定,还与电路当前的状态有关 。 二、38译码器的工作原理 表①、38译码器真值表 3种输入状态翻译

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包