在下面提到的J-K Flip Flop的verilog代码中,我想用一些值初始化线型q和q_bar。例如:我在这里初始化q和q_bar为0.但是在输出中,q和q_bar没有关注(1'hx)值。那么如何用常量初始化线型?
module JK_FF(j,k,clk,q,q_bar) ;
input j,k,clk ;
output q , q_bar ;
wire s,r,w,z ;
assign w = q ;
assign z = q_bar ;
nand U1(s,j,clk,z) ;
nand U2(r,k,clk,w) ;
nand U3(q,s,z) ;
nand U4(q_bar,r,w) ;
endmodule
/* TEST BENCH */
module JK_FF_TB ;
reg j,k,clk ;
wire q , q_bar ;
assign q = 1'b0 ;
assign q_bar = 1'b0 ;
initial begin
clk = 1'b1 ;
end
JK_FF DUT(j,k,clk,q,q_bar) ;
initial
begin
j = 1'b0 ;
k = 1'b0 ;
#5
j = 1'b0 ;
k = 1'b1 ;
#5
j = 1'b1 ;
k = 1'b0 ;
#5
j = 1'b1 ;
k = 1'b1 ;
end
endmodule
答案 0 :(得分:1)
有几个问题需要解决。
Verilog中的状态与触发器值一样,通常保存在reg
类型中,其中值可以使用initial
初始化。然而,在由门制成的简单触发器中,只有导线,它们无法初始化。
具有交叉NAND门的设计将在硬件实现中在启动时产生稳定值,即使最初未定义导线1'bX
。您可以在电路中使用1'X
转换1'b0
或1'b1
转换q
和q_bar
,使用assign as:
assign w = q !== 1'b0; // 1'bX => 1
assign z = q_bar === 1'b1; // 1'bX => 0
然而,Verilog实现将给出竞争条件,因为如果模拟该设计,则时钟脉冲将总是太长而不能立即发生变化。这通常在模拟期间显示为无限次迭代,从而达到迭代限制并产生错误。
因此需要进行更多修改,您可以在此处找到一个很棒的教程:The JK Flip Flop