仕事をする前に posge clk を待っていますか?- どうやって
-
27-10-2019 - |
質問
module DoorControl( clk, data, open,addressOftheMemory, outp );
localparam Size_ofTheWord = 32;
input open;
input [16:0] addressOftheMemory;
input [Size_ofTheWord-1:0] data;
input clk ;
output reg outp;
reg [WordSize-1: 0] Memory [65535: 0];
always @ ( open ) // open is 1 or 0
if ( open )
// i
outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
endmodule
(i) でマークされた行は、outp を出力ポートに送信する前に posedge clk だけ待ちたいのですが、次のように試してみたところ、
if ( posedge clk )
エラーが発生します
while ( clk != 1 ) begin
end
ばかげた答え/シミュレーション出力が得られます。出力を送信する前に posedge clk を待機するには、その行に何を入力する必要がありますか?
解決
次のようにクロック エッジまで実行を遅らせることができます。
always @ ( open ) // open is 1 or 0
if ( open )
@(posedge clk) outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
それはあなたが望むことを達成するかもしれないし、達成しないかもしれません。合成不可能であり、 always
ブロックは実行中または一時停止中は再スケジュールされません。 open
クロック周期内に複数回切り替わる場合、そのコードはおそらく希望どおりに動作しないでしょう。
詳しい背景:null ステートメントを含む任意のステートメントに遅延/イベント制御を指定できます。(例えば。で @(posedge clk);
, 、セミコロンは null ステートメントです。) 実際、 always
構成は次のとおりです。
always_construct: いつも 声明
つまり魔法のようなものは何もないということです always @(open)
または always @(posedge clk)
, 、単にステートメントを導入し、イベント制御を指定しているだけです。遅延制御時(#
) がステートメントに付加されている場合、ステートメントの実行は将来の一定の時刻まで延期されます。イベント制御時(@
) がステートメントに付加されている場合、イベント条件が満たされるまでステートメントの実行は延期されます。
他のヒント
モデル化しようとしていることについてもう少し批判的に考えなければなりません。読み取り/書き込み操作を制御する「オープン」でメモリをモデル化しようとしているように見えます。
データの非同期執筆とデータの同期読み取り値があります。メモリアクセスの場合、完全な同期動作をする方が良いです。
always @(posedge clk) begin
if( open )
outp = Memory[addressOftheMemory];
else
Memory[addressOftheMemory] = data;
end