山本/春のプロジェクト2009/第6回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[山本/春のプロジェクト2009]]
*第6回 スタックの設計 [#wc551c96]
#contents
**式の表し方 [#rac3427f]
:中置記法|数学やプログラミング言語などで用いられる表記法で、演算子は2つのオペランドの間に書かれる。
1 + 2 * 4 - 3
(1 + 2) * (4 -3)
:後置記法|演算子が2つのオペランドの後に書かれる。CPUでそのまま計算できる。~
上の式を後置記法で表すと下記のようになる
1 2 4 * + 3 -
1 2 + 4 3 - *
**スタックの設計 [#xbb8d57a]
データ構造の1つで、LIFO(Last In First Out)のメモリ
-push と pop
:push|スタックにデータを入れる
:pop|スタックからデータを取り出す
-16ビットの4つのレジスタでスタックを構成する
:入力|
--d[15:0]
:出力|
--qtop[15:0] 1つ目のレジスタの保持する値を出力~
--qnext[15:0] 2つ目のレジスタの保持する値を出力
-4つの動作
:load|1つ目のレジスタに値を入れる
:push|それぞれのデータが下のレジスタに1つ移動
:pop|それぞれのデータが上のレジスタに1つ移動
:load & push|それぞれのデータが下のレジスタに1つ移動するとともに1つ目のレジスタに値が入る
**スタックのverilog記述 [#sbc6fa3a]
-各always文
>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];
>2つ目のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[1] <= 0;
else if( push ) q[1] <= q[0];
else if( pop ) q[1] <= q[2];
>3つ目のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[2] <= 0;
else if( push ) q[2] <= q[1];
else if( pop ) q[2] <= q[3];
>最後のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[3] <= 0;
else if( push ) q[3] <= q[2];
-拡張
--最初と最後以外は同じような処理をしているので一般化する
---リセットするときはレジスタに'0'を代入
---プッシュは前のレジスタの値を代入
---ポップは次のレジスタの値を代入
integer i; //整数を定義
always @( posedge clk or negedge reset )
for( i = 1; 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];
**演算スタックの設計 [#p86208b4]
-入力
--clk
--reset
--num
--op
--x[15:0]
-ALUとスタックをインスタンス化して使用
終了行:
[[山本/春のプロジェクト2009]]
*第6回 スタックの設計 [#wc551c96]
#contents
**式の表し方 [#rac3427f]
:中置記法|数学やプログラミング言語などで用いられる表記法で、演算子は2つのオペランドの間に書かれる。
1 + 2 * 4 - 3
(1 + 2) * (4 -3)
:後置記法|演算子が2つのオペランドの後に書かれる。CPUでそのまま計算できる。~
上の式を後置記法で表すと下記のようになる
1 2 4 * + 3 -
1 2 + 4 3 - *
**スタックの設計 [#xbb8d57a]
データ構造の1つで、LIFO(Last In First Out)のメモリ
-push と pop
:push|スタックにデータを入れる
:pop|スタックからデータを取り出す
-16ビットの4つのレジスタでスタックを構成する
:入力|
--d[15:0]
:出力|
--qtop[15:0] 1つ目のレジスタの保持する値を出力~
--qnext[15:0] 2つ目のレジスタの保持する値を出力
-4つの動作
:load|1つ目のレジスタに値を入れる
:push|それぞれのデータが下のレジスタに1つ移動
:pop|それぞれのデータが上のレジスタに1つ移動
:load & push|それぞれのデータが下のレジスタに1つ移動するとともに1つ目のレジスタに値が入る
**スタックのverilog記述 [#sbc6fa3a]
-各always文
>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];
>2つ目のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[1] <= 0;
else if( push ) q[1] <= q[0];
else if( pop ) q[1] <= q[2];
>3つ目のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[2] <= 0;
else if( push ) q[2] <= q[1];
else if( pop ) q[2] <= q[3];
>最後のレジスタの処理
always @( posedge clk or negedge reset )
if( !reset ) q[3] <= 0;
else if( push ) q[3] <= q[2];
-拡張
--最初と最後以外は同じような処理をしているので一般化する
---リセットするときはレジスタに'0'を代入
---プッシュは前のレジスタの値を代入
---ポップは次のレジスタの値を代入
integer i; //整数を定義
always @( posedge clk or negedge reset )
for( i = 1; 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];
**演算スタックの設計 [#p86208b4]
-入力
--clk
--reset
--num
--op
--x[15:0]
-ALUとスタックをインスタンス化して使用
ページ名: