D-latch들이 모여서 D-FlipFlop을 이루고, D-Flipflop이 모여서 register가 됩니다.
D-latch
clk의 값이 1일때 non blocking으로 d의 값에 변화를 줬습니다.
module _dlatch(clk,d,q,q_bar);
input clk;
input d;
output q, q_bar;
reg q;
always @(clk or d) begin
if(clk==1) q<=d;
end
assign q_bar=~q;
endmodule
D-FlipFlop
clock의 rising edge에서만 D값이 출력이되도록 기존의 Dlatch가 d값에 always가되는게 clk와 or를 사용했습니다.
module _dff(clk, d, q, q_bar); //D Flip-Flop module
input clk, d;//clock and input data
output q, q_bar;//output
wire clk_bar, w_q;
_inv U0_inv(.a(clk), .y(clk_bar));//instance inverter
_dlatch U1_dlatch(.clk(clk_bar), .d(d), .q(w_q));//instatnce dlatch
_dlatch U2_dlatch(.clk(clk), .d(w_q), .q(q), .q_bar(q_bar));//instance dlatch
endmodule
D-FlipFlop with reset
module _dff_r(clk,reset_n,d,q);//resettable D flipflop module
input clk,reset_n,d;//reset, clock, d
output q;
wire w_d;
_and2 U0_and2(.a(d), .b(reset_n), .y(w_d));//instance 2inputandgate
_dff U1_dff(.clk(clk), .d(w_d), .q(q));//instance D flipflop
endmodule
D-FlipFlop with enable
D flip flop 앞에 1bit Multiplexer를 추가하여 입력값의 사용 여부를 결정합니다.
module _dff_en(clk, en,d,q);//module enabled D flipflop
input clk,en,d;
output q;
wire w_d;
mx2 U0_mx2( .y(w_d), .d0(q), .d1(d), .s(en));//instance 2input mux
_dff U1_dff (.clk(clk), .d(w_d), .q(q));//instance d flipflop
endmodule
D-FlipFlop with set, reset
Or gate의 입력으로 D와 set이 들어가게 되고 나오는 출력 과 ~reset으로 and gate의 입력으로 사용 후, D Flip Flop을 사용하게 설계했습니다.
module _dff_rs(clk, set_n, reset_n, d, q);//Set/Resettable D Flip-Flop module
input clk, set_n, reset_n, d;//clock set reset inputdata
output q;
wire w_d1, w_d2;//wire
_or2 U0_or2(.a(d), .b(~set_n), .y(w_d1));//instance 2input or gate
_and2 U1_and2(.a(w_d1), .b(reset_n), .y(w_d2));//instance 2input and gate
_dff U2_dff(.clk(clk), .d(w_d2), .q(q));//instance D flip flop
endmodule
8bit register => 8개 D-FlipFlop
32bit register => 4개 8bit register
module _register8(clk, d,q);//8bits register module
input clk;//clock
input [7:0] d;//8bits input
output [7:0] q;//8bits output
_dff U0_dff (.clk(clk), .d(d[0]), .q(q[0]));//instance D flipflop
_dff U1_dff (.clk(clk), .d(d[1]), .q(q[1]));//instance D flipflop
_dff U2_dff (.clk(clk), .d(d[2]), .q(q[2]));//instance D flipflop
_dff U3_dff (.clk(clk), .d(d[3]), .q(q[3]));//instance D flipflop
_dff U4_dff (.clk(clk), .d(d[4]), .q(q[4]));//instance D flipflop
_dff U5_dff (.clk(clk), .d(d[5]), .q(q[5]));//instance D flipflop
_dff U6_dff (.clk(clk), .d(d[6]), .q(q[6]));//instance D flipflop
_dff U7_dff (.clk(clk), .d(d[7]), .q(q[7]));//instance D flipflop
endmodule
module _register32(clk,d,q);//32bits register module
input clk;//clock
input [31:0] d;//32bits input d
output [31:0] q;//32bits input q
_register8 U0_register8 (.clk(clk), .d(d[7:0]), .q(q[7:0]));//instance 8bits register
_register8 U1_register8 (.clk(clk), .d(d[15:8]), .q(q[15:8]));//instance 8bits register
_register8 U2_register8 (.clk(clk), .d(d[23:16]), .q(q[23:16]));//instance 8bits register
_register8 U3_register8 (.clk(clk), .d(d[31:24]), .q(q[31:24]));//instance 8bits register
endmodule
synchronous? asynchronous?
먼저 always 문을 사용하여 클럭의 경우에따라 if 문을 통해서 Q의 값을 지정해 주는 방 식으로 구현되었습니다. synchronous는 상승엣지일때 clk에 따라서만 연산이 진행이 되지 만, asynchronous flip flop은 clk에 따라서 연산이 진행되지만 set값과 reset값에 따라서 출력이 다르게 되게 설계했습니다.
D-FlipFlop with set, reset, synchronous
module _dff_rs_sync(clk, set_n,reset_n,d,q);//_reset/set able synchronize D flip flop module
input clk,set_n,reset_n,d;//clock set reset data
output q;//output
reg q;
always@(posedge clk)//rising edge
begin
if(reset_n==0) q<=1'b0;//reset=0->q<=1'b0
else if(set_n==0) q<=1'b1;//set=0->q<=1'b1
else q<=d;//reset!=0&&set!=0 -> q<=d
end
endmodule
D-FlipFlop with set, reset, asynchronous
module _dff_rs_async(clk, set_n, reset_n, d,q);//_reset/set able asynchronize D flip flop module
input clk,set_n,reset_n,d;//clock set reset data
output q;//output
reg q;
always@(posedge clk or negedge set_n or negedge reset_n)//rising clkedge || negedege set || negedge reset
begin
if(reset_n==0) q<=1'b0;//reset=0-> q<=1'b0
else if(set_n==0) q<=1'b1;//set=0 -> q<=1'b1
else q<=d;//reset!=0&&set!=0 -> q<=d
end
endmodule
D-FlipFlop with set, reset, asynchronous, synchronous
module _dff_rs_sync_async(clk, set_n,reset_n,d,q_sync,q_async);//reset/set able synchronize/asynchronize D flip flop module
input clk,set_n,reset_n,d;//clock set reset data
output q_sync, q_async;//result synchronize and asynchronoize
_dff_rs_sync U0_dff_rs_sync(.clk(clk), .set_n(set_n), .reset_n(reset_n), .d(d), .q(q_sync));//instance //_reset/set able synchronize D flip flop module
_dff_rs_async U1_dff_rs_async(.clk(clk), .set_n(set_n), .reset_n(reset_n), .d(d), .q(q_async));//instance _reset/set able asynchronize D flip flop module
endmodule
ALU(Arithmetic Logic Unit) (0) | 2022.01.17 |
---|---|
blocking 과 non-blocking assignment의 차이 (0) | 2022.01.06 |
CLA(carry-look-ahead) (0) | 2022.01.05 |
RCA(Ripple Carry Adder) (0) | 2022.01.04 |
2-to-1 multiplexer 구현하기 (0) | 2022.01.03 |
댓글 영역