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 |
在编写模块时,设计人员最好确保所有端口都必须从模块驱动。可能会故意遗漏一些连接,但必须连接主要端口。
这里的线
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 模块的一些基本信息可以在这个链接和这个链接中找到。
注意:赋值时,数组索引必须在索引范围内才不会溢出。