!!!スタック !!パラメータ ,パラメータ名,既定値,  ,N,8,スタックの要素数 !!入出力ポート , ,ポート名,既定値,  ,入力,clk,1,グローバルクロック ,入力,reset,1,グローバルリセット ,入力,load,1,1のときclkの立ち上がりでスタックトップにdの値を書き込み ,入力,push,1,1のときclkの立ち上がりでスタックをプッシュ ,入力,pop,1,1のときclkの立ち上がりでスタックをポップ ,入力,thru,1,1のときthruをqtopに出力 ,入力,d,16,スタックトップに書き込む値 ,入力,dthru,16,thruが1のときdthruをqtopに出力 ,出力,qtop,16,thruが1のときdthru,0のときスタックトップの値 ,出力,qnext,16,スタックの2番目の値 PUSH命令(メモリから読み出したデータをスタックにプッシュ)を1クロックサイクルで実行するために,thruとdthruを導入. メモリから読み出すのに1サイクル必要で,その読み出したデータをスタックトップに書き込むのにさらに1サイクル必要となる.そこでスタックに書き込むかわりに,メモリからの読み出しデータをdthruに入力し,それをスタックトップqtopの値とする.つまり,フリップフロップq[0]に書かれているスタックトップの値をスルーして,メモリの出力をスタックトップqtopとして出力する. !!ソースコード module stack(clk, reset, load, push, pop, thru, d, dthru, qtop, qnext); parameter N = 8; input clk, reset, load, push, pop, thru; input [15:0] d, dthru; output [15:0] qtop, qnext; reg [15:0] q [0:N-1]; assign qtop = (thru ? dthru : q[0]); assign qnext = q[1]; always @(posedge clk or negedge reset) if(!reset) q[0] <= 0; else if(load) q[0] <= d; else if(pop) q[0] <= q[1]; else q[0] <= qtop; always @(posedge clk or negedge reset) if(!reset) q[1] <= 0; else if(push) q[1] <= qtop; else if(pop) q[1] <= q[2]; integer i; always @(posedge clk or negedge reset) for(i=2;i