2021年5月3日 星期一

HDLBits答案(12)_Verilog移位暫存器

HDLBits答案(12)_Verilog移位暫存器

源自於https://blog.csdn.net/qq_42334072/article/details/109452144


題目描述1
構建一個4bit的移位暫存器(右移),含非同步重定、同步載入和使能
areset
:讓寄存器復位為0
load
:載入4bit數據到移位暫存器中,不移位
ena
:使能右移
q
:移位暫存器中的內容


Solution1

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)begin
            q <= {1'b0,q[3:1]};
        end
        else begin
            q <= q;
        end
    end
endmodule

題目描述2
構建一個100位的左右旋轉器,同步load,左右旋轉需使能。旋轉器從另一端輸入移位的位元,不像移位器那樣丟棄移位的位元而以零位移位。如果啟用,旋轉器就會旋轉這些位,而不會修改或丟棄它們。
load
:載入100位元的移位暫存器數據
ena[1:0]
2’b01 右轉1bit 2’b10 左轉1bit;其他情況不轉
q
:旋轉器內容
Solution2

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
建立一個64位算術移位暫存器,同步載入。移位器可以左右移位,並按數量選擇1位或8位的移位。
load
:載入數據
ena
:決定是否移位
amount
:決定移位方向與數量:2’b00:左移1位;2’b01:左移8位;2’b10:右移1位;2’b11:右移8
q
:寄存器內容(輸出)
Solution3

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[55:0],8'b0};
                    2'b10: q <= {q[63],q[63:1]};
                    2'b11: q <= {{8{q[63]}},q[63:8]};
                endcase
            end
            else begin
                q <= q;
            end
        end
    end
endmodule
題目描述4
構造線性移位暫存器,reset應當使LFSR1


Solution4
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'h1;
        end
        else begin
            q[4] <= 1'b0 ^ q[0];
            q[3] <= q[4];
            q[2] <= q[3] ^ q[0];
            q[1] <= q[2];
            q[0] <= q[1];
        end
    end
endmodule


題目描述5
為這個序列電路編寫Verilog代碼。假設你要在DE1-SoC板上實現這個電路。將R輸入連接到SW開關,將時鐘連接到金鑰[0],將L連接到金鑰[1],將Q輸出連接到紅燈LEDR上。




Solution5
module top_module (
       input [2:0] SW,      // R
       input [1:0] KEY,     // L and clk
       output [2:0] LEDR);  // Q
    wire clk;
    assign clk = KEY[0];
    
    always @(posedge clk)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

題目描述5
構建一個32位的Galois LFSR,其taps位置為322221


Solution5

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output [31:0] q
); 
    integer i;
    always @(posedge clk)begin
        if(reset)begin
            q <= 32'h1;
        end
        else begin
            for(i=0;i<32;i++)begin
                if((i==21)||(i==1)||(i==0))begin
                    q[i] <= q[i+1] ^ q[0];
                end
                else if(i==31)begin
                    q[31] <= 1'b0 ^ q[0];
                end
                else begin
                    q[i] <= q[i+1];
                end  
            end
        end
    end
endmodule

**
題目描述6**實現如下電路圖


Solution6
module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
    reg [3:0] tmp;
    assign out = tmp[3];
    
    always @(posedge clk)begin
        if(!resetn)begin
            tmp <= 4'h0;
        end
        else begin
            tmp <= {tmp[3:1],in};
        end
    end
    
endmodule

**
題目描述7**實現如下電路圖


Connect the R inputs to the SW switches,
clk to KEY[0],
E to KEY[1],
L to KEY[2], and
w to KEY[3].
Connect the outputs to the red lights LEDR[3:0].


Solution7

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); 
    
    MUXDFF u1(.clk(KEY[0]),
               .w(KEY[3]),
               .R(SW[3]),
               .E(KEY[1]),
               .L(KEY[2]),
               .Q(LEDR[3]));
    
    MUXDFF u2(.clk(KEY[0]),
               .w(LEDR[3]),
               .R(SW[2]),
               .E(KEY[1]),
               .L(KEY[2]),
               .Q(LEDR[2]));
    
    MUXDFF u3(.clk(KEY[0]),
               .w(LEDR[2]),
               .R(SW[1]),
               .E(KEY[1]),
               .L(KEY[2]),
               .Q(LEDR[1]));
    
    MUXDFF u4(.clk(KEY[0]),
               .w(LEDR[1]),
               .R(SW[0]),
               .E(KEY[1]),
               .L(KEY[2]),
               .Q(LEDR[0]));
    
endmodule
module MUXDFF (
    input clk,
    input w,R,E,L,
    output Q
);
    wire tmp;
    assign tmp = E ? w : Q;
    always @(posedge clk)begin
        Q <= L? R : tmp;
    end
endmodule

題目描述8
在這個問題中,你將為一個8x1記憶體設計一個電路,在這個電路中,寫入到記憶體是通過移位來完成的,而讀取是隨機訪問,就像在一個典型的RAM中一樣。然後您將使用該電路實現一個3輸入邏輯功能。
首先,用8d類型觸發器創建一個8位移位暫存器。標記為Q[0]Q[7]。移位暫存器輸入稱為S,輸入Q[0] (MSB先移位)。使能輸入enable控制是否移位元,擴展電路使其有3個額外的輸入A,B,C和一個輸出Z。電路的行為應該如下:ABC000時,Z=Q[0],當ABC001時,Z=Q[1],以此類推。你的電路應該只包含8位元移位暫存器和多工器。(這個電路稱為3輸入查閱資料表(LUT))


Solution8

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


沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...