HDLBits练习——shift registers

1.4 bits shift register

构建一个4位的右移计数器,具有异步复位,同步负载,使能功能(右移后高位补0)

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q); 

    always @ (posedge clk or posedge areset) begin
        if(areset)  begin
           q <= 4'b0; 
        end
        else if (load) begin
           q <= data; 
        end
        else if ((ena==1) && (load == 0)) begin
            q <= (q >>1); 
        end
    end
    
endmodule

2.Rotate100

构建一个100位的循环左移/右移器(高位不补0,为移动的数字)——拼接符

module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q); 

    always @ (posedge clk) begin
        if(load) begin
           q <= data; 
        end
        else begin
            case(ena)
                2'b01: q <= {q[0],q[99:1]};
                2'b10: q <= {q[98:0],q[99]};
                default: q <= q;
            endcase
        end
    end
    
endmodule

3.Shift18

构建一个64位的算术移位寄存器
按位移位只是将向量的位向右或向左移动指定的次数,移出向量的位丢失。移入的新位是零填充的。例如,操作8’b11000101 << 2将产生值8’b00010100。按位移位将执行相同的操作,无论被移位的值是有符号的还是无符号的。
算术左移位对有符号和无符号表达式执行与按位左移位相同的操作。算术右移位对“无符号”和“有符号”表达式执行不同的运算。如果要移位的表达式是无符号的,算术右移位的行为与按位右移相同,即用零填充输入位。如果表达式是有符号的,则算术右移将通过用符号位的值填充每个输入位来保持值的有符号性。

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 

    always @ (posedge clk) begin
        if(load) begin
           q <= data; 
        end
        else begin
            if(ena) begin
                case(amount) 
                  2'b00: q <= q << 1 ;
                  2'b01: q <= q << 8 ; 
                  2'b10: q <= {q[63],q[63:1]};
                  2'b11: q <= {{8{q[63]}},q[63:8]} ;
                endcase
            end
            else q <= q;
        end
    end
    
endmodule

4.Lfsr5

FSR:在移位寄存器向右移位一位以后,左边就会空出一位(如上图所示),这时如果采用一个反馈函数,以寄存器中已有的某些序列作为反馈函数的输入,在函数中经过一定的运算后,将反馈函数输出的结果填充到移位寄存器的最左端,那么这样的移位寄存器就会有源源不断的输出。这样的,拥有反馈函数的移位寄存器称为反馈移位寄存器
LFSR:线性反馈移位寄存器,如果反馈移位寄存器的反馈函数是线性函数(即只进行简单线性运算的函数),那么这种寄存器就被称为线性反馈移位寄存器。
LFSR的反馈函数就是简单地对移位寄存器中的某些位进行异或,并将异或的结果填充到LFSR的最左端。对于LFSR中每一位的数据,可以参与异或,也可以不参与异或。其中,我们把参与异或的位称为抽头。
详细解释连接

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 

    always @ (posedge clk) begin
        if(reset) begin
           q <= 5'b1; 
        end
        else begin
            q[0] <= q[1];
            q[1] <= q[2];
            q[2] <= q[0] ^ q[3];
            q[3] <= q[4];
            q[4] <= 0 ^ q[0];
        end
    end
    
endmodule

5.Mt2015 lfsr

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 
            if(KEY[1]) 
                begin
                    LEDR[0] <= SW[0];
                    LEDR[1] <= SW[1];
                    LEDR[2] <= SW[2];
                end
            else 
                begin
                    LEDR[0] <= LEDR[2];
                    LEDR[1] <= LEDR[0];
                    LEDR[2] <= LEDR[2]^LEDR[1];
                end
        end
 
endmodule

6.Lfsr32

构建一个 32 位 Galois LFSR,在位位置 32、22、2 和 1 处抽头

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output [31:0] q
); 

    always @ (posedge clk) begin
        if(reset) begin
           q <= 32'h1; 
        end
        else begin
            q <= {q[0]^1'b0,q[31:23],q[0]^q[22],q[21:3],q[0]^q[2],q[0]^q[1]}; 
        end
    end
    
endmodule

7.Exams/m2014 q4k

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);

    reg q0,q1,q2;
    
    always @ (posedge clk) begin
        if(!resetn) begin
           out <= 0;
           q0 <= 0; 
           q1 <= 0;
           q2 <= 0;
        end
        else begin
            q0 <= in;
            q1 <= q0;
            q2 <= q1;
            out <= q2;
        end
    end
    
endmodule

8.Exams/2014 q4b

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); //
    MUXDFF MUXDFF_U0 (
        .clk(KEY[0]),
        .l(KEY[2]),//片选
        .w(KEY[3]),
        .d(LEDR[3]),//上一个q
        .r(SW[3]),// sw
        .e(KEY[1]),
        .q(LEDR[3]),
        );
    MUXDFF MUXDFF_U1 (
        .clk(KEY[0]),
        .l(KEY[2]),//片选
        .w(LEDR[3]),
        .d(LEDR[2]),//上一个q
        .r(SW[2]),// sw
        .e(KEY[1]),
        .q(LEDR[2]),
        );
    MUXDFF MUXDFF_U2 (
        .clk(KEY[0]),
        .l(KEY[2]),//片选
        .w(LEDR[2]),
        .d(LEDR[1]),//上一个q
        .r(SW[1]),// sw
        .e(KEY[1]),
        .q(LEDR[1]),
        );
    MUXDFF MUXDFF_U3 (
        .clk(KEY[0]),
        .l(KEY[2]),//片选
        .w(LEDR[1]),
        .d(LEDR[0]),//上一个q
        .r(SW[0]),// sw
        .e(KEY[1]),
        .q(LEDR[0]),
        );
    
endmodule
 
module MUXDFF (
		input clk,
		input l,//片选
        input w,
        input d,//上一个q
        input r,// sw
        input e,
        output q
           );
    always@(posedge clk)begin
        
        q<=(e==1'b1)?((l==1)?r:w):((l==1)?r:d);
    end
    
endmodule

9.Exams/ece241 2013 q12

构建一个3输入的查找表(LUTs)
在这个问题中,您将为 8x1 存储器设计一个电路,其中对存储器的写入是通过移入位完成的,读取是“随机访问”,就像在典型的 RAM 中一样。然后,您将使用该电路实现 3 输入逻辑功能。
首先,创建一个带有 8 个 D 型触发器的 8 位移位寄存器。标记 Q[0]…问[7].移位寄存器输入应称为 S,它馈送 Q[0] 的输入(MSB 首先移入)。使能输入控制是否移位。然后,将电路扩展为具有 3 个附加输入 A、B、C 和一个输出 Z。电路的行为应如下:当 ABC 为 000 时,Z=Q[0],当 ABC 为 001 时,Z=Q[1] 时,依此类推。您的电路应仅包含 8 位移位寄存器和多路复用器。(旁注:该电路称为 3 输入查找表 (LUT))。

module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z ); 
    reg [7:0] Q;
    always@(posedge clk) begin
        if(enable)
            Q<={Q[6:0],S};
    end
    always@(*) begin
        case({A,B,C})
            3'b000:Z<=Q[0];
            3'b001:Z<=Q[1];
            3'b010:Z<=Q[2];
            3'b011:Z<=Q[3];
            3'b100:Z<=Q[4];
            3'b101:Z<=Q[5];
            3'b110:Z<=Q[6];
            3'b111:Z<=Q[7];
        endcase
    end
endmodule

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值