【发布时间】:2012-05-29 18:51:47
【问题描述】:
我目前正在使用从我学校获得的 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。
【问题讨论】:
-
当您说它在模拟中不起作用时,您是说您正在应用正确的复位、时钟和 in 刺激,但 DFF 从未改变?你能把测试台代码放上来吗?
-
是的,没错。不幸的是,我不知道如何编写测试台代码。我被教导使用 Altera 大学程序模拟器,它提供了一种更加图形化的方法。但是,当我使用 Altera UP 模拟器进行仿真并提供正确的复位、时钟和激励时,DFF 不会改变。
-
嗯,没有更多信息,我不知道该说什么。我认为你所拥有的应该可以工作,只要你没有混淆重置极性或其他东西。如果您正在调试 Wave,也许您可以在 Wave 不工作时显示相关信号(reset、clk、NS、PS、in)的屏幕截图?
-
我添加了模拟图像。我不知道这是否有帮助,但我收到一个严重警告“未满足时序要求”。这可能是罪魁祸首吗?如果是这样,我将如何解决这个问题?另外,感谢您花时间帮助我。我真的很感激。
-
您是否在模拟反注释网表?如果计时失败,那么您的模拟将无用。
标签: verilog hardware-interface