我目前正在使用从我学校获得的 FPGA 进行 Verilog HDL 项目(我正在运行 Quartus II 版本 10.1 和 11.0(我都尝试过))。我遇到了一个非常奇怪的错误,我一生都无法弄清楚。
我正在开发一个摩尔斯电码程序,它检测点和破折号,然后根据这个输入在十六进制显示器上输出适当的字母。HEX 显示效果很好,但我的 UserInput 模块似乎根本没有做任何事情!
module UserInput(Clock, reset, in, out);
input Clock, reset, in;
output reg [1:0] out;
wire [2:0] PS;
reg [2:0] NS;
parameter NONE = 2'b00, DOT = 2'b01, DASH = 2'b11; //For Output
parameter UP = 3'b000, SHORT0 = 3'b001, SHORT1 = 3'b010, UP_DOT = 3'b011, LONG = 3'b100, UP_DASH = 3'b101;
//Active High
always@(PS or in)
case (PS)
UP: if (in) NS = SHORT0;
else NS = UP;
SHORT0: if (in) NS = SHORT1;
else NS = UP_DOT;
SHORT1: if (in) NS = LONG;
else NS = UP_DOT;
UP_DOT: NS = UP;
LONG: if (in) NS = LONG;
else NS = UP_DASH;
UP_DASH: NS = UP;
default: NS = 3'bxxx;
endcase
always@(PS)
case (PS)
UP: out = NONE;
SHORT0: out = NONE;
SHORT1: out = NONE;
UP_DOT: out = DOT;
LONG: out = NONE;
UP_DASH: out = DASH;
default: out = 2'bxx;
endcase
D_FF dff0 (PS[0], NS[0], reset, Clock);
D_FF dff1 (PS[1], NS[1], reset, Clock);
D_FF dff2 (PS[2], NS[2], reset, Clock);
endmodule
module D_FF (q, d, reset, clk);
input d, reset, clk;
output reg q;
always@(posedge clk or posedge reset)
begin
if (reset) q = 0;
else q = d;
end
endmodule
模块的输入是 FPGA 上的一个 KEY。由 UserInput 模块表示的 FSM 在 t=0 时键处于“UP”状态。然后,如果有输入,它会经过 SHORT0 或 SHORT1,最后是 LONG。如果密钥在这些状态中的任何一个被释放,它们将进入其适当的中间 UP 状态并提供“DOT”或“DASH”的输出。
但是,当我将它连接到我的 FPGA 时,我什么也得不到。从我的测试来看,它似乎永远不会离开“UP”状态。甚至我的模拟也没有给我任何东西。其次,我尝试从不同的项目(我知道一个有效的)连接不同的 UserInput 模块,但仍然没有。我错过了 Verilog 的背景是否发生了什么?
这是仿真波形的图像:
DFf 0、1 和 2 是 PS 的位 0、1 和 2。我的模拟不允许显示 NS。