Powered by SmartDoc

電卓設計演習

5.3節 2桁のBCDを入力して内部で2進数で保存する回路の設計

演習5.1
binshiftregのmodule,endmodule,入出力ピン定義部分を記述せよ。
解答例
verilog/binshiftreg1.v
module binshiftreg(out,decimal,CLK,RST,CE);
 output [6:0] out;
 input [9:0] decimal;
 input CLK,RST,CE;
 // ↑ input, outputの定義はビット幅毎に
endmodule
演習5.2
10ビットの10キーからの入力を,4ビットの2進数に変換する組合わせ回路をassignと,unction文によりbinshiftreg内に記述せよ。ただし,function文dectobinをdに入力するものとする。
解答例
verilog/binshiftreg2.v
module binshiftreg(out,decimal,CLK,RST,CE);
 output [6:0] out;
 input [9:0] decimal;
 input CLK,RST,CE;
  wire [3:0] d; //← ビット幅が1以上の信号はwireで定義しておく. 
  assign d=dectobin(decimal); //← function dectobinの出力をdに入力
 function [3:0] dectobin; //← [3:0]は出力のビット幅を定義
   input [9:0] in;  //← function文の引数を定義
	if(in[9]) //← functionの中には自由にif, caseが書ける
		dectobin = 9;
	else if(in[8]) 
		dectobin = 8;
	else if(in[7])
		dectobin = 7;
//中略
	else if(in[0])
		dectobin = 0;
        //↑最後のelseがなくても組み合わせ回路になる
 endfunction
endmodule
演習5.3
10キーが押された回数を数えるcountと,入力値を格納するREGAを,alwaysブロックでbinshiftreg内に実現せよ。
演習5.4
出力ポートoutに対応するassign文を記述せよ.
解答例
verilog/binshiftreg.v
module binshiftreg(out,decimal,CLK,RST,CE);
 output [6:0] out;
 input [9:0] decimal;
 input CLK,RST,CE;
 wire [3:0] d;
 reg [1:0] count;
 reg [6:0] REGA;
  assign d=dectobin(decimal);
function [3:0] dectobin;
  input [9:0] in;
	if(in[9])
		dectobin = 9;
	else if(in[8])
		dectobin = 8;
	else if(in[7])
		dectobin = 7;
	else if(in[6])
		dectobin = 6;
	else if(in[5])
		dectobin = 5;
	else if(in[4])
		dectobin = 4;
	else if(in[3])
		dectobin = 3;
	else if(in[2])
		dectobin = 2;
	else if(in[1])
		dectobin = 1;
	else if(in[0])
		dectobin = 0;
endfunction
always @(posedge CLK or negedge RST)
  begin
    if(!RST)
      begin
	REGA<=0;
	count<=0;
      end
    else if((decimal != 0) && (count < 2))
      begin
	REGA<=(REGA*10)+d;
	count<=count+1;
      end
    else if(CE)
      begin
	REGA<=0;
	count<=0;
      end
    end
  assign out=REGA;
endmodule
   
演習5.5
6章を参考にして,同期化回路(syncro),2進数をBCDに変換しさらに7セグメントLEDへの出力信号を生成する回路(binled)の設計を行え。ただし時間のない場合ここはとばして解答のみダウンロードする.
解答例
verilog/other.v: syncro, ledout, bintobcdを含んだverilogファイル
module syncro(out,in,CLK,RST);
	parameter WIDTH = 1;
	input [WIDTH-1:0] in; 
	output [WIDTH-1:0] out;
	input CLK,RST;
	reg [ WIDTH-1:0] q0,q1,q2;
	always @(posedge CLK or negedge RST)
		begin
			if(!RST)
				q0<=0;
			else
				q0<=~in;
		end
	always @(posedge CLK or negedge RST)
		begin
			if(!RST)
				q1<=0;
			else
				q1<=q0;
		end
	always @(posedge CLK or negedge RST)
		begin
			if(!RST)
				q2<=0;
			else
				q2<=q1;
		end
	assign out=q1&(~q2);
endmodule
module binled(in,ledh,ledl);
  input [6:0] in;
  output [6:0] ledh,ledl;
  wire [3:0] outh,outl;
  bintobcd I0(.in(in),.outl(outl),.outh(outh));
  ledout I1(.in(outl),.out(ledl));
  ledout I2(.in(outh),.out(ledh));
endmodule
module bintobcd(in,outl,outh);
  input [6:0] in;
  output [3:0] outl,outh;
  wire [6:0] tmp1,tmp2,tmp3;
  assign outh[3] = (in>=80)   ? 1       : 0;
  assign tmp1    = (in>=80)   ? in-80   : in;
  assign outh[2] = (tmp1>=40) ? 1       : 0;
  assign tmp2    = (tmp1>=40) ? tmp1-40 : tmp1;
  assign outh[1] = (tmp2>=20) ? 1       : 0;
  assign tmp3    = (tmp2>=20) ? tmp2-20 : tmp2;
  assign outh[0] = (tmp3>=10) ? 1       : 0;
  assign outl    = (tmp3>=10) ? tmp3-10 : tmp3;
endmodule
`define SEG_OUT_0 7'b011_1111
`define SEG_OUT_1 7'b000_0110
`define SEG_OUT_2 7'b101_1011
`define SEG_OUT_3 7'b100_1111
`define SEG_OUT_4 7'b110_0110
`define SEG_OUT_5 7'b110_1101
`define SEG_OUT_6 7'b111_1101
`define SEG_OUT_7 7'b010_0111
`define SEG_OUT_8 7'b111_1111
`define SEG_OUT_9 7'b110_1111
`define SEG_OUT_ERR 7'b011_1001
module ledout(out,in);
 input [3:0] in;
 output [6:0] out;
  function [6:0] convert;
    input [3:0] in ;
     	case (in)
	  0:    convert = `SEG_OUT_0;
	  1:    convert = `SEG_OUT_1;
	  2:    convert = `SEG_OUT_2;
	  3:    convert = `SEG_OUT_3;
	  4:    convert = `SEG_OUT_4;
	  5:    convert = `SEG_OUT_5;
	  6:    convert = `SEG_OUT_6;
	  7:    convert = `SEG_OUT_7;
	  8:    convert = `SEG_OUT_8;
	  9:    convert = `SEG_OUT_9;
default:    convert = `SEG_OUT_ERR;
	//  If the above line is omitted, A warning messsage is shown in Synplify Pro
	endcase
endfunction
    assign out=convert(in);
endmodule
演習5.6
binshifttopを設計せよ。
verilog/skel/binshifttop.v
binshifttopひな型
verilog/binshifttop.v
binshifttop答え
verilog/binshiftsimgtk.v
GTK版テストフィクスチャ

シミュレーションの方法

電卓設計演習では,デバッグを用意にするために, X Window上に構築された仮想的な電卓のGUIを用いてシミュレーションを行う.シミュレーションを行うには,このGUIは, verilogシミュレータの持つPLI(Programming Language Interface)というC言語との接続インタフェースにより記述されている. GUIはダイナミックライブラリとして構築されており, verilog実行時に動的にライブラリが読み込まれシミュレーションが行われる. gtksim.shというコマンドの引数にすべてのVerilogファイルを与えることでシミュレーションが行われる. binshifttopのシミュレーションを行うには,下記の通りにUNIXのコマンドプロンプトに入力する.

     % gtksim.sh binshiftsimgtk.v binshifttop.v binshiftreg.v other.v

これにより,電卓を模したGUI(図[GUIを用いた電卓])が立ち上がる.

GUIを用いた電卓

Qにより,シミュレーションが終了する以外は,それぞれのボタンが,回路の入力ピンに対応している.ただし, binshifttopで有効なのは10キーとCEとRSTのみである. 7セグメントLED上部の小さなLEDは,最後の電卓用のoverflowを表示する.

FPGA CompilerIIを用いたbinshifttopの合成

ここでは, FPGA Compiler IIを用いたbinshifttopの合成の方法を述べる.なお,この先でFPGAに実装する, enzantop, calctopも全く同じように行えば良い.

  1. シミュレーションにより正常に動作することを確認しておく.
  2. FPGA Compiler IIが立ち上がっていない場合は,立ち上げる.
    % fc2
    
  3. File→New Projectを選択して,プロジェクトの名前(binshifttop)を入力する.入力した後は, Createのボタンを押す.
  4. Identify Sourcesというウインドウが出てくるので,必要なソースファイル(binshifttop.v, binshiftreg.v, other.v)を選択する.なお,複数のファイルを選択したいときは, Ctrlキーを押しながらマウスをクリックする.
  5. ウインドウの左側に,ソースが,表示される.最上位階層が含まれるソース(binshifttop.v)をダブルクリックすると, module名(binshifttop)が見える.
  6. module名のところ(binshifttopの部分)でマウスを右クリックし, Create Implementationを選択する.

    deviceは表[デバイスの指定]のように指定する.

    デバイスの指定
    Vendor Altera Device EPF10K40RC208
    Family FLEX10K Speed Grade -4
  7. 右側のChipsウィンドウに作成されたデバイス(binshifttop)および,それを最適化したもの(binshifttop-optimized)が表示される.
  8. 次に右のChipsウィンドウの上部のmodule(ここではbinshifttop)でマウスを右クリックして, Edit Constraintsを実行する. Portsのところを最前面に出して, Pad Locに,ピンの番号を入力して,入出力ピンを表[binshifttopのピン配置]に示す通りの位置に割り当てる.

    編集が終わったら, Edit Constraintsのウインドウを閉じること(アイコン化するのではなく完全に閉じる).閉じ方は, Windowsと全く同じである.

    binshifttopのピン配置
    ピン名 Pad Loc
    push[9:0] 83 85 86 87 88 89 90 92 93 94
    CE 73
    RST 180
    CLK 183
    ledl[6:0] 189 187 179 177 176 175 174
    ledh[6:0] 198 197 196 195 193 192 191
  9. ここで, binshifttop-Optimizedのチップアイコンに?マークが表示されていることを確認する. ?マークがない場合は, Edit Contstraintsのウィンドウがまだアイコン化されているか,開いているはずである.
  10. 次に,上記のピン配置にしたがって,再度論理合成を行う.以下のどちらかを実行する.

    うまく行くと, binshifttop-Optimizedのチップアイコンの?マークが消えるはずである.必ず消えていることを確認すること.

  11. ピンのアサインがうまくいっているかを,確かめるために, binshifttop-Optimizedの黄色いチップアイコンで右クリックして, View Resultsを実行する. Edit Constraintsと同様に, Portsのところを最前面に持ってきて, Edit Constraintsで入力したピンアサインが正しく反映されていることを確認せよ.ここで, Pad Locが空欄になっている場合は, Edit Contstraintsか, View Schematicのウィンドウがまだアイコン化されているか,開いているはずである.そのウィンドウを閉じて,もう一度Optimize ChipもしくはUpdate Chipを実行する.
  12. Optimizedの黄色いチップアイコンで右クリックして, Export Netlistを実行する. EDIFフォーマットで,ネットリストを出力する.

max+plus2を用いた配置配線とボードへのダウンロード

  1. max+plus2を立ち上げる.
    % max2win
    
  2. File→Project→Nameで,先ほどFPGA CompilerIIで作成したデザインの名前のディレクトリ(フォルダ)の``デザイン名.edf''というファイルを指定する.

    ここでは, binshifttop/binshifttop.edfを選択する.

  3. MAX+plus II→Compilerで,コンパイラウィンドウを開く.
  4. ProcessingメニューからFitter Settingを選んで実行する.

    ここで,もっとも上の``Use Quartus Fitter for FLEX 10K and ACEX 1K Devices''のチェックをはずれていることを確認する.

  5. Startボタンを押して,配置配線を行う.
  6. 節[ボードへのダウンロード]を参考にして,ボードにダウンロードする.

5.4節 演算回路

演習5.7 enzanをVerilog-HDLにより記述せよ
verilog/enzan_part1.v
moduleのみ
verilog/enzan_part2.v
+キーに対する動作の追加
verilog/enzan_part3.v
=キーに対する動作の追加
verilog/enzan_part4.v
出力outの論理
verilog/enzan.v
enzan.vの答え
演習5.8 enzantopの設計
verilog/skel/enzantop.v
enzantopひな型
verilog/enzantop.v
enzantop答え
verilog/enzansimgtk.v
GTK版テストフィクスチャ
表[enzantopのピン配置]
ピン配置
enzantopのピン配置
ピン名 Pad Loc
push[9:0] 83 85 86 87 88 89 90 92 93 94
CE 73
RST 180
CLK 183
plus 65
equal 70
ledl[6:0] 189 187 179 177 176 175 174
ledh[6:0] 198 197 196 195 193 192 191

シミュレーションの方法

     % gtksim.sh enzansimgtk.v enzantop.v enzan.v other.v

5.6節 電卓の設計

演習5.9負の数の取扱い
電卓の設計
演習5.10〜5.17
verilog/skel/calc.v
電卓ひな型
verilog/calc.v
電卓答え
verilog/calcsigned.v
電卓答え(signed版)
verilog/calctop.v
電卓最上位モジュール(calctop.v)答え
verilog/calcsimgtk.v
GTK版テストフィクスチャ
表[calctopのピン配置]
ピン配置
calctopのピン配置
ピン名 Pad Loc
push[9:0] 83 85 86 87 88 89 90 92 93 94
CE 73
RST 180
CLK 183
plus 65
minus 68
equal 70
ledl[6:0] 189 187 179 177 176 175 174
ledh[6:0] 198 197 196 195 193 192 191
sign 207
overflow 103

シミュレーションの方法

     % gtksim.sh calcsimgtk.v calctop.v calcsigned.v other.v