計算機工学特論A 第4回 論理合成 山越研究室 増山 知東 2007年11月7日 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 論理合成とは? • HDL言語で書かれたソースファイルを ゲート回路のような“素子”に変換し それらを組み合わせ、機能を向上させること。 • 但し、論理合成に不向きな言語仕様もある。 module 1 module 3 module 2 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 具体的な方法 • ソースファイルである .v ファイルから シンボルファイル(.bsf ファイル)を作成する File → Create/Update → Create Symbol Files for Current File を選択すると .v ファイルで作成した プログラムのシンボルファイルを作成できる。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 具体的な方法 • 作成したシンボルファイルを用いて .bdf ファイル上に回路図を書いていく。 入力端子、出力端子などは あらかじめ用意されている。 また、AND・OR等のゲート素子も 登録されている。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 具体的な方法 • .vwf ファイルを作成してシミュレーションを行う。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- フル・アダー呼び出しによる加算回路の論理合 成 接続線の太さはデータのビット数が1bit か、それより大きなもので区別する。 このビット数による差を設定しないと、コンパイルすらできない。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- シミュレーション結果 出力 q の項を見ると‘X’という不定形が出力されている。 接続の不良か、設定の不備か期待していた結果は得られなかった。 論理合成せずにHDL記述で実行した、フル・アダー呼び出しによる 4bit 加算回路 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- フル・アダーの論理合成結果 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- シミュレーション結果 A : L,H,L,H・・・・と交互に繰り返す CIN : 常に H B : H,L,H,L・・・・と交互に繰り返す Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 第2章 もう少し進んだVerilog HDL記述 2.1 電子サイコロ 修士1年 赤津 実幸 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 電子サイコロの構造 カウンターが1~6の値でループしており、 enableを0にした瞬間のカウンター値をサイコロの目で表現するmodule reset enable ck reset リセット。1の目を表示して停止 lamp[0] lamp[1] lamp[2] lamp[3] lamp[4] lamp[5] lamp[6] enable 1で回転 0で停止 ck 電子サイコロのブロック図 クロック ランプ lamp[0~6] lamp[4] 1 : ランプ点灯 lamp[1] lamp[5] 0 : ランプ消灯 lamp[2] lamp[6] に対応 lamp[0] サイコロの目 3の場合 lamp[0] lamp[4] lamp[1] lamp[5] lamp[2] lamp[6] lamp[3] lamp[3] 対応表示ランプ Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 電子サイコロの各処理の説明 input ck, reset, enable if (reset = 1) カウンタ値cntを1に設定 Counter イベント pogedge ck or posedge reset else if (enable = 1) if(カウンタ値cnt = 3) reg [2:0] cnt 3bitレジスタ cntを1に設定 else デコーダ cntを1インクリメント 入力 cnt 出力 lamp ※ reset = 1ならcnt=1なので lamp[3]のみ1になり サイコロの目は1を表示 output [6:0] lamp Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 電子サイコロの各処理の説明 input ck, reset, enable functionを用いたデコーダ function [6:0] dec 7bitのデータを出力 Counter input [2:0] din イベント pogedge ck or posedge reset C言語でいう仮引数。 3bitの変数をdinに代入 reg [2:0] cnt 3bitレジスタ デコーダ function dec 入力 3bit cnt 出力 7bit lamp Case文によるdinの値での場合わけ din = 1 dec = 7b’0001000 din = 2 dec = 7b’1000001 din = 3 dec =7b’0011100 din = 4 dec=7b’1010101 din = 5 dec=7b’1110111 din = 6 dec=7b’1110111 din = その他 dec=不定値 lamp = dec( cnt ) output [6:0] lamp Yamakoshi-Lab. functionのリターン値 関数decに3bitカウンタ値cntを入れると7bitの lampに7bitのdecの値が代入される。 -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 出力結果1 クロック周期 clk 50ns, 20MHz(=1/50ns) reset(1→0)タイミング 200ns enable(0→1)タイミング 800ns サイコロの目 1 2 3 4 5 6 1 2 3 4 5 6 1 ひげが立ち上がってしまう。1→2、3→4のタイミング こうなると、一瞬だけサイコロの値が変化してしまうところができてしまう。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 出力結果2 問題の検証 カウンタcntと出力lampの出力タイミングが ほぼ同時 データの立ち上がり、 立ち下りのタイミングが重なるので 出力値が不安定になっている可能性がある Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善1 不定値を0化 カウンタcntが変化する不安定な 区間はlampを0にする default = 7’bxxxxxxxを変更 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善1 変更後 変更前 変更後 サイコロの目 1 → 2 になるタイミングは改善された Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善1 変更後 3→4のタイミングの検証 0 1 1 3 ZOOM 6 5 1 0 0 4 6 カウンタ一瞬で値が変わるのではなく、bitが全て変化するのに時間がかかる。 lamp = dec(cnt)によりカウンタcntの変化に応じて出力lampも変化してしまう。 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善2 デコーダ処理 問題点 ・カウンタには値が完全に変化するまで時間がかかる ⇒その間のカウンタcntの値は不定値 ・カウンタcntの変化にすぐに応じてデコーダdecが処理して 出力lampに吐き出してしまう そこで ・カウンタcntが完全に変化したあとにデコーダdecで処理させて やればよ い ⇒デコーダに処理のタイミングを与える ⇒カウンタはクロックの立ち上がりで処理するので 半クロック後にはカウンタの変化は終了しているので 半クロック後に1回デコーダ処理を行わせる ⇒イベントalways文を用いる always@(negedge ck) Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善2 変更後 クロックの立下り時にのみ処理を行う デコーダを作成 カウンタ変化後半クロック遅れて lamp出力される Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- module saikoro 改善2 比較 変更前 変更後 デコーダにカウンタを読み込むタイミング(半クロック遅延)が与えられたため カウンタの不定値範囲を読み込まなくなった Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 計算機工学特論A テキスト内容 2.2 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2 電子錠 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.1 電子錠の仕様 入力 7 4 8 5 9 6 1 2 0 クローズ Yamakoshi-Lab. クロック(50Hz程 度) リセット テン・キー 出力 ck reset 10 3 クローズ・キー クロック lock 錠出力 tenkey [9:0] close -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.2 電子錠の回路概要 ck =3 =6 =9 =5 R CK Q S EN tenkey エ ン コ ー ダ D Q CK RES EN D Q CK RES EN D Q CK RES EN D Q CK RES ck close Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- lock 2.2.3 電子錠のHDL記述 リスト2.3 module elelock(ck,reset,tenkey,close,lock); input ck,reset,close; input [9:0] tenkey; output lock; reg lock,ke1,ke2; reg [3:0] key [0:3];//レジスタ配列 wire match, key_enbl; parameter SECRET_3=4‘h5,SECRET_2 = 4’h9,SECRET_1 = 4‘h6,SECRET_0 = 4’h3;//定数 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 レジスタ配列 reg [x1:x2] 名前 [y1:y2]; 多次元配列の一種。x1-x2+1bitをひとつの単位としてみなした一次元配列。要 素数はy2-y1+1個。全体のサイズは(x1-x2+1)×(y2-y1+1)bit。アクセスはx1x2+1bitを単位としてのみ可能で1bit単位ではアクセスできない。 ex) reg [7:0] u_byte [0:3]; //1byte(8bit)のu_byte[0]~[3]が宣言される u_byte[1] = 8’hff; Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 定数 parameter 名前 = 実態(数値); 数値等を使うところで代わりにparameterで定義した名前を使うことができる。 ex) parameter aka = 24’hff0000; reg [23:0] tmp; tmp = aka; とするとtmpに24‘hff0000が代入される Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 リスト2.3 暗証番号入力レジスタ always @(posedge ck or posedge reset) begin if (reset = = 1'b1) begin key[3] <=4‘b1111;key[2] <=4’b1111; リセット信号が来たらそれま key[1] <=4‘b1111;key[0] <=4’b1111; でに入力された番号を消す。 end else if(close= =1'b1)begin key[3] <=4'b1111;key[2] <=4'b1111; クローズ信号が来たらそれま key[1] <=4'b1111;key[0] <=4'b1111; でに入力された番号を消す。 end else if (key_enbl= =1'b1) begin キー入力が来たら値を更新 key[3] <= key[2];key[2] <= key[1]; する key[1] <= key[0];key[0] <= keyenc(tenkey); end 入力されたキーから保持す end べき値を返す関数 Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 リスト2.3 テンキー入力チャッタ取り用 always @(posedge ck or posedge reset) begin if(reset==1'b1) begin ke2 <= 1'b0; リセット信号が来たらキーが押されてない状態として ke1 <= 1'b0; 暗証番号入力レジスタに通知する end else begin 1クロック前に押されてたキーの状態をke2に保 ke2 <= ke1; ke1 <= |tenkey; 存し今キーが押されているかを取得する。 end end Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 リスト2.3 電子錠出力 always @(posedge ck or posedge reset) begin if (reset==1'b1) リセット信号が来たらロックを解除する lock <= 1'b0; else if (close==1'b1) lock <= 1'b1; else if (match==1'b1) lock <= 1'b0; クローズ信号が来たらロックする 暗証番号が一致したらロックを解除する end Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 リスト2.3 テンキー入力エンコーダ function [3:0] keyenc; input [9:0] sw; case (sw) 10'b00000_00001: keyenc = 4'h0; 10'b00000_00010: keyenc = 4'h1; 10'b00000_00100: keyenc = 4'h2; 10'b00000_01000: keyenc = 4'h3; 10'b00000_10000: keyenc = 4'h4; 10'b00001_00000: keyenc = 4'h5; 10'b00010_00000: keyenc = 4'h6; 10'b00100_00000: keyenc = 4'h7; 10'b01000_00000: keyenc = 4'h8; 10'b10000_00000: keyenc = 4'h9; endcase endfunction Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.3 電子錠のHDL記述 リスト2.3 暗証番号一致信号 assign match = (key[0]==SECRET_0) && (key[1]==SECRET_1) && (key[2]==SECRET_2) && (key[3]==SECRET_3); 設定されている暗証番号と入力信号が一致すれば1を出力する assign key_enbl = ~ke2 & ke1; ~はnotを表している。 endmodule Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.4 電子錠のシミュレーション Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan- 2.2.4 電子錠のシミュレーション Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
© Copyright 2025 ExpyDoc