嘿伙计们,所以我编写了两个Verilog模块,一个是状态机,另一个是计数器,每半秒产生一个脉冲,供机器计数。我试图制作一个顶级设计,实例化两个模块,但是当运行测试台时,我的状态输出总是等于' xx'。有什么建议或帮助吗?
COUNTER / PULSE:
module pulseit(clk, reset, pulse);
input clk, reset;
output pulse;
reg [25:0] count;
wire pulse;
always @ (posedge clk, posedge reset)
if (reset) count <= 26'b0; else
if (pulse) count <= 26'b0; else
count <= count + 26'b1;
endmodule
国家机器:
module sm(clk, reset, in, state, pulse);
input clk, reset, in, pulse;
output [1:0] state;
reg [1:0] state, nstate;
always @ (posedge clk, posedge reset)
if (reset) state <= 2'b0;
else state <= nstate;
always @ (*)
begin
nstate = state;
if (pulse)
begin
case(state)
2'b00: nstate = (in)? 2'b01:2'b11;
2'b01: nstate = (in)? 2'b10:2'b00;
2'b10: nstate = (in)? 2'b11:2'b01;
2'b11: nstate = (in)? 2'b00:2'b10;
endcase
end
end
endmodule
TOPLEVEL:
module topLevel(clk, rst, in, state);
input clk, rst, in;
output [1:0] state;
reg [1:0] state;
wire y;
pulseit pull (.clk(clk), .reset(rst), .pulse(y));
sm machine (.clk(clk), .reset(rst), .in(in), .state(state), .pulse(y));
endmodule
答案 0 :(得分:1)
在编写模块时,设计人员最好确保所有端口必须从模块驱动。可能会有一些故意断开连接,但必须连接主要端口。
此处,导线var duplicates = diceValues
.GroupBy(i => i)
.Where(g => g.Count() == 3)
.Select(g => g.Key);
foreach (var d in duplicates)
{
Console.WriteLine("\n{0} Appeared three times --- 3 Points Awarded\n", d);
threepoints += 3;
}
连接为y
模块的输出pulse
。但输出pulseit
永远不会被驱动。 pulse
模块只增加pulseit
,这也取决于count
信号。此外, FSM模块完全取决于它作为输入获得的pulse
信号。
pulse
需要由pulse
模块中的某些逻辑驱动。我按如下方式修改了pulseit
模块,现在工作正常:
pulseit
我已在EDAPlayground为上述设计创建了一个测试平台供您参考。有关Verilog / SV模块的一些基本信息可以在this link和this link找到。
注意:分配时,Array索引必须在索引范围内才能溢出。