본문 바로가기
Digital Design/논리회로

[논리회로] Register (Design with Verilog)

by 스테고사우르스 2023. 1. 7.

디지털회로에서는 연산을 할 때 Register에 값을 저장하곤 합니다.

 

오늘은 간단한 레지스터를 게이트로 나타내보고 verilog로 설계하려고 합니다.

 

 

4 bit 병렬 register입니다.

가운데에 있는 combinational 회로는 MUX와 유사하게 보아도 됩니다.

 

Load 신호에 따라 D0~3이 R0~3에 저장됩니다.

 

 


Verilog Code

4bit Register를 Verilog로 설계하였습니다.

Register를 memory처럼 사용하였습니다.

추후에 SRAM을 다룰 때 다시 한 번 다룰건데 미리 코드를 봐두시면 좋을 것 같아요.

Read와 Write로 memory에 값을 쓰거나 읽었습니다.

 

 

DUT

`timescale 1ns / 1ps

module register4b(
i_clk,
i_reset,
i_rw,
i_data,
o_data
    );
    
input             i_clk;
input             i_reset;
input             i_rw;        //1:write   0:read
input       [3:0] i_data;
output reg  [3:0] o_data;

reg         [3:0] r_register;

always @ (posedge i_clk or negedge i_reset) begin
    if (!i_reset) begin
        r_register <= 4'b0;
    end
    else if (i_rw == 1'b1) begin
        r_register <= i_data;
    end
    else begin
        r_register <= r_register;
    end
end

always @ (posedge i_clk or negedge i_reset) begin
    if (!i_reset) begin
        o_data <= 4'b0;
    end
    else if (i_rw == 1'b0) begin
        o_data <= r_register;
    end
    else begin
        o_data <= o_data;
    end
end

endmodule

always block을 두 개로 나누어줬습니다.

이유는 합성을 할 때 always block에 따라 다른 block이 생기기 때문인데요,

다른 레지스터마다 블럭을 나누어 주는 것이 좋습니다.

가독성도 좋고요!

 

저는 r_register와 o_data에 값을 할당하는 구문을 다른 블럭에 작성하였습니다.

 

Write일 때는 i_data 값을 r_register에 써주었고,

Read일 때는 r_register에 쓰인 값을 o_data로 읽었습니다.

 

 

Testbench

`timescale 1ns / 1ps

module tb_register4b();

reg        i_clk;
reg        i_reset;
reg        i_rw;
reg  [3:0] i_data;
wire [3:0] o_data;

register4b reg4b ( .i_clk   (i_clk)    ,
                   .i_reset (i_reset)  ,
                   .i_rw    (i_rw)     ,
                   .i_data  (i_data)   ,
                   .o_data  (o_data)   );
                   
always #5 i_clk = ~i_clk;
initial begin
    i_clk = 1'b0; i_reset = 1'b1; i_rw = 1'b0;   #1
    i_reset = 1'b0;                              #1
    i_reset = 1'b1; i_rw = 1'b1;                 #10
    i_data = 4'b0101;                            #10
    i_rw = 1'b0; i_data = 4'b0;                  #20
    $finish;
end

endmodule

 

Simulation

5ns:  입력된 i_data를 r_register에 Write

15ns: 입력된 i_data를 r_register에 Write

25ns: o_data가 r_register에 저장된 값을 Read 

 

 


댓글