順序回路の設計

琉球大学情報工学科 和田 知久


順序回路の復習

ラッチとフリップフロップ(FF)


ラッチの定義

CLKがHighの時に、入力Dは出力Qへインバータ2段で接続され、
CLKがLowの時に、インバータ2段がリング接続になり、値を保持する。


フリップフロップ(FF)の定義


フリップフロップ(FF)の動作波形

シンボル 名称 意味
tC サイクルタイム 動作する周期、スペックでは最小値が規定される。
tS セットアップタイム クロックエッジに対するデータを用意する時間、スペックでは最小値が規定される。
tH ホールドタイム クロックエッジに対してデータを保持する時間、スペックでは最小値が規定される。
tKQ アクセスタイム クロックエッジからデータ出力までの時間、スペックでは最大値が規定される。

例題4−1

OUT <=[ { (IN + 1) *2 + 1 } *2 + 1 ] *2

=>1組の加算器と乗算器を繰り返し使用すればよい。さてどのように?


順序回路での構成

サイクルNo. 動作
X <= (IN + 1) * 2
Y <= (X + 1) * 2
OUT <= (Y + 1) * 2


動作

ということで、フリップフロップで順序回路が構成できる。


VHDLで記述すると

addmul.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.all, IEEE.NUMERIC_STD.all;

entity ADDMUL is
port (Input : in unsigned (7 downto 0);
    GetInput : in std_logic;
    Clk : in std_logic;
    Output : out unsigned (7 downto 0) );
end entity ADDMUL;

architecture RTL of ADDMUL is
  signal Q : unsigned (7 downto 0);
begin
process(Clk)
  variable A : unsigned (7 downto 0);
  begin
    if rising_edge(Clk) then
        ----------
        -- MUX
        ----------
        MUX: if (GetInput = '1') then
            A := Input;
        else A := Q;
        end if MUX;
        ----------
        -- ADD1 & MUL2
        ----------
        Q <= Shift_left((A + 1),1);
    end if;
  end process;

  Output <= Q;
end architecture RTL;


VHDLにおけるフリップフロップ(FF)の生成方法

Clock'event and Clock= '1' 'eventアトリビュートを用いた立ち上りエッジの検出
Clock'event and Clock= '0' 'eventアトリビュートを用いた立ち下りエッジの検出
not Clock'stable and Clock = '1' 'stableアトリビュートを用いた立ち上りエッジの検出
not Clock'stable and Clock = '0' 'stableアトリビュートを用いた立ち下りエッジの検出
rising_edge(Clock) ファンクションコールを用いた立ち上りエッジの検出
falling_edge(Clock) ファンクションコールを用いた立ち下がりエッジの検出

関数rising_edge, falling_edgeは'X'から'1'への変化を検知しない。


DFFの記述方法1

 

P1: process (Clock)
begin
  if ( Clock'event and Clock= '1') then
    Y1 <= A1;
  end if;

  if ( Clock'event and Clock= '1') then
    Y2 <= A2;
  end if;
end process P1;

 


DFFの記述方法2

 

P2: process
begin
  wait until (Clock'event and Clock= '1');
    Y3 <= A3;
end process P2;

 


DFFの記述方法3

 

P3: process (Clock)
begin
  if rising_edge(Clock) then
    Y4 <= A4;
  end if;
end process P3;

 

 


DFFの記述方法4

 

P4: process
begin
  wait until rising_edge(Clock);
    Y5 <= A5;
end process P4:

 


同期回路の意味


クイズ1

1)3人の学生A,B,Cさんはそれぞれ以下の仕事をするとする

A: 紙に書かれた数字を見て、その数字に1を加えたもの計算し、紙に答えを書く

B: 紙に書かれた数字を見て、その数字を2倍したもの計算し、紙に答えを書く

C: 紙に書かれた数字を見て、その数字を5倍し、それから3を引き算したもの計算し、紙に答えを書く

最初、Aさん、Bさん、Cさんにそれぞれ、「1」、「2」、「3」と書かれた紙を渡す。

そして、A,B,Cさんはすぐに自分の仕事をする。

先生の「ハイ!」という合図で、AさんはBさんに紙を渡し、BさんはCさんに紙を渡し、CさんはAさんに紙を渡すとする。

先生が「ハイ!」と5回言った後に、Aさん、Bさん、Cさんの紙の数字はそれぞれ幾らか?

 

2) 以下の波形をそれぞれ、DラッチとDフリップフロップに入力した時の波形を描け

以上