Powered by SmartDoc

電卓設計演習

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

演習の前に,本演習のファイルを格納するディレクトリを作成する.

% cd
% mkdir binshifttop

本演習で使用するファイルはすべて, binshifttop内に作成または,コピーする.

演習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と,function文により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を表示する.

Quartusを用いたbinshifttopの論理合成と配置配線

  1. Quartus IIを立ち上げる. (図[Quartus起動後の画面])最初に, 図[New Project]のウィンドウが表示されるので, "Yes"を選択する.間違って, Noを選択してしまった場合は, File→New Project Wizardを実行する.
    % cd ~/binshifttop
    % quartus
    
  2. Project Wizardウィンドウ(図[Project Wizard 1])が表示されるので, Nextボタンを押す. Project Wizardが表示されない場合は, FileメニューからProject Wizardを実行する.
  3. Working Directoryを, "./", What is the name of projectに, "binshifttop", What is the name of top-level entryに, "binshifttop"と入力してNextを押す.
  4. binshifttop.v, binshiftreg.v, other.vをFile Nameとして指定して, Finishボタンを押す.間違って途中で, Finishを押してしまった場合は, Project→Add/Remove Files in Projectを実行して,すべてのファイルを指定する.
  5. Select Familyのウィンドウが表示されたら, Cycloneを選択する.
    Select Family
  6. binshifttop.tclをダウンロードして, binshifttop/以下に置く.
  7. Tools->Tcl Scriptsを実行し, Project内にあるbinshifttop.tclを選択して, Runボタンを押す.これにより, FPGAデバイスの設定とボードに対応したピンのアサインが行なわれる.
  8. 紫の矢印(Start Compilation)を押す.

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版テストフィクスチャ
verilog/enzantop.tcl
TCLスクリプト

シミュレーションの方法

     % 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版テストフィクスチャ
verilog/calctop.tcl
tclスクリプト

シミュレーションの方法

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