文章目录
- Verilog描述DFF
- 代码:
- 运行环境:
- 仿真图像:
- 对于always的用法:
“CK”为Flip-Flop(DFF)的时钟输入
Flip-Flop功能行为:在"CK"的上升沿把“D"端输入值锁存到”Q”端输出;
也有下降沿触发的DFF;
Verilog描述DFF
电路图:
代码:
module c_seq (
d ,
rstn ,
clk ,
q0 ,
q1 ,
q2
);
input wire d,rstn,clk;
output reg q0,q1,q2;//reg型变量除了描述寄存器还可以描述组合逻辑
//non-blocking assignment,非阻塞赋值
always @(posedge clk) //@括号里面为条件,上升沿
q0<=d;//当时钟为上升沿时执行
always @(posedge clk)
if (!rstn)
q1<=1'b0;//描述寄存器时用这种进行赋值
else
q1<=d;
always @(posedge clk or negedge rstn) //时钟的上升沿和rstn的下降沿
if (!rstn)
q2<=1'b0;
else
q2<=d;
endmodule
运行环境:
module tb_seq ();
reg clk,rstn;
reg d;
wire q0,q1,q2;//顶层的input能定义为wire型或者reg型,output只能定义为wire型
always #5.0 begin
clk=~clk;
end
initial begin
clk=0;rstn=1;
d=1;
#20;
#1;
rstn=0;
#30;
rstn=1;
#20;
d=0;
#20;
d=1;
//---reset again
#20;
rstn=0;
#20;
rstn=1;
#20;
$display("Info:sim end.");
$finish();
end
c_seq u_c_seq(
.d (d ),
.rstn (rstn ),
.clk (clk ),
.q0 (q0 ),
.q1 (q1 ),
.q2 (q2 )
);
endmodule
仿真图像:
对于always的用法:
如果描述的是组合逻辑就用“=”赋值,如果是寄存器就用“<=”赋值
例如:
reg y_mux2;
always @(sel or a or b)begin//这里的判定条件为电平,只要电平发生变化就会触发下列赋值
if(sel==1'b0)
y_mux2=a;//blocking assignment;阻塞赋值
else
y_mux2=b;
end