HDLBits刷题Day17,3.2.3.4 5-bit LFSR - 3.2.3.6 32-bit LFSR

3.2.3.4 5-bit LFSR

问题描述

线性反馈移位寄存器是一种移位寄存器,通常带有几个异或门来产生移位寄存器的下一个状态。伽罗瓦 LFSR 是一种特殊的安排,其中带有“抽头”的位位置与输出位进行异或运算以产生其下一个值,而没有抽头位置进行移位。如果仔细选择抽头位置,则可以将 LFSR 设置为“最大长度”。n 位的最大长度 LFSR 在重复之前循环通过 2 的n次方-1 个状态(永远不会达到全零状态)。

下图显示了一个 5 位最大长度的 Galois LFSR,在位位置 5 和 3 处具有抽头。(抽头位置通常从 1 开始编号)。请注意,为了保持一致性,我在位置 5 处绘制了 XOR 门,但 XOR 门输入之一是 0。

构建这个 LFSR。复位应将 LFSR 复位为 1 。

提示:从 1 开始的前几个状态是00001 , 10100 , 01010 , 00101 , ... LFSR 应该在返回00001之前循环通过 31 个状态。

代码:

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 
    always @(posedge clk) begin
        if(reset)
            q<=5'b1;
        else begin
            q[4]<=q[0]^0;
            q[2]<=q[3]^q[0];
            q[3]<=q[4];
            q[1]<=q[2];
            q[0]<=q[1];
        end
    end
    
    /* 这种写法可能更好
    always @(posedge clk) begin
        if(reset)
            q<=5'b1;
        else
        	begin
               q<=q>>1;
               q[2]<=q[0]^q[3];
               q[4]<=0^q[0];
            end       
    end
	*/
endmodule
3.2.3.5 3-bit LFSR

可以联系之前的3.2.1.11 Mux and DFF看一看,在Day10

问题描述

 

为此时序电路编写 Verilog 代码(子模块可以,但顶层必须命名为top_module)。假设您要在 DE1-SoC 板上实现电路。将R输入连接到SW开关,将 Clock 连接到KEY[0],并将L连接到KEY[1]。将Q输出连接到红灯LEDR。

该电路是线性反馈移位寄存器(LFSR) 的一个示例。最大周期 LFSR 可用于生成伪随机数,因为它在重复之前循环通过 2 的n次方-1 个组合。全零组合不会出现在此序列中。

代码: 

module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q
    always @(posedge KEY[0]) begin
        LEDR<=KEY[1]? SW : {LEDR[1]^LEDR[2], LEDR[0], LEDR[2]} ;
    end
endmodule
3.2.3.6 32-bit LFSR

问题描述

在位位置 32、22、2 和 1 处构建具有抽头的 32 位 Galois LFSR。

这足够长,以至于您想要使用向量,而不是 32 个 DFF 实例。

分析:和3.2.3.4 5-bit LFSR是一样的,可以试着根据3.2.3.4把图画出来

代码:

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output [31:0] q
); 
    always @(posedge clk) begin
        if(reset)
            q<=32'h1;
        else begin
            q[31]<=q[0]^0; // 32位
            q[30:22]<=q[31:23];
            q[21]<=q[22]^q[0]; // 22位
            q[20:2]<=q[21:3];
            q[1]<=q[0]^q[2]; // 2位
            q[0]<=q[0]^q[1]; // 1位
            end
    end 
endmodule

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值