如何在 verilog 中用常量初始化电线?
How to initialize a wire with constant in verilog ?
在下面提到的 J-K Flip Flop 的 verilog 代码中,我想用一些值初始化线类型 q 和 q_bar。例如:我在这里用 0 初始化 q 和 q_bar。但是在输出中,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
有几个问题需要解决。
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
在下面提到的 J-K Flip Flop 的 verilog 代码中,我想用一些值初始化线类型 q 和 q_bar。例如:我在这里用 0 初始化 q 和 q_bar。但是在输出中,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
有几个问题需要解决。
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