1
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を送信する前に、ポーズclkだけ待機したいのですが、;のように試した場合。

if ( posedge clk )

エラーが発生します

while ( clk != 1 ) begin

end 

それはabsurb回答/シミュレーション出力を提供します。 出力を送信する前にposedgeclkを待つために、その行に何を置く必要がありますか?

4

2 に答える 2

3

何をモデル化しようとしているのかについて、もう少し批判的に考える必要があります。読み取り/書き込み操作を制御する「オープン」でメモリをモデル化しようとしているようです。

データの非同期書き込みとデータの同期読み取りがあります。メモリ アクセスの場合は、完全な同期動作を行う方が適切です。

always @(posedge clk) begin
if( open )
    outp = Memory[addressOftheMemory];
else
    Memory[addressOftheMemory] = data;
end
于 2011-05-02T17:57:25.627 に答える
1

次のように、クロック エッジまで実行を遅らせることができます。

always @ ( open )  // open is 1 or 0 
  if ( open  )
     @(posedge clk) outp = Memory[addressOftheMemory];
  else if ( !open )    
     Memory[addressOftheMemory] = data;

それはあなたが望むものを達成するかもしれないし、しないかもしれません。合成可能ではなく、always実行中または中断中にブロックが再スケジュールされることはないためopen、1 クロック周期で複数回トグルすると、そのコードはおそらく意図したとおりに実行されません。

詳細な背景: null ステートメントを含む任意のステートメントで遅延/イベント制御を指定できます。(例:@(posedge clk);では、セミコロンは null ステートメントです。) 実際、構文の構文定義は次のとおりalwaysです。

always_construct: alwaysステートメント

always @(open)orについて魔法のようなものは何もないことを意味しalways @(posedge clk)、ステートメントを導入してイベント制御を指定しているだけです。ステートメントに遅延制御 ( #) が付加されている場合、ステートメントの実行は将来の一定時間まで延期されます。イベント制御 ( @) がステートメントに関連付けられている場合、ステートメントの実行は、イベント条件が満たされるまで延期されます。

于 2011-05-02T06:25:20.827 に答える