• 検索結果がありません。

if clear = 1 then Q <= " "; elsif we = 1 then Q <= D; end rtl; regs.vhdl clk 0 1 rst clear we Write Enable we 1 we 0 if clk 1 Q if rst =

N/A
N/A
Protected

Academic year: 2021

シェア "if clear = 1 then Q <= " "; elsif we = 1 then Q <= D; end rtl; regs.vhdl clk 0 1 rst clear we Write Enable we 1 we 0 if clk 1 Q if rst ="

Copied!
15
0
0

読み込み中.... (全文を見る)

全文

(1)

VHDL

を用いたディジタル回路設計(

2

1

目的

「VHDLを用いたディジタル回路設計(1)」では組合せ回路をVHDLで記述し,FPGAボー ドでその動作を確認した.その実験に引き続き,今回は順序回路の代表であるカウンタをVHDL で記述し,その動作を確認する.また,加算を繰り返し行う回路を作成して,論理回路の基本的 な構造を理解する.

2

順序回路と

HDL

記述

この実験で用いる組合せ回路と順序回路について,VHDLでそれらを記述する方法について 解説する.

2.1

レジスタ

最も基本的な順序回路はフリップフロップである.Dフリップフロップとは,クロック信号に 同期して,1ビットの値を保持できる記憶素子である. デジタル回路では,多ビットの値を記憶しながら計算を行わなければならない.一般にプロ セッサの内部などで,多ビットの値を保持するための記録素子をレジスタという.以下にその記 述例を示す. regs.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity regs is port ( clk, rst : in std_logic; clear : in std_logic; we : in std_logic; D : in std_logic_vector(7 downto 0); Q : out std_logic_vector(7 downto 0)); end regs; architecture rtl of regs is begin process (clk, rst) begin if rst = ’0’ then Q <= "00000000";

(2)

if clear = ’1’ then Q <= "00000000"; elsif we = ’1’ then Q <= D; end if; end if; end process; end rtl; regs.vhdl clkはクロック信号であり,周期的に0と1の値を取る信号である.この信号に同期してレジ スタは記憶する値を変更する.rstとclearは,それぞれ非同期リセット信号,同期リセット信 号と呼ばれる.非同期リセットとは,クロック信号と関係なく,レジスタの値を0にするための 信号である.例えば回路の状態を強制的に初期状態に戻したいときに利用される.同期リセット とは,クロック信号に同期してレジスタの値を0にする.したがって,回路の正常な動作として 0に戻したい場合に用いる.入力we(Write Enableの略)はレジスタへの書き込みを制御する 信号であり,weが1のときのみ現在のレジスタの値を上書きされる.weが0のときは,それま でのレジスタで保持された値は変化しない. クロック信号の立ち上がりに同期して動作する回路を記述する際に使われるのが以下のif文 である.これにより「clkが変化し,かつその値が1になったときに,Q値を変化させる」とい う動作を記述できる. if rst = ’0’ then -- リセットする際の動作を記述する Q <= "0000";

elsif clk’event and clk = ’1’ then -- ここにレジスタの動作を記述する end if; 上記のレジスタの記述では,rstが最も優先順位が高い信号であり,続いてclear,weの順 になっていることに注意する.

2.2

レジスタファイル

通常,プロセッサには複数のレジスタが使われている.そのレジスタを集めたものをレジスタ ファイルという.ここでは,4ビットのレジスタを8個集めたレジスタファイルを実装する.こ のレジスタファイルは,以下を満たすものとする. • 4ビットレジスタが8本ある 入力としてクロック信号clkと,we(1ビット),adr(3ビット),D(4ビット)を持つ. 出力として,Q(4ビット)を持つ. クロックの立ち上がりで,weが1ならば,adr番(0≤ adr ≤ 7)のレジスタに,入力D を書き込む. • adr番のレジスタの値をQに出力する

(3)

regfile.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity regfile is port ( clk : in std_logic; we : in std_logic;

adr : in std_logic_vector(2 downto 0); D : in std_logic_vector(3 downto 0); Q : out std_logic_vector(3 downto 0)); end entity regfile;

architecture behv of regfile is

type ramtype is array (0 to 7) of std_logic_vector(3 downto 0); signal mem : ramtype;

begin

Q <= mem(conv_integer(adr)); process (clk) is

begin

if clk’event and clk = ’1’ then if we = ’1’ then

mem(conv_integer(adr)) <= D; end if;

end if; end process;

end architecture behv;

regfile.vhdl

このVHDLの記述では,配列(array)を用いている.このような記述で,4ビットのデータ が8個並んだ配列の型ramtypeを定義できる.その後に,ramtype型の変数memが宣言する.

配列の添字には,この場合0から7の整数でアクセスできる(mem(0)やmem(3)など).ただ,

配列の番号adrは3ビットのstd logic vector型なので,それを整数に変換しなければなら

ない.VHDLでは,それを行う関数conv integer()が定義されている.

2.3

カウンタ

入力としてクロック信号を持ち,入力されたクロックパルスの数を決められた順序でカウント する順序回路をカウンタという.特に0からn− 1までの2進数で順にカウントするとき,n進 カウンタと呼ばれる.

(4)

例として10進カウンタのVHDL記述を示す.この回路count10は,clkの他に入力rstを 持つ.rstは通常1であるが,この信号が0になると,カウンタの出力が0にリセットされる. VHDLの規則では,出力信号(この場合はQ)の値を変化させる記述をすることができない (エラーになる).そこで,ここでは局所変数Qregを宣言し,その値を出力Qへつなぐように記 述している. count10.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count10 is port ( clk, rst : in std_logic;

Q : out std_logic_vector(3 downto 0)); end count10;

architecture rtl of count10 is

signal Qreg : std_logic_vector(3 downto 0); begin Q <= Qreg; process (clk, rst) begin if rst = ’0’ then Qreg <= "0000";

elsif clk’event and clk = ’1’ then if Qreg = "1001" then Qreg <= "0000"; else Qreg <= Qreg + 1; end if; end if; end process; end rtl; count10.vhdl 「clkの立ち上がりでレジスタQregの値を1増やす」という動作は,以下のif文で記述で きる.

if clk’event and clk = ’1’ then Qreg <= Qreg + 1;

(5)

2.4

ダウンカウンタ

カウンタの一種として,ダウンカウンタという回路を考える.これは次のような回路である. 入力として,クロック信号clk,正整数n(4ビット),load(1ビット),count(1ビッ ト)を持つ.制御信号(1ビット).図2では,点線で表されている. 出力として,Q(4ビット),zero(1ビット)を持つ. このカウンタは,クロック信号が入力されるときに,以下のような動作をする. • loadが1ならば,nの値をカウント値にセットする. • loadが0であり,かつcountが1ならば,カウント値を1減らす. • loadとcountが共に0ならば,カウント値は変化しない. また,現在のカウント値はQに出力され,現在のカウント値が0ならzeroが1になる. downcounter.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity downcounter is port ( clk : in std_logic; n : in std_logic_vector(3 downto 0); load : in std_logic; count : in std_logic;

Q : out std_logic_vector(3 downto 0); zero : out std_logic);

end entity downcounter;

architecture behv of downcounter is

signal Qreg : std_logic_vector(3 downto 0); begin -- Output Q <= Qreg; -- Down counter process (clk) is begin

if clk’event and clk = ’1’ then if load = ’1’ then

Qreg <= n;

(6)

Qreg <= Qreg - 1; end if; end if; end process; -- zero process (Qreg) is begin if Qreg = "0000" then zero <= ’1’; else zero <= ’0’; end if; end process;

end architecture behv;

downcounter.vhdl

3

簡単な計算をする論理回路の設計と実装

メモリを持つ論理回路の例として,「整数nを入力し,1からnまでの和を計算する」という 簡単な論理回路を設計する. まず,計算のイメージとして,以下のような擬似コードを考える. summation 1: sum = 0 2: INPUT n 3: while (n >= 0) 4: { 5: sum = sum + n 6: n = n - 1 7: } 8: OUTPUT sum summation この計算を,ハードウェア(論理回路)で実装する.一般に,論理回路はデータを処理する回 路であるデータパスと,データパスを流れるデータの流れを制御する制御回路から構成される. この回路では,「入力nを受け取り,その値を1ずつ減らしながら和を計算することを繰り返す」 部分がデータパスの役割であり,「nが入力されたら計算を開始し,nが0になったら計算を止 める」といったことを決定するのが制御回路の役割である. データパスから送られる情報から,制御回路は次に行う計算のための制御信号を計算し,デー タパスへ送る.今回作成する回路での,データパスと制御回路の入出力を図示すると,図1のよ うになる.

(7)

図1 1からnまでの和を計算する回路の全体図

3.1

データパス

データパスの回路図を,図2に示す.この回路図ではクロック信号とリセット信号は省略して いる. 図2 データパスの回路図 データパスの入出力を以下に示す.入力は以下の7個の信号である. • clk,rst:クロック信号,リセット信号(1ビット).

• load, count, clear, sumload:制御信号(1ビット).図2では,点線で表されている.

• n:正整数(4ビット). 出力は,以下の3個の信号である.

(8)

• sum:1からnまでの和(8ビット). • cnt:現在のカウント値(4ビット). • zero:現在のカウント値が0かどうかを示す出力(1ビット). データパスの回路の構造と動作について,以下に示す. 1. 2.4節で説明した4ビットダウンカウンタと,計算した和の値を保持する8ビットレジス タSreg,8ビット加算器を持つ. 2. クロック信号が立ち上がったときに,制御信号loadが1のとき,入力nの値がダウンカ ウンタに読み込まれる. 3. loadが0であり,かつ制御信号countが1のとき,ダウンカウンタからの出力が1ずつ 減る. 4. クロック信号が立ち上がったときに,制御信号clearが1ならばレジスタSregが0にリ セットされる. 5. クロック信号が立ち上がったときに,制御信号sumloadが1ならば,レジスタSregの内 容が加算器からの出力に書き換えられる. 6. 出力sumは,現在のSregの値を出力する. 7. 出力cvalは,ダウンカウンタの値を出力する. 8. 出力zeroは,ダウンカウンタの値が0のとき1,それ以外のとき0になる. 図2の回路図をもとに,データパスを記述したものを示す*1 datapath.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity datapath is port ( clk : in std_logic; rst : in std_logic; load : in std_logic; count : in std_logic; clear : in std_logic; sumload : in std_logic; n : in std_logic_vector(3 downto 0); sum : out std_logic_vector(7 downto 0); cval : out std_logic_vector(3 downto 0); zero : out std_logic);

end datapath;

architecture rtl of datapath is

*1回路図からVHDLを記述するコツ:信号線に名前を付けて,信号線と回路の部品(コンポーネント)の接続を一 つ一つ書いていく.図2の信号線に,その線の名前を書くようにしてみよう.

(9)

component regs is port ( clk, rst : in std_logic; clear : in std_logic; we : in std_logic; D : in std_logic_vector(7 downto 0); Q : out std_logic_vector(7 downto 0)); end component regs;

component downcounter is port ( clk : in std_logic; n : in std_logic_vector(3 downto 0); load : in std_logic; count : in std_logic;

Q : out std_logic_vector(3 downto 0); zero : out std_logic);

end component downcounter; -- 8-bits register

signal Sreg : std_logic_vector(7 downto 0); -- lines

signal addout : std_logic_vector(7 downto 0); signal cnt : std_logic_vector(3 downto 0); begin

DCN0 : downcounter port map ( clk => clk, n => n, load => load, count => count, Q => cnt, zero => zero); -- Output sum <= Sreg; cval <= cnt; -- Sreg

(10)

SUMREG : regs port map ( clk => clk, rst => rst, clear => clear, we => sumload, D => addout, Q => Sreg); -- Adder process (cnt, Sreg) is begin

addout <= ("0000" & cnt) + Sreg; end process;

end architecture rtl;

datapath.vhdl

3.2

制御回路

続いて,制御回路を作成する.先ほど作成したデータパスには,クロック信号とリセット信号 の他に,4個の制御信号load, count, clear, sumloadがあった.計算の状況に応じて,これら

の制御信号に適切な値を与えることができれば,データパス内を流れる値を制御し,正しく計算 を行うことができる.

制御回路は,有限状態機械(Finite State Machine,FSM)を使って記述されることが多い. ここでも,その方法で制御回路を作成する. 有限状態機械は,状態の集合と,状態遷移のルール,そして出力によって定義される.今回 作成する制御回路と対応する有限状態機械を,図3と表1に示す.この制御回路は入力として start(1ビット)とzero(1ビット)を持つ.図3において,丸は状態を表し,矢印は入力の 値によってどの状態へ遷移するかを表す.各状態の下には,前述した擬似コードのどの部分と対 応するのかが書いてある.また,各状態における出力は,表1にまとめられる. 図3 制御回路の有限状態機械 この有限状態機械をVHDLで記述した例を以下のcontroller.vhdlに示す.有限状態機械 のVHDL記述は,大きく分けて三つの部分に分かれる. 1. 現在の状態をレジスタ(state)に保持することを記述する部分.

(11)

表1 各状態での出力

状態 load count clear sumload done

s0 0 0 1 0 0 s1 1 0 1 0 0 s2 0 0 1 0 0 s3 0 0 0 1 0 s4 0 1 0 0 0 s5 0 0 0 0 1

2. 現在の状態(state)と入力(start,zero)から,次の状態を計算する部分 3. 現在の状態(state)から,出力を計算する部分 このそれぞれをprocess文で記述することで,回路を構成することができる. このcontroller.vhdlでは,6個の状態s0からs5に対して,3ビットの定数を割り当てて いる(constantの部分).この割り当て方は一例であり,各状態にどのようなバイナリ列を割り 当てるかどうかによって,回路が変化する. controller.vhdl library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity controller is port ( clk : in std_logic; rst : in std_logic; start : in std_logic; zero : in std_logic;

cur : out std_logic_vector(2 downto 0); load : out std_logic;

count : out std_logic; clear : out std_logic; sumload : out std_logic; done : out std_logic); end entity controller;

architecture behv of controller is

signal state : std_logic_vector(2 downto 0); signal next_state : std_logic_vector(2 downto 0); -- state

(12)

constant s1 : std_logic_vector(2 downto 0) := "001"; constant s2 : std_logic_vector(2 downto 0) := "010"; constant s3 : std_logic_vector(2 downto 0) := "011"; constant s4 : std_logic_vector(2 downto 0) := "100"; constant s5 : std_logic_vector(2 downto 0) := "101"; constant UNKNOWN : std_logic_vector(2 downto 0) := "XXX"; begin -- output cur <= state; -- Register process (clk, rst) is begin if rst = ’0’ then state <= s0;

elsif clk’event and clk = ’1’ then state <= next_state;

end if; end process;

-- calclate next_state

process (start, state, zero) is begin

case state is

when s0 => if start = ’1’ then next_state <= s1; else

next_state <= s0; end if;

-- 以下自分で考えてみよう

when others => next_state <= UNKNOWN; end case;

end process;

-- output from controller process (state) is begin load <= ’0’; count <= ’0’; sumload <= ’0’; clear <= ’0’;

(13)

done <= ’0’; case state is

when s0 => clear <= ’1’; -- 以下自分で考えてみよう when others => null; end case;

end process;

end architecture behv;

controller.vhdl

4

実験

開発ツールQuartus IIと FPGAボードDE1を使って,VHDLによる論理回路の記述と,

FPGAでの実装を行う.

4.1

レジスタの実装

レジスタregs.vhdlをVHDLで記述し,その動作をDE1上で確認せよ.

4.2

レジスタファイルの実装

レジスタファイルregfile.vhdlをVHDLで記述し,その動作をDE1上で確認せよ.

4.3

ダウンカウンタの実装

ダウンカウンタdowncounter.vhdlをVHDLで記述し,その動作をDE1上で確認せよ.

4.4

データパスの実装

データパスdatapath.vhdlを記述し,その動作をDE1上で確認せよ.

4.5

制御回路の実装

制御回路controller.vhdlを記述し,その動作をDE1上で確認せよ.

4.6

和を計算する回路の実装

整数nを入力し,1からnまでの和を計算する回路summationを,データパス(datapath) と制御回路(controller)を組み合わせることで作成し,その動作をDE1上で確認せよ.作成 する回路のエンティティ宣言は,以下のようにすること.

(14)

summation.vhdl entity summation is port ( clk : in std_logic; rst : in std_logic; start : in std_logic; n : in std_logic_vector(3 downto 0); sum : out std_logic_vector(7 downto 0); cval : out std_logic_vector(3 downto 0); load : out std_logic;

done : out std_logic); end entity summation;

summation.vhdl それぞれの入出力信号は,以下の意味を持つ. • clk:クロック信号. • rst:非同期リセット信号. • start:計算を開始するための信号. • n:入力の整数. • sum:計算する和の値. • cval:回路内の現在のカウンタの値. • load:制御回路から出力されるloadの値.整数nを入力するタイミングを示す. • done:制御回路から出力されるdoneの値.計算の終了を示す.

5

レポートについて

作成したVHDLのソースファイルは,各自持ち帰ってレポートとして提出する.ソースファ イルの先頭に,コメント行で自分の班,学籍番号,氏名,ファイル名を入れて印刷すること. 1. この実験で取り扱った回路についての解説をレポートに書くこと. 2. ツールの使い方やピン配置などについて,レポートで触れる必要はない. 【課題】有限状態機械の状態を符号化する方法として,バイナリ符号やワンホット符号といった 方法がよく使われる.どのような方法なのかを調べること.今回の実験で用いた方法は,どのよ うな方法なのか?

実験のページ

実験で利用したウェブページのURLは以下の通りである. http://www.mais.cs.gunma-u.ac.jp/Lecture/

(15)

参考文献

[1] 柴山潔,コンピュータサイエンスで学ぶ論理回路とその設計,近代科学社,1999.

[2] 長谷川裕恭,VHDLによるハードウェア設計入門,CQ出版社,1995.

[3] 南谷崇,論理回路の基礎,サイエンス社,2009.

[4] Altera University Program,

http://www.altera.com/education/univ/unv-index.html.

[5] E.O. Hwang, Digital Logic and Microprocessor Design with VHDL, Thomson, Canada, 2006.

参照

関連したドキュメント

They proved that if Y is a (real or complex) rearrangement-invariant nonatomic function space on [0, 1] isometric to L p [0, 1] for some 1 ≤ p &lt; ∞ then the isometric isomorphism

We list in Table 1 examples of elliptic curves with minimal discriminant achieving growth to each possible torsion group over Q

If the interval [0, 1] can be mapped continuously onto the square [0, 1] 2 , then after partitioning [0, 1] into 2 n+m congruent subintervals and [0, 1] 2 into 2 n+m congruent

If we support L-space conjecture, then we can expect any non-trivial Dehn surgery on “most” knots yields a 3-manifold whose π 1 = LO.. A slope r is said to be left-orderable (LO) if π

This fact prompted us to introduce a ``local counterpart'' of the notion of a symmetric plane: A Lie triple plane is a topological a½ne translation plane …M; M† whose point space M

Then pass into the next column which is the (q + 1)th column, put 1 at the second row of this column and repeat the process until we have only p − 2 rows for going down (then we

If we assign to each rook diagram d the n × n, 0-1 matrix having a 1 in row i and column j if and only if the ith vertex in the top row of d is connected to the j th vertex in

全国の宿泊旅行実施者を抽出することに加え、性・年代別の宿泊旅行実施率を知るために実施した。