ハードウェア記述言語による 論理回路設計とFPGAへの実装 2 ハードウェア記述言語による 論理回路設計とFPGAへの実装 2 SPP 2009.8.27 高知工業高校 高知大学理学部 本田理恵、三好康夫
内容 前回の補足 順序回路 実習1(先週の課題を完成) 実習2-自由課題ー 回路と使用されたロジックエレメントの確認 HDL文法 フリップフロップ カウンタ 実習1(先週の課題を完成) 実習2-自由課題ー
モジュール 構造 module モジュール名(ポートリスト); ポート宣言 ネット宣言 レジスタ宣言 パラメータ宣言 回路記述本体 assign function alwaysなど end module 内部でやりとりする信号
信号の種類 タイプ 説明 宣言文 入出力区別 ポート 入出力信号 input 信号,信号...; output 信号,信号...; inout 信号,信号...; 入力 出力 入出力 レジスタ 回路内部で、変化し、記憶される信号 reg 信号,信号; 内部の信号 ネット 回路内部の信号(変更されない) wire 信号,信号; 複数ビットの場合はビット幅をつけて宣言(1bitの場合は省略可能) reg [7:0] a; wide [15:8] b; 同じビット幅の信号のみ,で連ねて宣言できる。 同じ信号をポートとレジスタ、ポートとネットの両方で宣言することがある。 output [7:0] a; reg [7:0] a;
論理値と数値表現 コメント 論理値 0, 1, x, z x、不定値、z、ハイインピーダンス 数値 <ビット幅>’ <基数><数値> 基数 b,B 2進数 o,O 8進数 d,D 10進数 h,H 16進数 例 8’haa →10101010 例 1’b1 → 1 例 b1 → 0000000.....1 (32bit) ビット幅省略→32bit 基数省略→10進数 x,zは使えない。
演算子 算術演算 + 加算、プラス記号 - 減算、マイナス記号 * 乗算 / 割り算 % 剰余(あまり) 等号演算 == 等しい != 等しくない === 等しい(z,xも) !== 等しくない(z,xも) ビット演算 ~ NOT & AND | OR ^ XOR |~ XNOR 関係演算 < 小 <= 小または等しい > 大 >= 大または等しい
基本文 parameter 定数の代入 parameter パラメータ名 = 定数(式) assign 信号の値の継続的な代入 条件式が成立するとき式1を、 そうでないとき式2を信号に代入 always あるイベントが起こった時に処理する内容を記述 always @ (イベント式) 例 reg [7:0] sum always @ (a or b) sum <= a+b; (aの値かbの値が変化したとき sumにa+bを代入)
if 文による条件分岐 if 逐次的な条件分岐 begin if (条件式1) 文1 else if (条件式2) ←省略可能 文2 文1 else if (条件式2) ←省略可能 文2 else 文3 end case 複数への同時分岐 case (式) 値1: 文1; 値2: 文2; default: 文3; endcase
組み合わせ回路ーセレクター module sel(d0,d1,dout) input d0, d1; d0 output dout; assign dout= (sel==1’b1)? d1:d0; end module d0 dout d1 sel d0,d1,selが変化したとき module sel(d0,d1,dout) input d0, d1; output dout; always @(d1 or d0 or sel) begin if (sel==1’b1) dout<=d1; else dout<= d0; end end module module sel(d0,d1,dout) input d0, d1; output dout; begin if (sel==1’b1) dout<=d1; else dout<= d0 end endmodule × module 中にいきなりifを入れてはいけない(独特のルール)
順序回路 回路内に記憶素子を含んでいて、クロックと呼ばれる基準信号と入力によって出力がきまる回路 クロックという時間の概念存在する 基本論理素子と記憶素子で構成されている 順序回路の例としては、フリップフロップやカウンタなどがある
クロック信号 ディジタル回路において順序回路を動作させるための基準信号のことであり、一定の周期でH=>L=>H・・・・を繰り返す信号
補足:7セグメントLEDのデコード値 A[7:0] 16進数 0 1111 1100 FC 1 0110 0000 60 2 1101 1010 DA 3 1111 0010 F2 4 0110 0110 66 5 1011 0110 B6 6 1011 1110 BE 7 1110 0000 E0 A[7:0] 16進数 8 1111 1110 FE 9 1111 0110 F6 a 1110 1110 EE b 0011 1110 3E c 0001 1010 1A d 0111 1010 7A e 1001 1110 9E f 1000 1110 8E
フリップフロップ フリップフロップとは、シーソーの働きの意味。 回路の働きが文字通りシーソーの働きに似ている。 入力(D)の変化がクロック(CLK)の立ち上がり、又は 立下りにより出力(Q)に伝わる 通常、リセット(RESET)はクロック(CLK)とは非同期 リセット(RESET)は“L”時リセット
フリップフロップ–HDL記述- module test(a,b,clk,rst); input a; // 入力 posedge negedge module test(a,b,clk,rst); input a; // 入力 input clk; // クロック信号 input rst; //リセット信号 output b; // 出力 reg b; always @( posedge clk or negedge rst ) begin if (!rst) b <= 1‘b0; else b <= a; end endmodule clk a b rst クロックの立ち上がりかリセットの立ち下がりを検出したら以下の動作を行う
実機確認 作成済みのデスクトップにあるSPP/test/test.pofをダブルクリックしてプロジェクト開始 各信号は下記の表の通り割り当てられている 再コンパイルとプログラミングを行う クロック信号をそれぞれ610Hz、305Hz、1Hz、単発パルスにしたときのSW_A0の押し離しに対するLED1の反応を観察しなさい。 信号 信号名(HDL) 装置 ピン番号 入力 a SW_A0 2 出力 b LED1 47 リセット信号 rst RESET 240 クロック信号 clk SW27 28
参考:周波数の切り替え メモリ SW27 1 2 3 4 5 6 7 周波数 40 MHz 20 10 1.25 325 KHz 78.1 1 2 3 4 5 6 7 周波数 40 MHz 20 10 1.25 325 KHz 78.1 19.5 メモリ SW27 8 9 A B C D E F 周波数 9.8 KHz 4.9 244 1.22 610 Hz 305 1.0 ★ ★1クロックスイッチSW28を有効にする。 スイッチ押し下げごとに1つ単発のクロックを発生させる。 1Hz :1秒間に1回のクロック信号(1つのたち上がりとたち下がり) 周波数 周期 1MHz 1x10-6sec 1KHz 1x10-3sec 1Hz 1sec
カウンタ スイッチを押して10秒後に学籍番号を点灯 入力されるクロックは10MHzとする。 10MHz→1周期1E-7sec したら表示
カウンタ HDL記述は資料6を参考に
実習1 先週のメッセージを表示する課題を完成しなさい。 別途配布するプリントを埋めながら実施してください。 デスクトップの SPP/gakuseki/gakuseki.pofをダブルクリックして利用してください 別途配布するプリントを埋めながら実施してください。
実習2-自由課題ー 資料1の カウンタ(P73-) 、クロック(P75 -)、シフト回路(P78-)の説明に目を通して実装して動作確認を行いなさい。また、合成された回路のロジックエレメント数を答えてください。 デスクトップにある作成済みのプロジェクトを利用して構いません 練習8 カウンタ SPP/count/count.pof 練習9 クロック SPP/clk/clk.pof シフト回路 SPP/shift/clksegseg.pof どれか1つを選んで1か所でもよいので,自分なりに変更を加えてみてください。この際、資料6のHDL記述の説明をみながらその回路記述を理解して変更してください 例 シフト回路のメッセージを変える。左から右にシフトさせる。 クロックを3ケタにする。 カウンタの時間とメッセージを変える。 作業の過程を別紙(配布する)に記録してください。
参考 HDL独習ソフトで学ぶCQEndeavor Verilog HDL 小林、CQ出版 JFIT資料 個人でQuartus IIを使用してみたい人は、 http://www.altera.co.jp/products/software/quartus-ii/web-edition/qts-we-index.html またはGoogleで Quartus IIと入力