トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

stackf.v

スタック

パラメータ

パラメータ名 既定値  
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<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秒