from palette import colorful_colors

[verilog] d-flipflop 구현 본문

EE 학부과목/verilog

[verilog] d-flipflop 구현

colorful-palette 2023. 3. 13. 14:40

ff.v 파일

//positive edge FF의 예시
module flipflop1 (d, clk, q);	

	input d, clk;
	output reg q;
	
	always @ (posedge clk)	//클럭이 rise edge일때 동작 
	begin					//always@(negedge clk)으로 적는다면 falling edge일때 동작
		q <= d;
	end
	
endmodule 

//posedge F/F, sync reset (reset signal 추가)
module flipflop2 (d, clk, rst, q);	

	input d, clk, rst;
	output reg q;
	
	always @ (posedge clk)	//클럭이 올라가는 순간에 변하겠다는 뜻
	begin
		if(!rst) begin	//reset이 0일때 if문 실행
			q = 0;
		end
		else begin	//위의 if문과 순서 바뀌면 안된다. rst이 우선순위가 먼저 되어야 하기 때문.
			q <= d;
		end
	end
	
endmodule 

//posedge F/F, async reset
//sync는 clock에 따라서 동작, async는 특정값 인가될때 값이 0또는 1이 된다.
module flipflop3 (d, clk, rst, q);

	input d, clk, rst;
	output reg q;
	
	always @ (posedge clk, negedge rst)	//()안에 한쪽을 edge로 받았으면 다른쪽도 edge로 받아야 한다는 뜻
	begin
		if(!rst) begin	//rst이 falling 할 때, reset이 0일때 실행한다는 뜻
			q = 0;
		end
		else begin
		q <= d;
		end
	end
	
endmodule 



//preset -> d와 상관없이 q는 1
//load -> 1이면 FF 동작, 0이면 q가 가지고 있던것 그대로 출력
//posedge F/F, sync(syncronal) preset

module flipflop4 (d, clk, prst, q);

	input d, clk, prst;
	output reg q;
	
	always @ (posedge clk)	//클럭이 올라가는 순간에 변하겠다는 뜻
	begin
		if(prst) begin
			q = 1;
		end
		else begin
		q <= d;
		end
	end
	
endmodule

 

 

 

ff_tb.v 파일

//testbench에서 테스트해보기.
`timescale 1ns/1ns
module ff_tb;

reg d, clk, rst;
wire q;


flipflop3 u1 (d, clk, rst, q);

initial begin
	d = 0; clk = 0; rst = 0;
	#6 rst = 1;
	
	#100 $finish;
end

always begin
	#4 clk = ~clk;
end

always begin
	#5 d = $random;
end



initial begin
	$dumpfile("output.vcd");
	$dumpvars(0);
end