HDLbits_Shift Register部分(代码都是能运行出来的但不一定是最简单的,谨慎参考)

4-bit shift register

题目要求:建立一个 4 位移位寄存器(右移),具有异步复位、同步加载和使能功能。

   areset:将移位寄存器复位为零。

    load: 用数据[3:0]加载移位寄存器,而不是移位。
    ena: 右移(q[3] 变为 0,q[0] 被移出并消失)。
    q: 移位寄存器的内容。

如果加载输入和 ena 输入都被置信(1),则加载输入的优先级更高。

代码如下:

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)
            q <= 4'b0 ;
        else if(load) begin
            q <= data ;
        end
        else if(ena) begin
            q <= {1'b0 ,q[3:1]} ;
        end
    end

endmodule

Rotate100_left/right rotator

题目要求: 建立一个 100 位左右旋转器,具有同步加载和左右使能功能。旋转器从寄存器的另一端移入移出位,而不像移位器那样丢弃移出位并移入 0。如果启用,旋转器会旋转位,而不会修改或丢弃它们。

    load: 用数据[99:0]加载移位寄存器,而不是旋转。
    ena[1:0]: 选择是否旋转以及旋转的方向。
        2'b01  向右旋转一位
        2'b10  向左旋转一位
        2'b00 和 2'b11 不旋转。

代码:

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

Shift18

 题目要求:建立一个具有同步加载功能的 64 位算术移位寄存器。移位寄存器既可以左移,也可以右移,移位位数可以是 1 位,也可以是 8 位。算术右移时,移入的是移位寄存器中数字(本例中为 q[63])的符号位,而不是逻辑右移时的零。算术右移的另一种思路是,它假定被移位的数字是带符号的,并保留符号。例如11000算术右移一位 是 11100,逻辑右移一位是01100。01000算数右移一位 是 00100,逻辑右移一位也是00100。

代码如下

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[62:0],1'b0} ;
                2'b01: q <= q<<8 ;
                2'b10: q <= {q[63],q[63:1]} ;//ift right by 1 bit.
                2'b11: q <= {{8{q[63]}},q[63:8]};
            endcase
            end
            else 
                q <= q ;
        end
                     
    end

endmodule

5-bit LFSR

题目要求:如上图所示,其中要求reset要将LFSR置为1。

代码如下:

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 
    wire mid1 ,mid2 ;
    assign mid1 = q[0] ^ 1'b0 ;
    assign mid2 = q[0] ^ q[3] ;
    always @(posedge clk) begin
        if(reset) begin
           q <= 5'h1 ; 
        end
        else begin
            q[4] <= mid1 ;
            q[3] <= q[4] ;
            q[2] <= mid2 ;
            q[1] <= q[2] ;
            q[0] <= q[1] ;
        end
    end

endmodule

 3-bit LFSR/Mt2015 lfsr

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

代码如下:

module sub_module(
        input clk,
        input L,
        input r,
        input q,
        output Q);
    wire mid ;
    assign mid = L? r : q ;
    always @(posedge clk) begin
       Q <= mid ;
    end
endmodule
module top_module (
	input [2:0] SW,      // R
    input [1:0] KEY,     // L KEY[1]  //clk KEY[0]
	output [2:0] LEDR);  // Q
    //wire Q0,Q1,Q2 ;
    sub_module inst1(
        .clk(KEY[0]),
        .L(KEY[1]),
        .r(SW[0]),
        .q(LEDR[2]),
        .Q(LEDR[0]));
    sub_module inst2(
        .clk(KEY[0]),
        .L(KEY[1]),
        .r(SW[1]),
        .q(LEDR[0]),
        .Q(LEDR[1]));
    wire q_mid ;
    assign q_mid = (LEDR[1] ^ LEDR[2]) ;
    sub_module inst3(
        .clk(KEY[0]),
        .L(KEY[1]),
        .r(SW[2]),
        .q(q_mid),
        .Q(LEDR[2]));
endmodule

32-bit LFSR

(还没写)

shift register_Exams/m2014 q4k

代码如下:

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
    wire q1,q2,q3;
    always @(posedge clk) begin
        if(~resetn) begin
            {q1,q2,q3} <= 3'b0 ;
            out <= 1'b0 ;
        end
        else begin
            q1 <= in ;
            q2 <= q1 ;
            q3 <= q2 ;
            out <= q3 ;
        end
    end
endmodule

shift register_Exams/2014 q4b

代码如下:

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); 
    MUXDFF inst1(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(KEY[3]),.q(LEDR[3]),.r(SW[3]),.Q(LEDR[3]));
    MUXDFF inst2(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[3]),.q(LEDR[2]),.r(SW[2]),.Q(LEDR[2]));
    MUXDFF inst3(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[2]),.q(LEDR[1]),.r(SW[1]),.Q(LEDR[1]));
    MUXDFF inst4(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[1]),.q(LEDR[0]),.r(SW[0]),.Q(LEDR[0]));
endmodule
module MUXDFF (
    input clk ,
    input E ,
    input L ,
    input w ,
    input q ,
    input r ,
    output Q );
    wire mid1 ,mid2 ;
    assign mid1 = E? w : q ;
    assign mid2 = L? r : mid1 ;
    always @(posedge clk) begin
        Q <= mid2 ;
    end
endmodule

 3-input LUT_Exams/ece241 2013 q12

题意:用 8 个 D 型触发器创建一个 8 位移位寄存器。将触发器的输出标记为 Q[0]...Q[7]。移位寄存器的输入应称为 S,它馈入 Q[0] 的输入。使能输入控制是否移位。然后,扩展电路,增加 3 个输入端 A、B、C 和一个输出端 Z。电路的行为应如下:当 ABC 为 000 时,Z=Q[0];当 ABC 为 001 时,Z=Q[1],以此类推。

代码:

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) begin
            q <= {q[6:0],S};
        end
        else begin
            q <= q;
        end
    end
    assign Z = q[{A, B, C}];
endmodule
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值