SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
ĐHBK Tp HCM–Khoa ĐĐT–BMĐT
Môn học: Kỹ thuật số
GVPT: Hồ Trung Mỹ
                       Bài tập giải sẵn về VHDL (AY1112-S1)
              (Các mã VHDL đã được chạy thử trên Altera MaxplusII v10.2)

1. Viết mã VHDL để đếm số bit 1 của số nhị phân 3 bit A với các cách sau:
      a) Dùng mô hình hành vi
      b) Dùng mô hình luồng dữ liệu
      c) Lệnh case-when
      d) Dùng mô hình cấu trúc
Bài giải.
      Với yêu cầu của đề bài, ta có được bảng chân trị sau:
                                   Ngõ vào          Ngõ ra
                                 A2 A1 A0          C1 C0
                                 0    0    0        0    0
                                 0    0    1        0    1
                                 0    1    0        0    1
                                 0    1    1        1    0
                                 1    0    0        0    1
                                 1    0    1        1    0
                                 1    1    0        1    0
                                 1    1    1        1    1

Phần đầu dùng thư viện IEEE và khai báo entity thì giống nhau cho các cách:
TD: Với khai báo của cách 1:

library ieee;
use ieee.std_logic_1164.all;

entity     ONES_CNT_EX1          is

port ( A    : in    std_logic_vector(2 downto 0);
       C    : out std_logic_vector(1 downto 0));
end   ONES_CNT_EX1;

  a) Mô hình hành vi:
architecture       Algorithmic   of ONES_CNT_EX1 is
begin
Process(A) -- Sensitivity List Contains only Vector A
     Variable num: INTEGER range 0 to 3;
     begin
          num :=0;
          For i       in  0 to 2

                            Các BT giải sẵn về VHDL 2011 – trang 1
Loop
                IF A(i) = '1' then
                     num := num+1;
                end if;
            end Loop;
--
--          Transfer "num" Variable Value to a SIGNAL
--
         CASE num is
             WHEN 0 =>           C   <=   "00";
             WHEN 1 =>           C   <=   "01";
             WHEN 2 =>           C   <=   "10";
             WHEN 3 =>           C   <=   "11";
         end CASE;
    end process;
end Algorithmic;

Dạng sóng mô phỏng hoạt động:




Chú ý:
     Có cách giải khác trong thí dụ của MaxplusII:
     -- MAX+plus II VHDL Example
     -- Combinatorial Process Statement
     -- Copyright (c) 1994 Altera Corporation

            ENTITY proc IS
                PORT
                (
                     d   : IN BIT_VECTOR (2 DOWNTO 0);
                     q   : OUT INTEGER RANGE 0 TO 3
                );
            END proc;

            ARCHITECTURE maxpld OF proc IS
            BEGIN
            -- count the number of bits with the value 1 in word d
                PROCESS (d)
                    VARIABLE num_bits : INTEGER;
                BEGIN

                            Các BT giải sẵn về VHDL 2011 – trang 2
num_bits := 0;

                      FOR i IN d'RANGE LOOP
                          IF d(i) = '1' THEN
                              num_bits := num_bits + 1;
                          END IF;
                      END LOOP;

                     q <= num_bits;
                 END PROCESS;

           END maxpld;

  b) Mô hình luồng dữ liệu
  architecture Two_Level of               ONES_CNT_EX2             is
  begin

        C(1) <= (A(1) and A(0)) or (A(2) and A(0))
                 or (A(2) and A(1));
        C(0) <= (A(2) and not A(1) and not A(0))
                  or (not A(2) and not A(1) and A(0))
                 or (A(2) and A(1) and A(0))
                 or (not A(2) and A(1) and not A(0));
  end Two_Level;

Dạng sóng mô phỏng hoạt động:




  c) Lệnh case-when
  Process(A) -- Sensitivity List Contains only Vector A
           begin
           CASE A is
                WHEN "000" => C <= "00";
                WHEN "001" => C <= "01";
                WHEN "010" => C <= "01";
                WHEN "011" => C <= "10";
                WHEN "100" => C <= "01";
                WHEN "101" => C <= "10";
                WHEN "110" => C <= "10";

                          Các BT giải sẵn về VHDL 2011 – trang 3
WHEN "111" => C <= "11";
             WHEN OTHERS => C <="ZZ";
        end CASE;
  end process;
  end Truth_Table;

  d) Dùng mô hình cấu trúc
  Có nhiều cách giải cho phần này.
  Từ bảng chân trị ta có biểu thức Boole cho các ngõ ra:
     C1 = A1A0 + A0A2 + A1A2 + A0A1A2
     C1 = A1A0 + A0A2 + A1A2 => cần AND 2 ngõ vào và OR 3 ngõ vào
  và
     C0 = A2’A1’A0 + A2’A1A0’ + A2A1’A0’ + A2A1A0
     C0 = ((A2’A1’A0)’.( A2’A1A0’)’ .(A2A1’A0’)’.(A2A1A0)’)’
              => Cần NAND 3 ngõ vào, NAND 4 ngõ vào và cổng NOT
  Mạch cho C1 được đặt tên là MAJ3 và mạch cho C0 được đặt tên là OPAR3.
  Từ đó có bài giải sau:
----------------- NOT gate -----------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY notgate IS PORT(
                                     i: IN STD_LOGIC;
                                     o: OUT STD_LOGIC);
END notgate;
ARCHITECTURE Dataflow OF notgate IS
BEGIN
     o <= NOT i;
END Dataflow;
----------------- 3-input NAND gate ---------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY nand3gate IS
PORT(
     i1, i2, i3: IN STD_LOGIC;
     o: OUT STD_LOGIC);
END nand3gate;
ARCHITECTURE Dataflow OF nand3gate IS
BEGIN
           o <= NOT(i1 AND i2 AND i3);
END Dataflow;

----------------- 4-input NAND gate ---------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY nand4gate IS

                          Các BT giải sẵn về VHDL 2011 – trang 4
PORT(
    i1, i2, i3, i4: IN STD_LOGIC;
    o: OUT STD_LOGIC);
END nand4gate;
ARCHITECTURE Dataflow OF nand4gate IS
BEGIN
         o <= NOT(i1 AND i2 AND i3 AND i4);
END Dataflow;

----------------- 2-input AND gate ---------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY and2gate IS
PORT(
    i1, i2: IN STD_LOGIC;
    o: OUT STD_LOGIC);
END and2gate;
ARCHITECTURE Dataflow OF and2gate IS
BEGIN
         o <= i1 AND i2;
END Dataflow;
----------------- 3-input OR gate ----------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY or3gate IS
PORT(
         i1, i2, i3: IN STD_LOGIC;
         o: OUT STD_LOGIC);
END or3gate;
ARCHITECTURE Dataflow OF or3gate IS
BEGIN
         o <= i1 OR i2 OR i3;
END Dataflow;

----------------- Majority of 3 bit number----------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity   MAJ3   is
     PORT(   X: in STD_LOGIC_VECTOR(2 downto 0);
             Z: out STD_LOGIC);
end MAJ3;
architecture   Structural_M    of  MAJ3   is
COMPONENT and2gate
    PORT( I1, I2: in STD_LOGIC; -- Declare Components
            O: out STD_LOGIC);    -- To Be Instantiated

                   Các BT giải sẵn về VHDL 2011 – trang 5
END COMPONENT;
COMPONENT or3gate
    PORT(I1, I2, I3: in STD_LOGIC;
            O: out STD_LOGIC);
END COMPONENT;
--
SIGNAL A1, A2, A3: STD_LOGIC;     -- Declare Maj3 Local Signals
begin
-- Instantiate Gates
    g1: and2gate PORT MAP (X(0), X(1), A1);
    g2: and2gate PORT MAP (X(0), X(2), A2);        -- Wiring of
    g3: and2gate PORT MAP (X(1), X(2), A3);        -- Maj3
    g4: or3gate PORT MAP (A1, A2, A3, Z);          -- Compts.
end Structural_M;
------------------OPAR3 Circuit------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity OPAR3 is
    PORT(    X: in STD_LOGIC_VECTOR(2 downto 0);
             Z: out STD_LOGIC);
end OPAR3;
architecture   Structural_O    of OPAR3    is
COMPONENT notgate
    PORT( i: in     STD_LOGIC;
           O: out STD_LOGIC);
END COMPONENT;
COMPONENT nand3gate
    PORT( I1, I2, I3: in STD_LOGIC;
           O: out STD_LOGIC);
END COMPONENT;
COMPONENT nand4gate
    PORT( I1, I2, I3, I4: in STD_LOGIC;
           O: out STD_LOGIC);
END COMPONENT;
--
    SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC;
begin
-- Instantiate Gates
    g1: notgate PORT MAP (X(0), A0B);
    g2: notgate PORT MAP (X(1), A1B);
    g3: notgate PORT MAP (X(2), A2B);
    g4: nand3gate PORT MAP (X(2), A1B, A0B, Z1);
    g5: nand3gate PORT MAP (X(0), A1B, A2B, Z2);
    g6: nand3gate PORT MAP (X(0), X(1), X(2), Z3);
    g7: nand3gate PORT MAP (X(1), A2B, A0B, Z4);

                   Các BT giải sẵn về VHDL 2011 – trang 6
g8: nand4gate PORT MAP (Z1, Z2, Z3, Z4, Z);
end Structural_O;

-----------------ONES_CNT_EX4: Main Circuit------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

entity ONES_CNT_EX4     is
port ( A     : in   STD_LOGIC_VECTOR(2 downto 0);
       C     : out STD_LOGIC_VECTOR(1 downto 0));
end   ONES_CNT_EX4;
architecture    Structural   of   ONES_CNT_EX4    is
COMPONENT MAJ3
    PORT( X: in STD_LOGIC_VECTOR(2 downto 0);
           Z: out STD_LOGIC);
END COMPONENT;
COMPONENT OPAR3
    PORT( X: in STD_LOGIC_VECTOR(2 downto 0);
            Z: out STD_LOGIC);
END COMPONENT;
--
begin
-- Instantiate Components
--
    c1: MAJ3 PORT MAP (A, C(1));
    c2: OPAR3 PORT MAP (A, C(0));
end Structural;


Dạng sóng ra mô phỏng:




Chú ý:
Ta có thể sử dụng luôn các component có sẵn của Altera MaxplusII. Tuy nhiên lưu ý phải khai
báo component đúng với khai báo của Altera MaxplusII!
Các cổng logic của Maxplus II có các khai báo sau:
   1) Cổng NOT với tên là A_NOT có khai báo sau:
          COMPONENT a_not
             PORT( a_in: in           STD_LOGIC;
                     a_out: out STD_LOGIC);
          END COMPONENT;
                            Các BT giải sẵn về VHDL 2011 – trang 7
2) Cổng AND có thể có n ngõ vào (ANDn) với n=2, 3, 4, 6, 8 và 12.
         TD: Khai báo sau cho cổng AND có 2 ngõ vào:
         COMPONENT and2
            PORT( IN1, IN2: in STD_LOGIC;
                        a_out: out STD_LOGIC);
         END COMPONENT;
  3) Cổng OR có thể có n ngõ vào (ORn) với n=2, 3, 4, 6, 8 và 12.
         TD: Khai báo sau cho cổng OR có 2 ngõ vào:
         COMPONENT or3
            PORT(IN1, IN2, IN3: in STD_LOGIC;
                        a_out: out STD_LOGIC);
         END COMPONENT;
  4) Cổng NAND có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12.
  5) Cổng NOR có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12.
  6) Cổng XOR 2 ngõ vào có tên là a_XOR với khai báo sau:
         COMPONENT a_xor
            PORT(IN1, IN2: in STD_LOGIC;
                        a_out: out STD_LOGIC);
         END COMPONENT;
  7) Cổng XNOR 2 ngõ vào có tên là a_XNOR
Như vậy ta có lời giải khác ngắn hơn nếu sử dụng các component có sẵn của Maxplus II:
     ----- Use built-in components of MaxplusII
     ----------------- Majority of 3 bit number----------------
     LIBRARY IEEE;
     USE IEEE.STD_LOGIC_1164.ALL;
     entity         MAJ3      is
             PORT(        X: in STD_LOGIC_VECTOR(2 downto 0);
                          Z: out STD_LOGIC);
     end MAJ3;
     architecture            Structural_M         of    MAJ3      is
     COMPONENT and2
            PORT( IN1, IN2: in STD_LOGIC; -- Declare Components
                        a_out: out STD_LOGIC); -- To Be Instantiated
     END COMPONENT;
     COMPONENT or3
            PORT(IN1, IN2, IN3: in STD_LOGIC;
                        a_out: out STD_LOGIC);
     END COMPONENT;
     --
     SIGNAL A1,A2,A3: STD_LOGIC; -- Declare Maj3 Local Signals
     begin
     -- Instantiate Gates
            g1: and2 PORT MAP (X(0), X(1), A1);
            g2: and2 PORT MAP (X(0), X(2), A2);                        -- Wiring of
            g3: and2 PORT MAP (X(1), X(2), A3);                        -- Maj3

                          Các BT giải sẵn về VHDL 2011 – trang 8
g4: or3 PORT MAP (A1, A2, A3, Z);         -- Compts.
end Structural_M;
------------------OPAR3 Circuit---------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity OPAR3 is
    PORT( X: in STD_LOGIC_VECTOR(2 downto 0);
            Z: out STD_LOGIC);
end OPAR3;
architecture    Structural_O   of OPAR3   is
COMPONENT a_not
    PORT( a_in: in     STD_LOGIC;
           a_out: out STD_LOGIC);
END COMPONENT;
COMPONENT nand3
    PORT( IN1, IN2, IN3: in STD_LOGIC;
           a_out: out STD_LOGIC);
END COMPONENT;
COMPONENT nand4
    PORT( IN1, IN2, IN3, IN4: in STD_LOGIC;
           a_out: out STD_LOGIC);
END COMPONENT;
--
    SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC;
begin
-- Instantiate Gates
    g1: a_not PORT MAP (X(0), A0B);
    g2: a_not PORT MAP (X(1), A1B);
    g3: a_not PORT MAP (X(2), A2B);
    g4: nand3 PORT MAP (X(2), A1B, A0B, Z1);
    g5: nand3 PORT MAP (X(0), A1B, A2B, Z2);
    g6: nand3 PORT MAP (X(0), X(1), X(2), Z3);
    g7: nand3 PORT MAP (X(1), A2B, A0B, Z4);
    g8: nand4 PORT MAP (Z1, Z2, Z3, Z4, Z);
end Structural_O;

-----------------ONES_CNT_EX4: Main Circuit------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

entity ONES_CNT_EX4B     is
port ( A     : in   STD_LOGIC_VECTOR(2 downto 0);
       C     : out STD_LOGIC_VECTOR(1 downto 0));
end   ONES_CNT_EX4B;
architecture    Structural   of   ONES_CNT_EX4B   is

               Các BT giải sẵn về VHDL 2011 – trang 9
COMPONENT MAJ3
          PORT( X: in STD_LOGIC_VECTOR(2 downto 0);
                 Z: out STD_LOGIC);
      END COMPONENT;
      COMPONENT OPAR3
          PORT( X: in STD_LOGIC_VECTOR(2 downto 0);
                  Z: out STD_LOGIC);
      END COMPONENT;
      --
      begin
      -- Instantiate Components
          c1: MAJ3 PORT MAP (A, C(1));
          c2: OPAR3 PORT MAP (A, C(0));
      end Structural;

2. Với mạch tổ hợp sau:




Hãy viết mã VHDL với các cách sau (không thiết kế riêng mạch giải mã, mà chỉ cài đặt hàm
F):
    1) Lệnh đồng thời với phép gán dùng các toán tử logic
    2) Lệnh đồng thời WHEN-ELSE
    3) Lệnh đồng thời WITH-SELECT-WHEN
    4) Lệnh tuần tự IF-THEN-ELSE
    5) Lệnh tuần tự CASE-WHEN
Bài giải.
    1) Lệnh đồng thời với phép gán dùng các toán tử logic
             --- signal assignment with logic operators
             library ieee;
             use ieee.std_logic_1164.all;
             entity Q02_1 is
             port (      A, B, C: in std_logic; -- C: LSB
                         F: out std_logic);
             end Q02_1;
             architecture a of Q02_1 is
                   signal D1, D5, D7: std_logic;
             begin
                   D1 <= not(A) and not(B) and C;

                           Các BT giải sẵn về VHDL 2011 – trang 10
D5 <= A and not(B) and C;
          D7 <= A and B and C;
          F <= D1 or D5 or D7;
      end a;




2) Lệnh đồng thời WHEN-ELSE
         --- signal assignment with WHEN-ELSE
         library ieee;
         use ieee.std_logic_1164.all;
         entity Q02_2 is
         port(      A, B, C: in std_logic; -- C: LSB
               F: out std_logic);
         end Q02_2;
         architecture a of Q02_2 is
               signal ABC: std_logic_vector(2 downto 0);
         begin
               ABC <= A&B&C;
               F <= '1' when ABC="001" or ABC="101" or ABC ="111"
         else '0';
         end a;

3) Lệnh đồng thời WITH-SELECT-WHEN
         --- signal assignment with WITH-SELECT-WHEN
         library ieee;
         use ieee.std_logic_1164.all;
         entity Q02_3 is
         port(      A, B, C: in std_logic; -- C: LSB
               F: out std_logic);
         end Q02_3;
         architecture a of Q02_3 is
               signal ABC: std_logic_vector(2 downto 0);
         begin
               ABC <= A&B&C;
               with ABC select
               F <=      '1' when "001" | "101" | "111",
                         '0' when others;
         end a;

                  Các BT giải sẵn về VHDL 2011 – trang 11
4) Lệnh tuần tự IF-THEN-ELSE
         --- signal assignment with IF-THEN-ELSE
         library ieee;
         use ieee.std_logic_1164.all;
         entity Q02_4 is
         port(       A, B, C: in std_logic; -- C: LSB
               F: out std_logic);
         end Q02_4;
         architecture a of Q02_4 is
               signal ABC: std_logic_vector(2 downto 0);
         begin
               ABC <= A&B&C;
               process(ABC)
               begin
                     if (ABC= "001" or ABC = "101" or ABC ="111")
                     then
                          F <= '1';
                     else
                          F <= '0';
                     end if;
               end process;
         end a;

5) Lệnh tuần tự CASE-WHEN
--- signal assignment with CASE-WHEN
library ieee;
use ieee.std_logic_1164.all;
entity Q02_5 is
port( A, B, C: in std_logic; -- C: LSB
   F: out std_logic);
end Q02_5;
architecture a of Q02_5 is
   signal ABC: std_logic_vector(2 downto 0);
begin
   ABC <= A&B&C;
   process(ABC)
   begin
         case (ABC) is
               when "001" | "101" | "111" => F <= '1';
               when others => F <= '0';
         end case;
   end process;
end a;


                  Các BT giải sẵn về VHDL 2011 – trang 12
3. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau:
      library ieee;
      use ieee.std_logic_1164.all;
      entity blackbox is port(
            a, b, cin:        in std_logic;
            inst: in std_logic_vector(2 downto 0);
            F, cout: out std_logic);
      end blackbox;

      architecture bg of blackbox is
            signal s0, s1, s2, s3, s4 : std_logic;
            --signal command : std_logic_vector(1 downto 0);
      begin
      s0 <= a and s4;
      s1 <= a or s4;
      s2 <= a xor s4;
      s3 <= a xor s4 xor cin;
      cout <= (a and s4) or ( s4 and cin) or (a and cin);
      U1: process(inst)
            begin
            case(inst(2 downto 1)) is
                   when "00" => F <= s0;
                   when "01" => F <= s1;
                   when "10" => F <= s2;
                   when others => F <= s3;
            end case;
            end process;
      U2: process(inst)
            begin
                   if (inst(0) = '0') then
                         s4 <= b;
                   else
                         s4 <= not b;
                   end if;
            end process;
      end bg;
Bài giải.
Ta thấy 2 phép gán sau :
      s3 <= a xor s4 xor cin;
      cout <= (a and s4) or ( s4 and cin) or (a and cin);
nhằm thực hiện mạch FA, do đó có thể dùng khối này trong mạch logic.
Process U1 chính là MUX 4 sang 1 với ngõ chọn là inst(2:1).
Process U2 chính là MUX 2 sang 1 với ngõ chọn là inst(0).
Từ đó ta có mạch logic của mã VHDL trên là: (ALU 1 bit)

                           Các BT giải sẵn về VHDL 2011 – trang 13
4. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau:
library ieee;
use ieee.std_logic_1164.all;
entity CIRCUIT is
port(A, B, C: in std_logic; S:in std_logic_vector (1 downto 0);
      Z: out std_logic);
end CIRCUIT;
architecture a of CIRCUIT is
begin
process(A, B, C, S)
begin
      if (S(0)= ‘1’) then
            Z <= A;
      elsif (S(1) = ‘1’) then
            Z <= B;
      else
            Z <= C;
    end if;
end process;
end a;

                           Các BT giải sẵn về VHDL 2011 – trang 14
Bài giải.
Từ mã VHDL ta có thể viết trực tiếp các biểu thức Boole cho các biến ra với loại lệnh IF :
             Lệnh                             Biểu thức Boole tương đương
  if      (cond1) then              F = C1.X + C1’(C2.Y + C2’.Z)
          F <= X ;                  F = C1.X + C1’C2.Y + C1’ C2’.Z
  elsif (cond2) then
          F <= Y ;                  Với C1 = cond1 và C2 = cond2
  else
          F <= Z ;
  end if ;
Áp dụng qui tắc này ta tìm được biểu thức Boole cho Z:
              Z = S(0).A + S(0)’(S(1).B + S(1)’.C)
Nhớ lại với MUX 2 sang 1có ngõ ra Y và các ngõ vào I0, I1 và S thì ngõ ra là:
              Y = S’.I0 + S.I1
Như vậy ta phải dùng 2 mạch MUX 2 sang 1 để thực hiện mạch trên:




5. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau:
entity CIRCUIT is
port (A, B, S1, S2, S3, CLK: in std_logic;
      Y: out std_logic);
end CIRCUIT;
architecture a of CIRCUIT is
begin
process(CLK)
begin
      if (CLK'event and CLK='1') then
            if (A='1') then
                  Y <= S3;
            elsif (B = '0') then
                  Y <= S2;
            else
                  Y <= S1;
            end if;
      end if;
end process;
end a;

                            Các BT giải sẵn về VHDL 2011 – trang 15
Bài giải.
NX : Ngõ ra chỉ được cập nhật khi có cạnh lên tại CLK  Đây là D F/F kích cạnh lên với ngõ
vào là mạch tổ hợp như câu trên.




6. Ta cần thiết kế 1 mạch tổ hợp mà xuất phát từ thiết kế số thông thường, mạch này được
ghép từ
    mạch mã hóa ưu tiên từ 10 ngõ vào (in_n) sang 4 (BCD): ngõ vào tích cực thấp và ưu
       tiên bit có trọng số thấp nhất, ngõ ra là số BCD 4 bit chỉ ngõ vào nào được tích cực thấp.
           o TD: Ngõ vào in_n = 11111100 thì ngõ ra là BCD = 0000
    Mạch giải mã BCD ra 7 đoạn nối với LED (giả sử logic 1 làm cho đoạn LED sáng) :
       mạch này nhận giá trị ra từ mạch trên và chuyển sang mã 7 đoạn hiện trên LED 7 đoạn.
   a) Hãy viết mã VHDL với 2 mạch này độc lập.
   b) Hãy viết mã VHDL chỉ có 1 mạch duy nhất.
Bài giải.
Ta có thể dùng when-else hay with-select-when để mô tả các mạch này.
   a) Mã VHDL với 2 mạch độc lập
library ieee;
use ieee.std_logic_1164.all;
entity Q06_1 is port(
      in_n: in std_logic_vector(9 downto 0);
       -- in_n : low active and higher priority LSB
       LED_7seg: out std_logic_vector(6 downto 0));
       -- LED_7seg(0) = segment a
end Q06_1;
architecture bg of Q06_1 is
       signal s_BCD : std_logic_vector (3 downto 0);
begin
-- Priority Encoder
s_BCD <=              "0000" when (in_n(0) = '0') else
                      "0001" when in_n(1) = '0' else
                      "0010" when in_n(2) = '0' else
                      "0011" when in_n(3) = '0' else
                      "0100" when in_n(4) = '0' else
                      "0101" when in_n(5) = '0' else
                      "0110" when in_n(6) = '0' else
                      "0111" when in_n(7) = '0' else
                      "1000" when in_n(8) = '0' else
                      "1001" when in_n(9) = '0' else
                      "1111"; -- invalid BCD

                             Các BT giải sẵn về VHDL 2011 – trang 16
-- BCD to 7 segment Decoder: LED_7seg = gfedcba
LED_7seg <= "0111111" when s_BCD = "0000" else
                "0000110" when s_BCD = "0001" else
                "1011011" when s_BCD = "0010" else
                "1001111" when s_BCD = "0011" else
                "1100110" when s_BCD = "0100" else
                "1101101" when s_BCD = "0101" else
                "1111101" when s_BCD = "0110" else
                "0000111" when s_BCD = "0111" else
                "0000000" when s_BCD = "1000" else
                "1101111" when s_BCD = "1001" else
                (others => '0');
end bg;
Dạng sóng mô phỏng :




  b) Mã VHDL với 1 mạch duy nhất
library ieee;
use ieee.std_logic_1164.all;
entity Q06_2 is port(
     in_n: in std_logic_vector(9 downto 0);
     LED_7seg: out std_logic_vector(6 downto 0));
end Q06_2;
architecture bg of Q06_2 is
begin
LED_7seg <= "0111111" when in_n(0) = '0' else
              "0000110" when in_n(1) = '0' else
              "1011011" when in_n(2) = '0' else
              "1001111" when in_n(3) = '0' else
              "1100110" when in_n(4) = '0' else
              "1101101" when in_n(5) = '0' else
              "1111101" when in_n(6) = '0' else
                    Các BT giải sẵn về VHDL 2011 – trang 17
"0000111" when in_n(7) = '0' else
                  "0000000" when in_n(8) = '0' else
                  "1101111" when in_n(9) = '0' else
                  (others => '0');
end bg;

7. Thiết kế JK flipfop như hình bên dưới (các ngõ Preset PR và Clear CLR
tích cực cao và bất đồng bộ, CLR có ưu tiên cao hơn PR)
    a) Dùng phương trình đặc tính của JK FF.
    b) Dùng bảng hoạt động của JK FF.
    c) Nếu muốn Preset PR đồng bộ thì phải sửa lại như thế nào?
Bài giải.
  a) Dùng phương trình đặc tính của JK FF:
library ieee;
use ieee.std_logic_1164.all;
entity JK_FF is port(
    J, K, CLK, PR, CLR: in std_logic;
          -- PR, CLR: Asynchronous Preset and Clear
     Q, Q_n: out std_logic);
end JK_FF;
architecture bg of JK_FF is
     signal Q_int: std_logic;
begin
process(CLK, PR, CLR)
begin
     if (CLR = '1') then
          Q_int <= '0';
     elsif (PR = '1') then
               Q_int <= '1';
     elsif rising_edge(CLK) then
                 Q_int <= (J and not Q_int) or (not K and Q_int);
     end if;
end process;
Q <= Q_int;
Q_n <= not Q_int;
end bg;
Dạng sóng mô phỏng:




                           Các BT giải sẵn về VHDL 2011 – trang 18
b) Dùng bảng hoạt động của JK FF:

library ieee;
use ieee.std_logic_1164.all;
entity JK_FF is port(
    J, K, CLK, PR, CLR: in std_logic;
    Q, Q_n: out std_logic);
end JK_FF;
architecture bg of Q07_2 is
    signal Q_int: std_logic;
    signal JK: std_logic_vector(1 downto 0);
begin
JK <= J & K;
process(CLK, PR, CLR)
begin
    if (CLR = '1') then
         Q_int <= '0';
    elsif (PR = '1') then
             Q_int <= '1';
    elsif rising_edge(CLK) then
                  case JK is
                      when "01" => Q_int <= '0'; -- Reset
                      when "10" => Q_int <= '1'; -- Set
                      when "11" => Q_int <= not Q_int;-- Toggle
                      when others => null;
                  end case;
    end if;
end process;
Q <= Q_int;
Q_n <= not Q_int;
end bg;

  c) Ta chỉ cần viết lại như sau :

     if (CLR = '1') then
         Q_int <= '0';
     elsif rising_edge(CLK) then

          if (PR = '1') then
              Q_int <= '1';
         else
              --Phần mã gán Q_int
         end if ;
     end if ;


                            Các BT giải sẵn về VHDL 2011 – trang 19
Dạng sóng mô phỏng :




8. Thiết kế mạch cộng song song 2 số nhị phân N bit (dùng phát biểu generic để thiết kế tổng
quát, mặc nhiên N =4) là A và B. Tổng là Sum và số nhớ/mượn là C_out.
   a) Mô tả VHDL cho mạch này.
   b) Thêm vào tín hiệu điều khiển cho phép cộng/trừ với tên là Add_Sub (0: cộng và 1:trừ)
      thì phải chỉnh sửa như thế nào?
Bài giải.
   a) Khi sử dụng toán tử cộng/trừ thì ta phải dùng gói ieee.std_logic_unsigned.all :
-- Parallel Adder
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity Q08_1 is
      generic (N: integer := 4);
port(
        A, B: in std_logic_vector(N-1 downto 0);
        C_out: out std_logic;
        Sum: out std_logic_vector(N-1 downto 0));
end Q08_1;
architecture bg of Q08_1 is
      signal Sum_int: std_logic_vector(Num downto 0);
begin
      Sum_int <=          ('0' & A) + ('0' & B);
      Sum <= Sum_int(N-1 downto 0);
      C_out <= Sum_int(N);
end bg;

   b) Thêm tín hiệu điều khiển Add_Sub:
Ta chỉ cần định nghĩa thêm Add_sub và viết lại lệnh gán của Sum_int :
         Sum_int <= ('0' & A) + ('0' & B) when Add_sub = '0' else
                         ('0' & A) - ('0' & B);
Dạng sóng mô phỏng :


                            Các BT giải sẵn về VHDL 2011 – trang 20
9. Thiết kế mạch cộng nối tiếp 2 số nhị phân với A và B có chiều dài là Num_bits bit (mặc
nhiên cho Num_bits = 4).
       Dữ liệu vào được nhập nối tiếp với LSB đi trước.
       Kết quả là tổng Sum có chiều dài Num_bits bit và có số nhớ ra là C_out.
       Tín hiệu Start =1 để chỉ bắt đầu thực hiện cộng (chỉ tồn tại < 1 chu kỳ xung nhịp).
       Có tín hiệu Finished báo đã hoàn tất phép cộng.
       Mạch hoạt động theo cạnh xuống xung nhịp CLK.
Hãy viết mã VHDL cho mạch này.
Bài giải.
library ieee;
use ieee.std_logic_1164.all;
entity Q09_1 is
     generic (Num_bits: integer := 4);
port(
    A, B, Start, CLK: in std_logic;
     C_out, Finished: out std_logic;
     Sum: out std_logic_vector(Num_bits-1 downto 0));
end Q09_1;
architecture bg of Q09_1 is
begin
process(CLK, Start)
     variable FIN: std_logic; -- Internal Finish signal
     variable N: integer range 0 to Num_bits;
     variable S, C_in: std_logic;
     variable Sum_int: std_logic_vector(Num_bits-1 downto 0);
begin
if (Start = '1') then
     FIN := '0';
     N := Num_bits;
     C_in := '0';
     Finished <= '0';
elsif     (CLK'event and CLK = '0') then    -- and FIN = '0')
          if (FIN = '0') then
               S := A xor B xor C_in;
               C_in := (A and B) or ( B and C_in) or ( A and C_in);
               Sum_int:= S & Sum_int(Num_bits-1 downto 1);
               N := N - 1;

                           Các BT giải sẵn về VHDL 2011 – trang 21
if N = 0 then
                      FIN := '1';
                      Finished <= '1';
                      Sum <= Sum_int;
                      C_out <= C_in;
                 end if;
            end if;
end if;
end process;
end bg;
Dạng sóng mô phỏng :
     Với A = 0110 và B = 1011 => A + B = 10001 => C_out = 1 và Sum = 0001




Chú ý :
Có 1 cách giải khác là tận dụng toán tử + (trong ieee.std_logic_unsigned.all) để tìm C và S :
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
. . .
-- Thay dòng:   variable S, C_in: std_logic; bằng dòng sau:
variable CS: std_logic_vector(1 downto 0); -- Carry và Sum
. . .
-- Mã mới phần tính full adder như sau:
if (FIN = '0') then
              CS := ('0' & CS(1)) + ('0' & A) + ('0' & B) ;
              Sum_int := CS(0) & Sum_int(Num_bits-1 downto 1);
              N := N - 1;
              if N = 0 then
                       FIN := '1';
                       Finished <= '1';
                       Sum <= Sum_int;
                       C_out <= CS(1);
              end if;
end if;
                             Các BT giải sẵn về VHDL 2011 – trang 22
10. Cho trước hệ tuần tự đồng bộ sau:




  a) Lập bảng chuyển trạng thái của mạch trên.
  b) Viết mã VHDL cho câu a) có thêm tín hiệu reset_n tích cực thấp để cho chạy từ trạng
      thái Q1Q2=00.
Bài giải.
  a) Từ sơ đồ mạch ta có thể tìm được các phương trình đặc tính cho các FF và ngõ ra Z :
            D1 = Q1+ = Q1’ + Q2 ; D2 = Q2+ = XQ2’ ;     Z = Q1 + Q2’
      Suy ra bảng chuyển trạng thái sau:
                              PS         NS (Q1+Q2+)
                                                          Z
                             Q1Q2      X=0       X =1
                              00         10       01       1
                              01         10       10       0
                              11         00       10       1
                              10         00       01       1
  b) Mã VHDL cho câu a):
library ieee;
use ieee.std_logic_1164.all;
entity Q10_1 is
port(       X, CLK, reset_n: in std_logic;
            Z: out std_logic);
end Q10_1;
architecture bg of Q10_1 is
      signal state: std_logic_vector( 1 downto 0);
      signal state_X: std_logic_vector( 2 downto 0);
begin
state_X <= state & X;
Z <= '0' when state = "01" else '1';
process(CLK, reset_n)
begin
      if (reset_n = '0') then
            state <= "00";
      elsif       rising_edge(CLK) then
                  case state_X is
                        when "000" => state <= "10";
                        when "001" => state <= "01";

                            Các BT giải sẵn về VHDL 2011 – trang 23
when "010" | "011" =>                 state <= "10";
                    when "110" => state <=                "00";
                    when "111" => state <=                "10";
                    when "100" => state <=                "00";
                    when "101" => state <=                "01";
                    when others => null;
                end case;
    end if;
end process;
end bg;

Dạng sóng mô phỏng:




Chú ý:
Có nhiều cách viết khác để mô tả FSM, thí dụ sau đây là 1 cách viết khác:
library ieee;
use ieee.std_logic_1164.all;
entity Q10_2 is
port(
     X, CLK, reset_n: in std_logic;
      Z: out std_logic);
end Q10_2;
architecture bg of Q10_2 is
      signal Present_state: std_logic_vector( 1 downto 0);                  --
PS
      signal Next_state: std_logic_vector( 1 downto 0);                     --
NS
begin
Z <= '0' when Present_state = "01" else '1';
State_transition:
process(CLK, reset_n)
begin
      if (reset_n = '0') then
            Present_state <= "00";
      elsif        rising_edge(CLK) then
                         Present_state <= Next_state ;
      end if;
end process;
                         Các BT giải sẵn về VHDL 2011 – trang 24
Find_Next_state:
process(Present_state)
begin
    case Present_state is
         when "00" =>     if                 X = '0' then
                                             Next_state <= "10";
                                      else
                                     Next_state <= "01";
                                end if;
            when    "01" =>     Next_state <= "10";
            when    "11" =>     if X = '0' then
                                     Next_state <= "00";
                                else
                                     Next_state <= "10";
                                end if;
            when    "10" =>     if X = '0' then
                                     Next_state <= "00";
                                else
                                     Next_state <= "01";
                                end if;
         when       others => null;
    end case;
end process;
end bg;

Dạng sóng mô phỏng:




11. Thiết kế mạch phát hiện chuỗi bit vào nối tiếp có trị là "101". Viết mã VHDL với:
   a) Dùng FSM loại Mealy với mô tả FSM.
   b) FSM loại Mealy dùng thanh ghi dịch chứa 3 bit liên tiếp và so sánh với "101".
Bài giải.
   a) FSM loại Mealy
      Ta có được giản đồ trạng thái và bảng chuyển trạng thái như sau (kết quả lấy từ bài
      giảng thiết kế hệ tuần tự đồng bộ)



                            Các BT giải sẵn về VHDL 2011 – trang 25
Ta định nghĩa thêm kiểu mới cho các trạng thái  không cần gán trạng thái mà CAD sẽ
    tự gán trị cho nó.
library ieee;
use ieee.std_logic_1164.all;
entity Q11_1 is
port(      X, CLK, reset_n: in std_logic;
          Z: out std_logic);
end Q11_1;
architecture bg of Q11_1 is
    type state_type is (S0, S1, S2);
    signal state: state_type;
begin
Z <= '1' when (state = S2 and X = '1') else '0';
process(CLK, reset_n)
begin
    if (reset_n = '0') then
          state <= S0;
    elsif         rising_edge(CLK) then
          case state is
                  when S0 =>      if X = '1' then state <= S1; end if;
                  when S1 =>      if X = '0' then state <= S2; end if;
                  when S2 =>      if X = '0' then state <= S0;
                                  else state <= S1;              end if;
                  when others => null;
          end case;
    end if;
end process;
end bg;




                          Các BT giải sẵn về VHDL 2011 – trang 26
b) Thanh ghi dịch
library ieee;
use ieee.std_logic_1164.all;
entity Q11_2 is
port(     X, CLK, reset_n: in std_logic;
          Z: out std_logic);
end Q11_2;
architecture bg of Q11_2 is
     signal pattern: std_logic_vector(2 downto 0);
begin
Z <= '1' when (pattern = "101" and X = ‘1’) else '0';
process(CLK, reset_n)
begin
     if (reset_n = '0') then
          pattern <= (others => '0') ;
     elsif       rising_edge(CLK) then
                     pattern <= pattern(1 downto 0) & X;
     end if;
end process;
end bg;




12. Thiết kế mạch giải mã 3 sang 8 và mạch mã hóa ưu tiên 8 sang 3 (ưu tiên ngõ vào có trọng
số thấp nhất khi có nhiều bit vào là 1).
     Mạch giải mã có các ngõ vào là C, B, và A (LSB) và ra là Y.
     Mạch mã hóa có ngõ vào 8 bit D_in và ngõ ra 3 bit D_out.
Bài giải.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
-- Dung cho ham conv_std_logic_vector(integer, number of bits)
use ieee.std_logic_unsigned.all;
-- Dung cho ham conv_integer(std_logic_vector)
entity Q12_1 is
port(   C, B, A: in std_logic; -- A: LSB
           Y: out std_logic_vector(0 to 7);
           D_in: in std_logic_vector(0 to 7);
           D_out: out std_logic_vector(0 to 2));
end Q12_1;

                            Các BT giải sẵn về VHDL 2011 – trang 27
architecture bg of Q12_1 is
      signal CBA: std_logic_vector(0 to 2);
      signal CBA_int: integer range 0 to 7;
begin
-- Decoder 3 to 8
CBA <= C & B & A;
CBA_int <= conv_integer(CBA);
process (CBA_int)
      variable Y_int: std_logic_vector(0 to 7);
begin
      Y_int := (others => '0');
      Y_int(CBA_int) := '1';
      Y <= Y_int;
end process;
--
-- Priority Encoder 8 to 3
process(D_in)
      variable index_in: integer;
begin
      for i in D_in'length -1 downto 0 loop
           if D_in(i) = '1' then
                index_in := i;
           end if;
      end loop;
      D_out <= conv_std_logic_vector(index_in,3);
end process;
end bg;

Dạng sóng mô phỏng của mạch giải mã:




Dạng sóng mô phỏng của mạch mã hóa:




                         Các BT giải sẵn về VHDL 2011 – trang 28
13. Thiết kế bộ đếm lên 3 bit loại nối tiếp (còn gọi là bộ đếm gợn hay bất đồng bộ) với xung
nhịp vào CLK (kích cạnh). Mạch có ngõ reset tích cực thấp reset_n. Hãy viết mã VHDL
với
   a) Mô hình cấu trúc với component DFF có sẵn.
   b) Các lệnh tuần tự.
Bài giải.
   a) Dùng component DFF có sẵn của Maxplus II
library ieee;
use ieee.std_logic_1164.all;
entity Q13_1 is
port(       CLK, reset_n: in std_logic;
             Q2, Q1, Q0: out std_logic); -- Q0: LSB
end Q13_1;

architecture bg of Q13_1 is
COMPONENT DFF
   PORT (d    : IN STD_LOGIC;
      clk : IN STD_LOGIC;
      clrn: IN STD_LOGIC;
      prn : IN STD_LOGIC;
      q    : OUT STD_LOGIC );
END COMPONENT;

--       Inputs       |   Output
--prn clrn CLK D |        Q
-- L     H      X   X |   H
-- H     L      X   X |   L
-- L     L      X   X |   Illegal
-- H     H         L |   L
-- H     H         H |   H
-- H     H      L   X |   Qo*
-- H     H      H   X |   Qo
-- * Qo = level of Q before Clock pulse
-- All flipflops are positive-edge-triggered.
     signal D0, D1, D2, prn: std_logic;
     signal Q2_int, Q1_int, Q0_int: std_logic;
begin
U1: DFF port map(D0, CLK, reset_n, prn, Q0_int);
U2: DFF port map(D1, D0, reset_n, prn, Q1_int);
U3: DFF port map(D2, D1, reset_n, prn, Q2_int);
prn <= '1';
D0 <= not Q0_int; D1 <= not Q1_int; D2 <= not Q2_int;
Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int;
end bg;


                            Các BT giải sẵn về VHDL 2011 – trang 29
c) Các lệnh tuần tự:
library ieee;
use ieee.std_logic_1164.all;
entity Q13_2 is
port(     CLK, reset_n: in std_logic;
           Q2, Q1, Q0: out std_logic); -- Q0: LSB
end Q13_2;
architecture bg of Q13_2 is
     signal Q2_int, Q1_int, Q0_int: std_logic;
begin
process(CLK, reset_n)
begin
if reset_n = '0' then
     Q0_int <= '0';
elsif     rising_edge(CLK) then
                 Q0_int <= not Q0_int;
end if;
end process;
process(Q0_int)
begin
if reset_n = '0' then
     Q1_int <= '0';
elsif falling_edge(Q0_int) then
                 Q1_int <= not Q1_int;
end if;
end process;
process(Q1_int)
begin
if reset_n = '0' then
     Q2_int <= '0';
elsif falling_edge(Q1_int) then
                 Q2_int <= not Q2_int;
end if;
end process;
Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int;
end bg;

                    Các BT giải sẵn về VHDL 2011 – trang 30
Chú ý: Ta có thể khai báo buffer cho các đối tượng ra Q2, Q1, và Q0, khi đó không cần dùng
các tín hiệu Q2_int, Q1_int, Q0_int.

14. Thiết kế bộ đếm lên 3 bit loại song song (còn gọi là bộ đếm đồng bộ) với xung nhịp vào
CLK (kích cạnh). Mạch có ngõ reset tích cực thấp reset_n. Hãy viết mã VHDL với
      a) Mô hình cấu trúc với component JKFF có sẵn.
      b) Các lệnh tuần tự.
      c) Với dãy đếm 1, 3, 5, 7, 1, . .
Bài giải.
      a) Mô hình cấu trúc với component JKFF có sẵn:
library ieee;
use ieee.std_logic_1164.all;
entity Q14_1 is
port(       CLK, reset_n: in std_logic;
             Q2, Q1, Q0: buffer std_logic); -- Q0: LSB
end Q14_1;

architecture bg of Q14_1 is
COMPONENT JKFF
   PORT (j    : IN STD_LOGIC;
       k   : IN STD_LOGIC;
       clk : IN STD_LOGIC;
       clrn: IN STD_LOGIC;
       prn : IN STD_LOGIC;
       q   : OUT STD_LOGIC);
END COMPONENT;
--         Inputs              |   Output
-- PRN CLRN      CLK  J    K   |   Q
-- L       H      X   X    X   |   H
-- H       L      X   X    X   |   L
-- L       L      X   X    X   |   Illegal
-- H       H      L   X    X   |   Qo*
-- H       H         L    L   |   Qo*
-- H       H         H    L   |   H
-- H       H         L    H   |   L
-- H       H         H    H   |   Toggle
-- * Qo = level of Q before Clock pulse
-- All flipflops are positive-edge-triggered.
     signal J0, J1, J2, prn: std_logic;
begin
U1: JKFF port map(J0, J0, CLK, reset_n, prn, Q0);
U2: JKFF port map(J1, J1, CLK, reset_n, prn, Q1);
U3: JKFF port map(J2, J2, CLK, reset_n, prn, Q2);
prn <= '1'; J0 <= '1'; J1 <= Q0; J2 <= Q1 and Q0;
end bg;
                            Các BT giải sẵn về VHDL 2011 – trang 31
b) Các lệnh tuần tự:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; -- De tinh cong so nhi phan
voi so nguyen
entity Q14_2 is
port(    CLK, reset_n: in std_logic;
          Q2, Q1, Q0: out std_logic); -- Q0: LSB
end Q14_2;

architecture bg of Q14_2 is
      signal Q: std_logic_vector(2 downto 0);
begin
process(CLK)
begin
if reset_n ='0' then
      Q <= "000";
elsif        rising_edge(CLK) then
                    Q <= Q + 1;
end if;
end process;
Q2 <= Q(2); Q1 <= Q(1); Q0 <= Q(0);
end bg;
      c) Với dãy đếm 1, 3, 5, 7, 1, . .
Chỉ cần sửa lại trong phần process của b) như sau:
if reset_n ='0' then
      Q <= "001";
elsif        rising_edge(CLK) then
                    if Q = "111" then
                          Q <= "001";
                    else
                          Q <= Q + 2;
                    end if;
end if;



                      Các BT giải sẵn về VHDL 2011 – trang 32

Mais conteúdo relacionado

Mais procurados

Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhCao Toa
 
Kiến trúc máy tính
Kiến trúc máy tínhKiến trúc máy tính
Kiến trúc máy tínhLE The Vinh
 
Truyen song-va-anten
Truyen song-va-antenTruyen song-va-anten
Truyen song-va-antenĐỗ Kiệt
 
Bài giảng kỹ thuật điều khiển tự động
Bài giảng kỹ thuật điều khiển tự độngBài giảng kỹ thuật điều khiển tự động
Bài giảng kỹ thuật điều khiển tự độngNguyễn Nam Phóng
 
Chuong 05 transistor bjt
Chuong 05 transistor bjtChuong 05 transistor bjt
Chuong 05 transistor bjtJean Okio
 
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trình
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trìnhLập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trình
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trìnhXuân Thủy Nguyễn
 
Kien truc bo_lenh_mips
Kien truc bo_lenh_mipsKien truc bo_lenh_mips
Kien truc bo_lenh_mipsVN Phan
 
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...KhoTi1
 
Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++nataliej4
 
thuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu sothuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu soKimkaty Hoang
 
Ky thuat-truyen-so-lieu
Ky thuat-truyen-so-lieuKy thuat-truyen-so-lieu
Ky thuat-truyen-so-lieuNguyen Vong
 
BGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốBGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốCao Toa
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Nhóc Nhóc
 

Mais procurados (20)

Bài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tínhBài giảng kiến trúc máy tính
Bài giảng kiến trúc máy tính
 
Kiến trúc máy tính
Kiến trúc máy tínhKiến trúc máy tính
Kiến trúc máy tính
 
Bài giảng Assembly
Bài giảng AssemblyBài giảng Assembly
Bài giảng Assembly
 
Cac lenh trong matlab
Cac lenh trong matlabCac lenh trong matlab
Cac lenh trong matlab
 
Truyen song-va-anten
Truyen song-va-antenTruyen song-va-anten
Truyen song-va-anten
 
Bài giảng kỹ thuật điều khiển tự động
Bài giảng kỹ thuật điều khiển tự độngBài giảng kỹ thuật điều khiển tự động
Bài giảng kỹ thuật điều khiển tự động
 
Chuong 05 transistor bjt
Chuong 05 transistor bjtChuong 05 transistor bjt
Chuong 05 transistor bjt
 
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trình
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trìnhLập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trình
Lập trình PLC S7 1200 tiếng Việt-Chuong 5 tập lệnh lập trình
 
Giao tiếp TTL-CMOS
Giao tiếp TTL-CMOSGiao tiếp TTL-CMOS
Giao tiếp TTL-CMOS
 
Kien truc bo_lenh_mips
Kien truc bo_lenh_mipsKien truc bo_lenh_mips
Kien truc bo_lenh_mips
 
Đề tài: Hệ thống điều khiển tốc độ động cơ DC sử dụng bộ PID
Đề tài: Hệ thống điều khiển tốc độ động cơ DC sử dụng bộ PIDĐề tài: Hệ thống điều khiển tốc độ động cơ DC sử dụng bộ PID
Đề tài: Hệ thống điều khiển tốc độ động cơ DC sử dụng bộ PID
 
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...
LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TR...
 
Luận văn: Nghiên cứu hoàn thiện mô hình Kho hàng tự động, HAY
Luận văn: Nghiên cứu hoàn thiện mô hình Kho hàng tự động, HAYLuận văn: Nghiên cứu hoàn thiện mô hình Kho hàng tự động, HAY
Luận văn: Nghiên cứu hoàn thiện mô hình Kho hàng tự động, HAY
 
Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++
 
thuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu sothuc hanh xu ly tin hieu so
thuc hanh xu ly tin hieu so
 
Ky thuat-truyen-so-lieu
Ky thuat-truyen-so-lieuKy thuat-truyen-so-lieu
Ky thuat-truyen-so-lieu
 
Đề tài: Mô phỏng kênh truyền vô tuyến số bằng matlab, 9đ
Đề tài: Mô phỏng kênh truyền vô tuyến số bằng matlab, 9đ Đề tài: Mô phỏng kênh truyền vô tuyến số bằng matlab, 9đ
Đề tài: Mô phỏng kênh truyền vô tuyến số bằng matlab, 9đ
 
Đề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đ
Đề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đĐề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đ
Đề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đ
 
BGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic sốBGKTMT Ch3 mức logic số
BGKTMT Ch3 mức logic số
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04
 

Semelhante a Kts cac bt giai san ve vhdl 2011

Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Ky Nguyen Ad
 
Tài liệu PCL tổng hợp
Tài liệu PCL tổng hợpTài liệu PCL tổng hợp
Tài liệu PCL tổng hợpMinh Hoàng
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avranhhoi12345
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vnbibibobo2007
 
Vxl ch03-8051-3.1 3.2-v03
Vxl ch03-8051-3.1 3.2-v03Vxl ch03-8051-3.1 3.2-v03
Vxl ch03-8051-3.1 3.2-v03Huynh MVT
 
Bai 1 (kts)
Bai 1 (kts)Bai 1 (kts)
Bai 1 (kts)viethoa1
 
Giáo trình kỹ thuật số Chương 3 -4.doc
Giáo trình kỹ thuật số Chương 3 -4.docGiáo trình kỹ thuật số Chương 3 -4.doc
Giáo trình kỹ thuật số Chương 3 -4.docMan_Ebook
 
Tailieu.vncty.com do-an-vi-dieu-khien
Tailieu.vncty.com   do-an-vi-dieu-khienTailieu.vncty.com   do-an-vi-dieu-khien
Tailieu.vncty.com do-an-vi-dieu-khienTrần Đức Anh
 
Tnkts p1
Tnkts p1Tnkts p1
Tnkts p1Huy Ryx
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDMr Giap
 
Chap3 8051 microcontroller – assembly
Chap3 8051 microcontroller – assemblyChap3 8051 microcontroller – assembly
Chap3 8051 microcontroller – assemblyvietanhetc
 
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505Nguyen Luc
 
BAOCAOTHUCTAPCOBAN.docx
BAOCAOTHUCTAPCOBAN.docxBAOCAOTHUCTAPCOBAN.docx
BAOCAOTHUCTAPCOBAN.docxVnHun9
 
Bài giảng môn học siemens plc s7 – 300
Bài giảng môn học siemens plc s7 – 300Bài giảng môn học siemens plc s7 – 300
Bài giảng môn học siemens plc s7 – 300Lê Gia
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inHuy Nguyễn
 
Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Nguyễn Hồng Nhân
 

Semelhante a Kts cac bt giai san ve vhdl 2011 (20)

Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr
 
Tài liệu PCL tổng hợp
Tài liệu PCL tổng hợpTài liệu PCL tổng hợp
Tài liệu PCL tổng hợp
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avr
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vn
 
Vxl ch03-8051-3.1 3.2-v03
Vxl ch03-8051-3.1 3.2-v03Vxl ch03-8051-3.1 3.2-v03
Vxl ch03-8051-3.1 3.2-v03
 
Bai 1 (kts)
Bai 1 (kts)Bai 1 (kts)
Bai 1 (kts)
 
Giáo trình kỹ thuật số Chương 3 -4.doc
Giáo trình kỹ thuật số Chương 3 -4.docGiáo trình kỹ thuật số Chương 3 -4.doc
Giáo trình kỹ thuật số Chương 3 -4.doc
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
Tailieu.vncty.com do-an-vi-dieu-khien
Tailieu.vncty.com   do-an-vi-dieu-khienTailieu.vncty.com   do-an-vi-dieu-khien
Tailieu.vncty.com do-an-vi-dieu-khien
 
Tnkts p1
Tnkts p1Tnkts p1
Tnkts p1
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
 
Chap3 8051 microcontroller – assembly
Chap3 8051 microcontroller – assemblyChap3 8051 microcontroller – assembly
Chap3 8051 microcontroller – assembly
 
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505
Do an lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505
 
BAOCAOTHUCTAPCOBAN.docx
BAOCAOTHUCTAPCOBAN.docxBAOCAOTHUCTAPCOBAN.docx
BAOCAOTHUCTAPCOBAN.docx
 
Bài giảng môn học siemens plc s7 – 300
Bài giảng môn học siemens plc s7 – 300Bài giảng môn học siemens plc s7 – 300
Bài giảng môn học siemens plc s7 – 300
 
Plc s7300
Plc s7300Plc s7300
Plc s7300
 
slide 8051
slide 8051 slide 8051
slide 8051
 
Nmlt c08 mang2_chieu
Nmlt c08 mang2_chieuNmlt c08 mang2_chieu
Nmlt c08 mang2_chieu
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_in
 
Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]
 

Kts cac bt giai san ve vhdl 2011

  • 1. ĐHBK Tp HCM–Khoa ĐĐT–BMĐT Môn học: Kỹ thuật số GVPT: Hồ Trung Mỹ Bài tập giải sẵn về VHDL (AY1112-S1) (Các mã VHDL đã được chạy thử trên Altera MaxplusII v10.2) 1. Viết mã VHDL để đếm số bit 1 của số nhị phân 3 bit A với các cách sau: a) Dùng mô hình hành vi b) Dùng mô hình luồng dữ liệu c) Lệnh case-when d) Dùng mô hình cấu trúc Bài giải. Với yêu cầu của đề bài, ta có được bảng chân trị sau: Ngõ vào Ngõ ra A2 A1 A0 C1 C0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 Phần đầu dùng thư viện IEEE và khai báo entity thì giống nhau cho các cách: TD: Với khai báo của cách 1: library ieee; use ieee.std_logic_1164.all; entity ONES_CNT_EX1 is port ( A : in std_logic_vector(2 downto 0); C : out std_logic_vector(1 downto 0)); end ONES_CNT_EX1; a) Mô hình hành vi: architecture Algorithmic of ONES_CNT_EX1 is begin Process(A) -- Sensitivity List Contains only Vector A Variable num: INTEGER range 0 to 3; begin num :=0; For i in 0 to 2 Các BT giải sẵn về VHDL 2011 – trang 1
  • 2. Loop IF A(i) = '1' then num := num+1; end if; end Loop; -- -- Transfer "num" Variable Value to a SIGNAL -- CASE num is WHEN 0 => C <= "00"; WHEN 1 => C <= "01"; WHEN 2 => C <= "10"; WHEN 3 => C <= "11"; end CASE; end process; end Algorithmic; Dạng sóng mô phỏng hoạt động: Chú ý: Có cách giải khác trong thí dụ của MaxplusII: -- MAX+plus II VHDL Example -- Combinatorial Process Statement -- Copyright (c) 1994 Altera Corporation ENTITY proc IS PORT ( d : IN BIT_VECTOR (2 DOWNTO 0); q : OUT INTEGER RANGE 0 TO 3 ); END proc; ARCHITECTURE maxpld OF proc IS BEGIN -- count the number of bits with the value 1 in word d PROCESS (d) VARIABLE num_bits : INTEGER; BEGIN Các BT giải sẵn về VHDL 2011 – trang 2
  • 3. num_bits := 0; FOR i IN d'RANGE LOOP IF d(i) = '1' THEN num_bits := num_bits + 1; END IF; END LOOP; q <= num_bits; END PROCESS; END maxpld; b) Mô hình luồng dữ liệu architecture Two_Level of ONES_CNT_EX2 is begin C(1) <= (A(1) and A(0)) or (A(2) and A(0)) or (A(2) and A(1)); C(0) <= (A(2) and not A(1) and not A(0)) or (not A(2) and not A(1) and A(0)) or (A(2) and A(1) and A(0)) or (not A(2) and A(1) and not A(0)); end Two_Level; Dạng sóng mô phỏng hoạt động: c) Lệnh case-when Process(A) -- Sensitivity List Contains only Vector A begin CASE A is WHEN "000" => C <= "00"; WHEN "001" => C <= "01"; WHEN "010" => C <= "01"; WHEN "011" => C <= "10"; WHEN "100" => C <= "01"; WHEN "101" => C <= "10"; WHEN "110" => C <= "10"; Các BT giải sẵn về VHDL 2011 – trang 3
  • 4. WHEN "111" => C <= "11"; WHEN OTHERS => C <="ZZ"; end CASE; end process; end Truth_Table; d) Dùng mô hình cấu trúc Có nhiều cách giải cho phần này. Từ bảng chân trị ta có biểu thức Boole cho các ngõ ra: C1 = A1A0 + A0A2 + A1A2 + A0A1A2 C1 = A1A0 + A0A2 + A1A2 => cần AND 2 ngõ vào và OR 3 ngõ vào và C0 = A2’A1’A0 + A2’A1A0’ + A2A1’A0’ + A2A1A0 C0 = ((A2’A1’A0)’.( A2’A1A0’)’ .(A2A1’A0’)’.(A2A1A0)’)’ => Cần NAND 3 ngõ vào, NAND 4 ngõ vào và cổng NOT Mạch cho C1 được đặt tên là MAJ3 và mạch cho C0 được đặt tên là OPAR3. Từ đó có bài giải sau: ----------------- NOT gate ----------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY notgate IS PORT( i: IN STD_LOGIC; o: OUT STD_LOGIC); END notgate; ARCHITECTURE Dataflow OF notgate IS BEGIN o <= NOT i; END Dataflow; ----------------- 3-input NAND gate --------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3gate IS PORT( i1, i2, i3: IN STD_LOGIC; o: OUT STD_LOGIC); END nand3gate; ARCHITECTURE Dataflow OF nand3gate IS BEGIN o <= NOT(i1 AND i2 AND i3); END Dataflow; ----------------- 4-input NAND gate --------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand4gate IS Các BT giải sẵn về VHDL 2011 – trang 4
  • 5. PORT( i1, i2, i3, i4: IN STD_LOGIC; o: OUT STD_LOGIC); END nand4gate; ARCHITECTURE Dataflow OF nand4gate IS BEGIN o <= NOT(i1 AND i2 AND i3 AND i4); END Dataflow; ----------------- 2-input AND gate --------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY and2gate IS PORT( i1, i2: IN STD_LOGIC; o: OUT STD_LOGIC); END and2gate; ARCHITECTURE Dataflow OF and2gate IS BEGIN o <= i1 AND i2; END Dataflow; ----------------- 3-input OR gate ---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY or3gate IS PORT( i1, i2, i3: IN STD_LOGIC; o: OUT STD_LOGIC); END or3gate; ARCHITECTURE Dataflow OF or3gate IS BEGIN o <= i1 OR i2 OR i3; END Dataflow; ----------------- Majority of 3 bit number---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity MAJ3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end MAJ3; architecture Structural_M of MAJ3 is COMPONENT and2gate PORT( I1, I2: in STD_LOGIC; -- Declare Components O: out STD_LOGIC); -- To Be Instantiated Các BT giải sẵn về VHDL 2011 – trang 5
  • 6. END COMPONENT; COMPONENT or3gate PORT(I1, I2, I3: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; -- SIGNAL A1, A2, A3: STD_LOGIC; -- Declare Maj3 Local Signals begin -- Instantiate Gates g1: and2gate PORT MAP (X(0), X(1), A1); g2: and2gate PORT MAP (X(0), X(2), A2); -- Wiring of g3: and2gate PORT MAP (X(1), X(2), A3); -- Maj3 g4: or3gate PORT MAP (A1, A2, A3, Z); -- Compts. end Structural_M; ------------------OPAR3 Circuit------------------------------ LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity OPAR3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end OPAR3; architecture Structural_O of OPAR3 is COMPONENT notgate PORT( i: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; COMPONENT nand3gate PORT( I1, I2, I3: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; COMPONENT nand4gate PORT( I1, I2, I3, I4: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; -- SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC; begin -- Instantiate Gates g1: notgate PORT MAP (X(0), A0B); g2: notgate PORT MAP (X(1), A1B); g3: notgate PORT MAP (X(2), A2B); g4: nand3gate PORT MAP (X(2), A1B, A0B, Z1); g5: nand3gate PORT MAP (X(0), A1B, A2B, Z2); g6: nand3gate PORT MAP (X(0), X(1), X(2), Z3); g7: nand3gate PORT MAP (X(1), A2B, A0B, Z4); Các BT giải sẵn về VHDL 2011 – trang 6
  • 7. g8: nand4gate PORT MAP (Z1, Z2, Z3, Z4, Z); end Structural_O; -----------------ONES_CNT_EX4: Main Circuit------------ LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity ONES_CNT_EX4 is port ( A : in STD_LOGIC_VECTOR(2 downto 0); C : out STD_LOGIC_VECTOR(1 downto 0)); end ONES_CNT_EX4; architecture Structural of ONES_CNT_EX4 is COMPONENT MAJ3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; COMPONENT OPAR3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; -- begin -- Instantiate Components -- c1: MAJ3 PORT MAP (A, C(1)); c2: OPAR3 PORT MAP (A, C(0)); end Structural; Dạng sóng ra mô phỏng: Chú ý: Ta có thể sử dụng luôn các component có sẵn của Altera MaxplusII. Tuy nhiên lưu ý phải khai báo component đúng với khai báo của Altera MaxplusII! Các cổng logic của Maxplus II có các khai báo sau: 1) Cổng NOT với tên là A_NOT có khai báo sau: COMPONENT a_not PORT( a_in: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; Các BT giải sẵn về VHDL 2011 – trang 7
  • 8. 2) Cổng AND có thể có n ngõ vào (ANDn) với n=2, 3, 4, 6, 8 và 12. TD: Khai báo sau cho cổng AND có 2 ngõ vào: COMPONENT and2 PORT( IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 3) Cổng OR có thể có n ngõ vào (ORn) với n=2, 3, 4, 6, 8 và 12. TD: Khai báo sau cho cổng OR có 2 ngõ vào: COMPONENT or3 PORT(IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 4) Cổng NAND có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12. 5) Cổng NOR có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12. 6) Cổng XOR 2 ngõ vào có tên là a_XOR với khai báo sau: COMPONENT a_xor PORT(IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 7) Cổng XNOR 2 ngõ vào có tên là a_XNOR Như vậy ta có lời giải khác ngắn hơn nếu sử dụng các component có sẵn của Maxplus II: ----- Use built-in components of MaxplusII ----------------- Majority of 3 bit number---------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity MAJ3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end MAJ3; architecture Structural_M of MAJ3 is COMPONENT and2 PORT( IN1, IN2: in STD_LOGIC; -- Declare Components a_out: out STD_LOGIC); -- To Be Instantiated END COMPONENT; COMPONENT or3 PORT(IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; -- SIGNAL A1,A2,A3: STD_LOGIC; -- Declare Maj3 Local Signals begin -- Instantiate Gates g1: and2 PORT MAP (X(0), X(1), A1); g2: and2 PORT MAP (X(0), X(2), A2); -- Wiring of g3: and2 PORT MAP (X(1), X(2), A3); -- Maj3 Các BT giải sẵn về VHDL 2011 – trang 8
  • 9. g4: or3 PORT MAP (A1, A2, A3, Z); -- Compts. end Structural_M; ------------------OPAR3 Circuit--------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity OPAR3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end OPAR3; architecture Structural_O of OPAR3 is COMPONENT a_not PORT( a_in: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; COMPONENT nand3 PORT( IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; COMPONENT nand4 PORT( IN1, IN2, IN3, IN4: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; -- SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC; begin -- Instantiate Gates g1: a_not PORT MAP (X(0), A0B); g2: a_not PORT MAP (X(1), A1B); g3: a_not PORT MAP (X(2), A2B); g4: nand3 PORT MAP (X(2), A1B, A0B, Z1); g5: nand3 PORT MAP (X(0), A1B, A2B, Z2); g6: nand3 PORT MAP (X(0), X(1), X(2), Z3); g7: nand3 PORT MAP (X(1), A2B, A0B, Z4); g8: nand4 PORT MAP (Z1, Z2, Z3, Z4, Z); end Structural_O; -----------------ONES_CNT_EX4: Main Circuit------------ LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity ONES_CNT_EX4B is port ( A : in STD_LOGIC_VECTOR(2 downto 0); C : out STD_LOGIC_VECTOR(1 downto 0)); end ONES_CNT_EX4B; architecture Structural of ONES_CNT_EX4B is Các BT giải sẵn về VHDL 2011 – trang 9
  • 10. COMPONENT MAJ3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; COMPONENT OPAR3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; -- begin -- Instantiate Components c1: MAJ3 PORT MAP (A, C(1)); c2: OPAR3 PORT MAP (A, C(0)); end Structural; 2. Với mạch tổ hợp sau: Hãy viết mã VHDL với các cách sau (không thiết kế riêng mạch giải mã, mà chỉ cài đặt hàm F): 1) Lệnh đồng thời với phép gán dùng các toán tử logic 2) Lệnh đồng thời WHEN-ELSE 3) Lệnh đồng thời WITH-SELECT-WHEN 4) Lệnh tuần tự IF-THEN-ELSE 5) Lệnh tuần tự CASE-WHEN Bài giải. 1) Lệnh đồng thời với phép gán dùng các toán tử logic --- signal assignment with logic operators library ieee; use ieee.std_logic_1164.all; entity Q02_1 is port ( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_1; architecture a of Q02_1 is signal D1, D5, D7: std_logic; begin D1 <= not(A) and not(B) and C; Các BT giải sẵn về VHDL 2011 – trang 10
  • 11. D5 <= A and not(B) and C; D7 <= A and B and C; F <= D1 or D5 or D7; end a; 2) Lệnh đồng thời WHEN-ELSE --- signal assignment with WHEN-ELSE library ieee; use ieee.std_logic_1164.all; entity Q02_2 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_2; architecture a of Q02_2 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; F <= '1' when ABC="001" or ABC="101" or ABC ="111" else '0'; end a; 3) Lệnh đồng thời WITH-SELECT-WHEN --- signal assignment with WITH-SELECT-WHEN library ieee; use ieee.std_logic_1164.all; entity Q02_3 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_3; architecture a of Q02_3 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; with ABC select F <= '1' when "001" | "101" | "111", '0' when others; end a; Các BT giải sẵn về VHDL 2011 – trang 11
  • 12. 4) Lệnh tuần tự IF-THEN-ELSE --- signal assignment with IF-THEN-ELSE library ieee; use ieee.std_logic_1164.all; entity Q02_4 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_4; architecture a of Q02_4 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; process(ABC) begin if (ABC= "001" or ABC = "101" or ABC ="111") then F <= '1'; else F <= '0'; end if; end process; end a; 5) Lệnh tuần tự CASE-WHEN --- signal assignment with CASE-WHEN library ieee; use ieee.std_logic_1164.all; entity Q02_5 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_5; architecture a of Q02_5 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; process(ABC) begin case (ABC) is when "001" | "101" | "111" => F <= '1'; when others => F <= '0'; end case; end process; end a; Các BT giải sẵn về VHDL 2011 – trang 12
  • 13. 3. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau: library ieee; use ieee.std_logic_1164.all; entity blackbox is port( a, b, cin: in std_logic; inst: in std_logic_vector(2 downto 0); F, cout: out std_logic); end blackbox; architecture bg of blackbox is signal s0, s1, s2, s3, s4 : std_logic; --signal command : std_logic_vector(1 downto 0); begin s0 <= a and s4; s1 <= a or s4; s2 <= a xor s4; s3 <= a xor s4 xor cin; cout <= (a and s4) or ( s4 and cin) or (a and cin); U1: process(inst) begin case(inst(2 downto 1)) is when "00" => F <= s0; when "01" => F <= s1; when "10" => F <= s2; when others => F <= s3; end case; end process; U2: process(inst) begin if (inst(0) = '0') then s4 <= b; else s4 <= not b; end if; end process; end bg; Bài giải. Ta thấy 2 phép gán sau : s3 <= a xor s4 xor cin; cout <= (a and s4) or ( s4 and cin) or (a and cin); nhằm thực hiện mạch FA, do đó có thể dùng khối này trong mạch logic. Process U1 chính là MUX 4 sang 1 với ngõ chọn là inst(2:1). Process U2 chính là MUX 2 sang 1 với ngõ chọn là inst(0). Từ đó ta có mạch logic của mã VHDL trên là: (ALU 1 bit) Các BT giải sẵn về VHDL 2011 – trang 13
  • 14. 4. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau: library ieee; use ieee.std_logic_1164.all; entity CIRCUIT is port(A, B, C: in std_logic; S:in std_logic_vector (1 downto 0); Z: out std_logic); end CIRCUIT; architecture a of CIRCUIT is begin process(A, B, C, S) begin if (S(0)= ‘1’) then Z <= A; elsif (S(1) = ‘1’) then Z <= B; else Z <= C; end if; end process; end a; Các BT giải sẵn về VHDL 2011 – trang 14
  • 15. Bài giải. Từ mã VHDL ta có thể viết trực tiếp các biểu thức Boole cho các biến ra với loại lệnh IF : Lệnh Biểu thức Boole tương đương if (cond1) then F = C1.X + C1’(C2.Y + C2’.Z) F <= X ; F = C1.X + C1’C2.Y + C1’ C2’.Z elsif (cond2) then F <= Y ; Với C1 = cond1 và C2 = cond2 else F <= Z ; end if ; Áp dụng qui tắc này ta tìm được biểu thức Boole cho Z: Z = S(0).A + S(0)’(S(1).B + S(1)’.C) Nhớ lại với MUX 2 sang 1có ngõ ra Y và các ngõ vào I0, I1 và S thì ngõ ra là: Y = S’.I0 + S.I1 Như vậy ta phải dùng 2 mạch MUX 2 sang 1 để thực hiện mạch trên: 5. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của mã VHDL sau: entity CIRCUIT is port (A, B, S1, S2, S3, CLK: in std_logic; Y: out std_logic); end CIRCUIT; architecture a of CIRCUIT is begin process(CLK) begin if (CLK'event and CLK='1') then if (A='1') then Y <= S3; elsif (B = '0') then Y <= S2; else Y <= S1; end if; end if; end process; end a; Các BT giải sẵn về VHDL 2011 – trang 15
  • 16. Bài giải. NX : Ngõ ra chỉ được cập nhật khi có cạnh lên tại CLK  Đây là D F/F kích cạnh lên với ngõ vào là mạch tổ hợp như câu trên. 6. Ta cần thiết kế 1 mạch tổ hợp mà xuất phát từ thiết kế số thông thường, mạch này được ghép từ  mạch mã hóa ưu tiên từ 10 ngõ vào (in_n) sang 4 (BCD): ngõ vào tích cực thấp và ưu tiên bit có trọng số thấp nhất, ngõ ra là số BCD 4 bit chỉ ngõ vào nào được tích cực thấp. o TD: Ngõ vào in_n = 11111100 thì ngõ ra là BCD = 0000  Mạch giải mã BCD ra 7 đoạn nối với LED (giả sử logic 1 làm cho đoạn LED sáng) : mạch này nhận giá trị ra từ mạch trên và chuyển sang mã 7 đoạn hiện trên LED 7 đoạn. a) Hãy viết mã VHDL với 2 mạch này độc lập. b) Hãy viết mã VHDL chỉ có 1 mạch duy nhất. Bài giải. Ta có thể dùng when-else hay with-select-when để mô tả các mạch này. a) Mã VHDL với 2 mạch độc lập library ieee; use ieee.std_logic_1164.all; entity Q06_1 is port( in_n: in std_logic_vector(9 downto 0); -- in_n : low active and higher priority LSB LED_7seg: out std_logic_vector(6 downto 0)); -- LED_7seg(0) = segment a end Q06_1; architecture bg of Q06_1 is signal s_BCD : std_logic_vector (3 downto 0); begin -- Priority Encoder s_BCD <= "0000" when (in_n(0) = '0') else "0001" when in_n(1) = '0' else "0010" when in_n(2) = '0' else "0011" when in_n(3) = '0' else "0100" when in_n(4) = '0' else "0101" when in_n(5) = '0' else "0110" when in_n(6) = '0' else "0111" when in_n(7) = '0' else "1000" when in_n(8) = '0' else "1001" when in_n(9) = '0' else "1111"; -- invalid BCD Các BT giải sẵn về VHDL 2011 – trang 16
  • 17. -- BCD to 7 segment Decoder: LED_7seg = gfedcba LED_7seg <= "0111111" when s_BCD = "0000" else "0000110" when s_BCD = "0001" else "1011011" when s_BCD = "0010" else "1001111" when s_BCD = "0011" else "1100110" when s_BCD = "0100" else "1101101" when s_BCD = "0101" else "1111101" when s_BCD = "0110" else "0000111" when s_BCD = "0111" else "0000000" when s_BCD = "1000" else "1101111" when s_BCD = "1001" else (others => '0'); end bg; Dạng sóng mô phỏng : b) Mã VHDL với 1 mạch duy nhất library ieee; use ieee.std_logic_1164.all; entity Q06_2 is port( in_n: in std_logic_vector(9 downto 0); LED_7seg: out std_logic_vector(6 downto 0)); end Q06_2; architecture bg of Q06_2 is begin LED_7seg <= "0111111" when in_n(0) = '0' else "0000110" when in_n(1) = '0' else "1011011" when in_n(2) = '0' else "1001111" when in_n(3) = '0' else "1100110" when in_n(4) = '0' else "1101101" when in_n(5) = '0' else "1111101" when in_n(6) = '0' else Các BT giải sẵn về VHDL 2011 – trang 17
  • 18. "0000111" when in_n(7) = '0' else "0000000" when in_n(8) = '0' else "1101111" when in_n(9) = '0' else (others => '0'); end bg; 7. Thiết kế JK flipfop như hình bên dưới (các ngõ Preset PR và Clear CLR tích cực cao và bất đồng bộ, CLR có ưu tiên cao hơn PR) a) Dùng phương trình đặc tính của JK FF. b) Dùng bảng hoạt động của JK FF. c) Nếu muốn Preset PR đồng bộ thì phải sửa lại như thế nào? Bài giải. a) Dùng phương trình đặc tính của JK FF: library ieee; use ieee.std_logic_1164.all; entity JK_FF is port( J, K, CLK, PR, CLR: in std_logic; -- PR, CLR: Asynchronous Preset and Clear Q, Q_n: out std_logic); end JK_FF; architecture bg of JK_FF is signal Q_int: std_logic; begin process(CLK, PR, CLR) begin if (CLR = '1') then Q_int <= '0'; elsif (PR = '1') then Q_int <= '1'; elsif rising_edge(CLK) then Q_int <= (J and not Q_int) or (not K and Q_int); end if; end process; Q <= Q_int; Q_n <= not Q_int; end bg; Dạng sóng mô phỏng: Các BT giải sẵn về VHDL 2011 – trang 18
  • 19. b) Dùng bảng hoạt động của JK FF: library ieee; use ieee.std_logic_1164.all; entity JK_FF is port( J, K, CLK, PR, CLR: in std_logic; Q, Q_n: out std_logic); end JK_FF; architecture bg of Q07_2 is signal Q_int: std_logic; signal JK: std_logic_vector(1 downto 0); begin JK <= J & K; process(CLK, PR, CLR) begin if (CLR = '1') then Q_int <= '0'; elsif (PR = '1') then Q_int <= '1'; elsif rising_edge(CLK) then case JK is when "01" => Q_int <= '0'; -- Reset when "10" => Q_int <= '1'; -- Set when "11" => Q_int <= not Q_int;-- Toggle when others => null; end case; end if; end process; Q <= Q_int; Q_n <= not Q_int; end bg; c) Ta chỉ cần viết lại như sau : if (CLR = '1') then Q_int <= '0'; elsif rising_edge(CLK) then if (PR = '1') then Q_int <= '1'; else --Phần mã gán Q_int end if ; end if ; Các BT giải sẵn về VHDL 2011 – trang 19
  • 20. Dạng sóng mô phỏng : 8. Thiết kế mạch cộng song song 2 số nhị phân N bit (dùng phát biểu generic để thiết kế tổng quát, mặc nhiên N =4) là A và B. Tổng là Sum và số nhớ/mượn là C_out. a) Mô tả VHDL cho mạch này. b) Thêm vào tín hiệu điều khiển cho phép cộng/trừ với tên là Add_Sub (0: cộng và 1:trừ) thì phải chỉnh sửa như thế nào? Bài giải. a) Khi sử dụng toán tử cộng/trừ thì ta phải dùng gói ieee.std_logic_unsigned.all : -- Parallel Adder library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Q08_1 is generic (N: integer := 4); port( A, B: in std_logic_vector(N-1 downto 0); C_out: out std_logic; Sum: out std_logic_vector(N-1 downto 0)); end Q08_1; architecture bg of Q08_1 is signal Sum_int: std_logic_vector(Num downto 0); begin Sum_int <= ('0' & A) + ('0' & B); Sum <= Sum_int(N-1 downto 0); C_out <= Sum_int(N); end bg; b) Thêm tín hiệu điều khiển Add_Sub: Ta chỉ cần định nghĩa thêm Add_sub và viết lại lệnh gán của Sum_int : Sum_int <= ('0' & A) + ('0' & B) when Add_sub = '0' else ('0' & A) - ('0' & B); Dạng sóng mô phỏng : Các BT giải sẵn về VHDL 2011 – trang 20
  • 21. 9. Thiết kế mạch cộng nối tiếp 2 số nhị phân với A và B có chiều dài là Num_bits bit (mặc nhiên cho Num_bits = 4).  Dữ liệu vào được nhập nối tiếp với LSB đi trước.  Kết quả là tổng Sum có chiều dài Num_bits bit và có số nhớ ra là C_out.  Tín hiệu Start =1 để chỉ bắt đầu thực hiện cộng (chỉ tồn tại < 1 chu kỳ xung nhịp).  Có tín hiệu Finished báo đã hoàn tất phép cộng.  Mạch hoạt động theo cạnh xuống xung nhịp CLK. Hãy viết mã VHDL cho mạch này. Bài giải. library ieee; use ieee.std_logic_1164.all; entity Q09_1 is generic (Num_bits: integer := 4); port( A, B, Start, CLK: in std_logic; C_out, Finished: out std_logic; Sum: out std_logic_vector(Num_bits-1 downto 0)); end Q09_1; architecture bg of Q09_1 is begin process(CLK, Start) variable FIN: std_logic; -- Internal Finish signal variable N: integer range 0 to Num_bits; variable S, C_in: std_logic; variable Sum_int: std_logic_vector(Num_bits-1 downto 0); begin if (Start = '1') then FIN := '0'; N := Num_bits; C_in := '0'; Finished <= '0'; elsif (CLK'event and CLK = '0') then -- and FIN = '0') if (FIN = '0') then S := A xor B xor C_in; C_in := (A and B) or ( B and C_in) or ( A and C_in); Sum_int:= S & Sum_int(Num_bits-1 downto 1); N := N - 1; Các BT giải sẵn về VHDL 2011 – trang 21
  • 22. if N = 0 then FIN := '1'; Finished <= '1'; Sum <= Sum_int; C_out <= C_in; end if; end if; end if; end process; end bg; Dạng sóng mô phỏng : Với A = 0110 và B = 1011 => A + B = 10001 => C_out = 1 và Sum = 0001 Chú ý : Có 1 cách giải khác là tận dụng toán tử + (trong ieee.std_logic_unsigned.all) để tìm C và S : library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; . . . -- Thay dòng: variable S, C_in: std_logic; bằng dòng sau: variable CS: std_logic_vector(1 downto 0); -- Carry và Sum . . . -- Mã mới phần tính full adder như sau: if (FIN = '0') then CS := ('0' & CS(1)) + ('0' & A) + ('0' & B) ; Sum_int := CS(0) & Sum_int(Num_bits-1 downto 1); N := N - 1; if N = 0 then FIN := '1'; Finished <= '1'; Sum <= Sum_int; C_out <= CS(1); end if; end if; Các BT giải sẵn về VHDL 2011 – trang 22
  • 23. 10. Cho trước hệ tuần tự đồng bộ sau: a) Lập bảng chuyển trạng thái của mạch trên. b) Viết mã VHDL cho câu a) có thêm tín hiệu reset_n tích cực thấp để cho chạy từ trạng thái Q1Q2=00. Bài giải. a) Từ sơ đồ mạch ta có thể tìm được các phương trình đặc tính cho các FF và ngõ ra Z : D1 = Q1+ = Q1’ + Q2 ; D2 = Q2+ = XQ2’ ; Z = Q1 + Q2’ Suy ra bảng chuyển trạng thái sau: PS NS (Q1+Q2+) Z Q1Q2 X=0 X =1 00 10 01 1 01 10 10 0 11 00 10 1 10 00 01 1 b) Mã VHDL cho câu a): library ieee; use ieee.std_logic_1164.all; entity Q10_1 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q10_1; architecture bg of Q10_1 is signal state: std_logic_vector( 1 downto 0); signal state_X: std_logic_vector( 2 downto 0); begin state_X <= state & X; Z <= '0' when state = "01" else '1'; process(CLK, reset_n) begin if (reset_n = '0') then state <= "00"; elsif rising_edge(CLK) then case state_X is when "000" => state <= "10"; when "001" => state <= "01"; Các BT giải sẵn về VHDL 2011 – trang 23
  • 24. when "010" | "011" => state <= "10"; when "110" => state <= "00"; when "111" => state <= "10"; when "100" => state <= "00"; when "101" => state <= "01"; when others => null; end case; end if; end process; end bg; Dạng sóng mô phỏng: Chú ý: Có nhiều cách viết khác để mô tả FSM, thí dụ sau đây là 1 cách viết khác: library ieee; use ieee.std_logic_1164.all; entity Q10_2 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q10_2; architecture bg of Q10_2 is signal Present_state: std_logic_vector( 1 downto 0); -- PS signal Next_state: std_logic_vector( 1 downto 0); -- NS begin Z <= '0' when Present_state = "01" else '1'; State_transition: process(CLK, reset_n) begin if (reset_n = '0') then Present_state <= "00"; elsif rising_edge(CLK) then Present_state <= Next_state ; end if; end process; Các BT giải sẵn về VHDL 2011 – trang 24
  • 25. Find_Next_state: process(Present_state) begin case Present_state is when "00" => if X = '0' then Next_state <= "10"; else Next_state <= "01"; end if; when "01" => Next_state <= "10"; when "11" => if X = '0' then Next_state <= "00"; else Next_state <= "10"; end if; when "10" => if X = '0' then Next_state <= "00"; else Next_state <= "01"; end if; when others => null; end case; end process; end bg; Dạng sóng mô phỏng: 11. Thiết kế mạch phát hiện chuỗi bit vào nối tiếp có trị là "101". Viết mã VHDL với: a) Dùng FSM loại Mealy với mô tả FSM. b) FSM loại Mealy dùng thanh ghi dịch chứa 3 bit liên tiếp và so sánh với "101". Bài giải. a) FSM loại Mealy Ta có được giản đồ trạng thái và bảng chuyển trạng thái như sau (kết quả lấy từ bài giảng thiết kế hệ tuần tự đồng bộ) Các BT giải sẵn về VHDL 2011 – trang 25
  • 26. Ta định nghĩa thêm kiểu mới cho các trạng thái  không cần gán trạng thái mà CAD sẽ tự gán trị cho nó. library ieee; use ieee.std_logic_1164.all; entity Q11_1 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q11_1; architecture bg of Q11_1 is type state_type is (S0, S1, S2); signal state: state_type; begin Z <= '1' when (state = S2 and X = '1') else '0'; process(CLK, reset_n) begin if (reset_n = '0') then state <= S0; elsif rising_edge(CLK) then case state is when S0 => if X = '1' then state <= S1; end if; when S1 => if X = '0' then state <= S2; end if; when S2 => if X = '0' then state <= S0; else state <= S1; end if; when others => null; end case; end if; end process; end bg; Các BT giải sẵn về VHDL 2011 – trang 26
  • 27. b) Thanh ghi dịch library ieee; use ieee.std_logic_1164.all; entity Q11_2 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q11_2; architecture bg of Q11_2 is signal pattern: std_logic_vector(2 downto 0); begin Z <= '1' when (pattern = "101" and X = ‘1’) else '0'; process(CLK, reset_n) begin if (reset_n = '0') then pattern <= (others => '0') ; elsif rising_edge(CLK) then pattern <= pattern(1 downto 0) & X; end if; end process; end bg; 12. Thiết kế mạch giải mã 3 sang 8 và mạch mã hóa ưu tiên 8 sang 3 (ưu tiên ngõ vào có trọng số thấp nhất khi có nhiều bit vào là 1).  Mạch giải mã có các ngõ vào là C, B, và A (LSB) và ra là Y.  Mạch mã hóa có ngõ vào 8 bit D_in và ngõ ra 3 bit D_out. Bài giải. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Dung cho ham conv_std_logic_vector(integer, number of bits) use ieee.std_logic_unsigned.all; -- Dung cho ham conv_integer(std_logic_vector) entity Q12_1 is port( C, B, A: in std_logic; -- A: LSB Y: out std_logic_vector(0 to 7); D_in: in std_logic_vector(0 to 7); D_out: out std_logic_vector(0 to 2)); end Q12_1; Các BT giải sẵn về VHDL 2011 – trang 27
  • 28. architecture bg of Q12_1 is signal CBA: std_logic_vector(0 to 2); signal CBA_int: integer range 0 to 7; begin -- Decoder 3 to 8 CBA <= C & B & A; CBA_int <= conv_integer(CBA); process (CBA_int) variable Y_int: std_logic_vector(0 to 7); begin Y_int := (others => '0'); Y_int(CBA_int) := '1'; Y <= Y_int; end process; -- -- Priority Encoder 8 to 3 process(D_in) variable index_in: integer; begin for i in D_in'length -1 downto 0 loop if D_in(i) = '1' then index_in := i; end if; end loop; D_out <= conv_std_logic_vector(index_in,3); end process; end bg; Dạng sóng mô phỏng của mạch giải mã: Dạng sóng mô phỏng của mạch mã hóa: Các BT giải sẵn về VHDL 2011 – trang 28
  • 29. 13. Thiết kế bộ đếm lên 3 bit loại nối tiếp (còn gọi là bộ đếm gợn hay bất đồng bộ) với xung nhịp vào CLK (kích cạnh). Mạch có ngõ reset tích cực thấp reset_n. Hãy viết mã VHDL với a) Mô hình cấu trúc với component DFF có sẵn. b) Các lệnh tuần tự. Bài giải. a) Dùng component DFF có sẵn của Maxplus II library ieee; use ieee.std_logic_1164.all; entity Q13_1 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q13_1; architecture bg of Q13_1 is COMPONENT DFF PORT (d : IN STD_LOGIC; clk : IN STD_LOGIC; clrn: IN STD_LOGIC; prn : IN STD_LOGIC; q : OUT STD_LOGIC ); END COMPONENT; -- Inputs | Output --prn clrn CLK D | Q -- L H X X | H -- H L X X | L -- L L X X | Illegal -- H H  L | L -- H H  H | H -- H H L X | Qo* -- H H H X | Qo -- * Qo = level of Q before Clock pulse -- All flipflops are positive-edge-triggered. signal D0, D1, D2, prn: std_logic; signal Q2_int, Q1_int, Q0_int: std_logic; begin U1: DFF port map(D0, CLK, reset_n, prn, Q0_int); U2: DFF port map(D1, D0, reset_n, prn, Q1_int); U3: DFF port map(D2, D1, reset_n, prn, Q2_int); prn <= '1'; D0 <= not Q0_int; D1 <= not Q1_int; D2 <= not Q2_int; Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int; end bg; Các BT giải sẵn về VHDL 2011 – trang 29
  • 30. c) Các lệnh tuần tự: library ieee; use ieee.std_logic_1164.all; entity Q13_2 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q13_2; architecture bg of Q13_2 is signal Q2_int, Q1_int, Q0_int: std_logic; begin process(CLK, reset_n) begin if reset_n = '0' then Q0_int <= '0'; elsif rising_edge(CLK) then Q0_int <= not Q0_int; end if; end process; process(Q0_int) begin if reset_n = '0' then Q1_int <= '0'; elsif falling_edge(Q0_int) then Q1_int <= not Q1_int; end if; end process; process(Q1_int) begin if reset_n = '0' then Q2_int <= '0'; elsif falling_edge(Q1_int) then Q2_int <= not Q2_int; end if; end process; Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int; end bg; Các BT giải sẵn về VHDL 2011 – trang 30
  • 31. Chú ý: Ta có thể khai báo buffer cho các đối tượng ra Q2, Q1, và Q0, khi đó không cần dùng các tín hiệu Q2_int, Q1_int, Q0_int. 14. Thiết kế bộ đếm lên 3 bit loại song song (còn gọi là bộ đếm đồng bộ) với xung nhịp vào CLK (kích cạnh). Mạch có ngõ reset tích cực thấp reset_n. Hãy viết mã VHDL với a) Mô hình cấu trúc với component JKFF có sẵn. b) Các lệnh tuần tự. c) Với dãy đếm 1, 3, 5, 7, 1, . . Bài giải. a) Mô hình cấu trúc với component JKFF có sẵn: library ieee; use ieee.std_logic_1164.all; entity Q14_1 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: buffer std_logic); -- Q0: LSB end Q14_1; architecture bg of Q14_1 is COMPONENT JKFF PORT (j : IN STD_LOGIC; k : IN STD_LOGIC; clk : IN STD_LOGIC; clrn: IN STD_LOGIC; prn : IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; -- Inputs | Output -- PRN CLRN CLK J K | Q -- L H X X X | H -- H L X X X | L -- L L X X X | Illegal -- H H L X X | Qo* -- H H  L L | Qo* -- H H  H L | H -- H H  L H | L -- H H  H H | Toggle -- * Qo = level of Q before Clock pulse -- All flipflops are positive-edge-triggered. signal J0, J1, J2, prn: std_logic; begin U1: JKFF port map(J0, J0, CLK, reset_n, prn, Q0); U2: JKFF port map(J1, J1, CLK, reset_n, prn, Q1); U3: JKFF port map(J2, J2, CLK, reset_n, prn, Q2); prn <= '1'; J0 <= '1'; J1 <= Q0; J2 <= Q1 and Q0; end bg; Các BT giải sẵn về VHDL 2011 – trang 31
  • 32. b) Các lệnh tuần tự: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; -- De tinh cong so nhi phan voi so nguyen entity Q14_2 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q14_2; architecture bg of Q14_2 is signal Q: std_logic_vector(2 downto 0); begin process(CLK) begin if reset_n ='0' then Q <= "000"; elsif rising_edge(CLK) then Q <= Q + 1; end if; end process; Q2 <= Q(2); Q1 <= Q(1); Q0 <= Q(0); end bg; c) Với dãy đếm 1, 3, 5, 7, 1, . . Chỉ cần sửa lại trong phần process của b) như sau: if reset_n ='0' then Q <= "001"; elsif rising_edge(CLK) then if Q = "111" then Q <= "001"; else Q <= Q + 2; end if; end if; Các BT giải sẵn về VHDL 2011 – trang 32