Shift Registers

Shift18

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
                q<=q;
            end
            else begin
                case(amount)
                    2'b00:begin q<={q[62:0], 1'b0}; end	//左移1位;算数左移和逻辑左移一样;
                    2'b01:begin q<={q[55:0], 8'b0}; end	//左移8位;
                    2'b10:begin q<={q[63], q[63:1]}; end	//右移1位;算数右移,左边要补上原始符号位;
                    2'b11:begin q<={{8{q[63]}}, q[63:8]}; end	//右移8位;
                endcase
            end
        end
    end    

endmodule

Lfsr32

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<={0^q[0],q[31:23],q[22]^q[0],q[21:3],q[2]^q[0],q[1]^q[0]}; 
            //tap位置为自然数位置,32位:0与q[0]异或,其他如position 22下一位及新q[21]=q[22]^q[0]为新q的21位;
        end
    end

endmodule

Exams/m2014 q4k

法一:移位寄存器

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
    
    reg[3:0] shift;
    
    always@(posedge clk)begin
        if(~resetn)begin
            shift<=0;
        end
        else begin
            shift<={in,shift[3:1]}; //移位寄存器,右移;
        end
    end
    
    assign out=shift[0];
    
endmodule

法二:例化

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
    
    wire w3_2,w2_1,w1_0;
    
    d d3(.clk(clk),.res(resetn),.d(in),.q(w3_2));
    d d2(.clk(clk),.res(resetn),.d(w3_2),.q(w2_1));
    d d1(.clk(clk),.res(resetn),.d(w2_1),.q(w1_0));
    d d0(.clk(clk),.res(resetn),.d(w1_0),.q(out));

endmodule

module d(
    input clk,
    input res,
    input d,
    output q);
    
    always@(posedge clk)begin
        if(~res)begin
            q<=0;
        end
        else begin
            q<=d;
        end
    end
    
endmodule

Exams/2014 q4b 

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); //
    
    reg D3,D2,D1,D0;
    
    assign D3=KEY[2]?SW[3]:(KEY[1]?KEY[3]:LEDR[3]); //KEY[2]:L,KEY[1]:E;
    assign D2=KEY[2]?SW[2]:(KEY[1]?LEDR[3]:LEDR[2]);
    assign D1=KEY[2]?SW[1]:(KEY[1]?LEDR[2]:LEDR[1]);
    assign D0=KEY[2]?SW[0]:(KEY[1]?LEDR[1]:LEDR[0]);
    
    MUXDFF MUXDFF3 (.clk(KEY[0]),.d(D3),.q(LEDR[3]));
    MUXDFF MUXDFF2 (.clk(KEY[0]),.d(D2),.q(LEDR[2]));
    MUXDFF MUXDFF1 (.clk(KEY[0]),.d(D1),.q(LEDR[1]));
    MUXDFF MUXDFF0 (.clk(KEY[0]),.d(D0),.q(LEDR[0]));

endmodule

module MUXDFF (
    input clk,
    //input res,
    input d, 
    output q);
    
    always@(posedge clk)begin
        q<=d;
    end

endmodule

Exams/ece241 2013 q12

 法一:移位寄存器

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;
        end
        else begin
            Q<={Q[6:0],S};
        end
        
    end
    
    always@(*)begin //若时钟上升沿,非阻塞赋值有一个clock的时延;组合逻辑阻塞赋值没有时延;
        case({A,B,C})
            3'h0:begin Z=Q[0]; end
            3'h1:begin Z=Q[1]; end
            3'h2:begin Z=Q[2]; end
            3'h3:begin Z=Q[3]; end
            3'h4:begin Z=Q[4]; end
            3'h5:begin Z=Q[5]; end
            3'h6:begin Z=Q[6]; end
            3'h7:begin Z=Q[7]; end
        endcase
    end

endmodule

 法二:例化

module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z ); 
    
    reg[7:0] Q;
    
    d d0(.clk(clk),.ena(enable),.d(S),.q(Q[0]));
    d d1(.clk(clk),.ena(enable),.d(Q[0]),.q(Q[1]));
    d d2(.clk(clk),.ena(enable),.d(Q[1]),.q(Q[2]));
    d d3(.clk(clk),.ena(enable),.d(Q[2]),.q(Q[3]));
    d d4(.clk(clk),.ena(enable),.d(Q[3]),.q(Q[4]));
    d d5(.clk(clk),.ena(enable),.d(Q[4]),.q(Q[5]));
    d d6(.clk(clk),.ena(enable),.d(Q[5]),.q(Q[6]));
    d d7(.clk(clk),.ena(enable),.d(Q[6]),.q(Q[7]));
    
    always@(*)begin //若时钟上升沿,非阻塞赋值有一个clock的时延;组合逻辑阻塞赋值没有时延;
        case({A,B,C})
            3'h0:begin Z=Q[0]; end
            3'h1:begin Z=Q[1]; end
            3'h2:begin Z=Q[2]; end
            3'h3:begin Z=Q[3]; end
            3'h4:begin Z=Q[4]; end
            3'h5:begin Z=Q[5]; end
            3'h6:begin Z=Q[6]; end
            3'h7:begin Z=Q[7]; end
        endcase
    end

endmodule

module d(
    input clk,
    input ena,
    input d,
    output q);
    
    always@(posedge clk)begin
        if(~ena)begin
            q<=q;
        end
        else begin
            q<=d;
        end
    end
    
endmodule

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值