module container(x1, x2, x3, NUMBER);
input x1, x2, x3;
output NUMBER;
wire w0, w1;
dec_counter U1 (x1, x2, x3, w0, w1);
doz_counter U2 (w1, w0, NUMBER);
endmodule
module dec_counter(clk, reset, clk_enable, counter, terminal);
input clk;
input reset;
input clk_enable;
output reg [3:0] counter;
output reg terminal;
always @(posedge clk, posedge clk_enable, posedge reset)
if(reset)
begin
terminal <= 1;
counter <= 0;
end
else if(clk && clk_enable)
if(counter < 9)
begin
terminal <= 1;
counter <= counter + 1;
end
else
begin
terminal <= 1;
counter <= 0;
end
endmodule
module doz_counter(dozens, unity, number);
input dozens;
input unity;
output reg [7:0] number;
initial begin
number = 8'd0;
end
always @(posedge dozens)
if(dozens)
number <= number + 1;
endmodule
您好!我是verilog的新手,我有第一个问题。我有模块dec_counter,从0到9计数。当它到达9 + 1时它显示0并将“输出终端”设置为1.现在我想将该值传递给我的下一个模块doz_counter作为“输入数十”。我已尝试接线,你可以在模块容器中看到,但在我的模拟中,数十个总是X,即使终端是1。
我觉得我犯了一些关键的设计错误。
答案 0 :(得分:2)
您发布的代码正常。有关端口连接规则,请参阅下图。输出端口可以是reg
或wire
中的任何一个,但输入端口始终为wire
。
几个错误列举如下:
您已将reg [3:0] counter;
模块中的 4位端口,dec_counter
连接到单位端口,w0
位于{ {1}}模块。这将导致端口连接宽度不匹配。
container
同样,wire [3:0] w0;
wire w1;
// ...
模块中的单比特端口 NUMBER
已连接到{{1}中的 8位端口 container
模块。这将导致端口连接宽度不匹配。
number
此外,重置时doz_counter
的值可能为零。 output [7:0] NUMBER;
//...
- terminal
条件正在推动if
的相同值。它应该else
的不同值分别为terminal
和terminal
。
以下是您的代码的测试平台供参考:
terminal <= 1