私は現在、学校から入手したFPGAを使用してVerilog HDLでプロジェクトに取り組んでいます(Quartus IIバージョン10.1および11.0を実行しています(両方を試しました))。非常に奇妙なバグが発生しているので、一生理解できません。
ドットとダッシュを検出し、この入力に基づいて適切な文字をHEXディスプレイに出力するモールス信号プログラムを開発しています。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を表示できません。