带脉冲计数器的Verilog状态机

时间:2017-04-29 23:39:51

标签: verilog

嘿伙计们,所以我编写了两个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

1 个答案:

答案 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 linkthis link找到。

注意:分配时,Array索引必须在索引范围内才能溢出。