|
ポート名 |
既定値 |
|
入力 |
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<N-1;i=i+1)
if(!reset) q[i] <= 0;
else if(push) q[i] <= q[i-1];
else if(pop) q[i] <= q[i+1];
always @(posedge clk or negedge reset)
if(!reset) q[N-1] <= 0;
else if(push) q[N-1] <= q[N-2];
endmodule
最終更新時間:2007年08月01日 12時33分09秒