디지털회로에서는 연산을 할 때 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
'Digital Design > 논리회로' 카테고리의 다른 글
[논리회로] Counter (Design with Verilog) (3) | 2023.01.06 |
---|---|
[논리회로] T Latch와 FlipFlop (1) | 2023.01.06 |
[논리회로] JK Latch와 FlipFlop (1) | 2023.01.06 |
[논리회로] D Latch와 FlipFlop (Design with Verilog) (1) | 2023.01.02 |
[논리회로] SR Latch와 FlipFlop (1) | 2023.01.02 |
댓글