带脉冲计数器的 Verilog 状态机

Verilog State Machine with Pulse Counter

大家好,所以我写了两个 Verilog 模块,一个是状态机,另一个是计数器,它每半秒产生一个脉冲供机器计数。我试图做一个顶层设计来实例化这两个模块,但是,在运行测试台时,我的状态输出将始终等于"xx"。请问有什么建议或帮助吗?

计数器/脉冲:

1
2
3
4
5
6
7
8
9
10
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

状态机:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

顶级水平:

1
2
3
4
5
6
7
8
9
10
11
12
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

在编写模块时,设计人员最好确保所有端口都必须从模块驱动。可能会故意遗漏一些连接,但必须连接主要端口。

这里的线 y 连接为 pulseit 模块的输出 pulse。但是输出 pulse 永远不会被驱动。 pulseit 模块只是增加 count 并且它也依赖于 pulse 信号。此外,FSM 模块完全取决于它作为输入获得的 pulse 信号。

pulse 需要由 pulseit 模块内部的一些逻辑驱动。我修改了 pulseit 模块如下,现在它工作正常:

1
2
3
4
5
6
7
8
9
10
11
12
13
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;            

// Let's say pulse goes HIGH when 26th bit of count goes HIGH.
assign pulse = count[25]; // NEED TO DRIVE PULSE
endmodule

我在 EDAPlayground 上为上述设计创建了一个测试平台供您参考。关于 Verilog/SV 模块的一些基本信息可以在这个链接和这个链接中找到。

注意:赋值时,数组索引必须在索引范围内才不会溢出。