Thiết kế logic số (VLSI design)

Chương 2: Ngôn ngữ VHDL Bài giảng 5: Phát biểu đồng thời, mô hình FSM và testbench trên VHDL

Giáo viên: Hoàng Văn Phúc Bộ môn KT Xung-Số-Vi xử lý, Khoa Vô tuyến Điện tử 02/2017

https://sites.google.com/site/phucvlsi/teaching

Giới thiệu Bài giảng

 Nội dung: Phát biểu đồng thời; mô tả FSM; VHDL

 Thời lượng: 3 tiết bài giảng  Phương pháp: Thuyết trình (Slides, Bảng), Thảo luận,

testbench

 Yêu cầu: Đọc trước Slides và tài liệu GV đã gửi  Mục tiêu: Nắm được cách sử dụng các phát biểu đồng

Minh hoạ trên ModelSim

 Tài liệu tham khảo:

 Giáo trình “Thiết kế logic số”, HVKTQS, 2012, chương 2.  Circuit design with VHDL, MIT Press, 2005, chapter 5.

thời; cách mô tả FSM và viết testbench trên VHDL

2

Chương 2: Ngôn ngữ VHDL

Nhắc lại bài cũ

 VHDL khác với các ngôn ngữ lập trình khác như thế

nào?

 Hai loại phát biểu trong VHDL: tuần tự và đồng thời  Các phát biểu tuần tự cơ bản: If, case, loop

 Ứng dụng chính của phát biểu tuần tự: các mạch số

tuần tự, cấu trúc mô phỏng kiểm tra

3

Chương 2: Ngôn ngữ VHDL

Câu hỏi thảo luận chính

 Điểm khác biệt giữa phát biểu tuần tự và

đồng thời?

 Phân biệt generic và constant trong VHDL?  Phân biệt các phát biểu loop và generate?  Phân biệt các phát biểu gán tín hiệu có điều

kiện và các phát biểu if, case?

 Khi nào dùng kiểu testbench tự động?

4

Chương 2: Ngôn ngữ VHDL

VHDL statements (Phát biểu VHDL)

VHDL statements

Concurrent Sequential

Đồng thời

Tuần tự

5

Chương 2: Ngôn ngữ VHDL

Concurrent statements (Phát biểu đồng thời)

KN: Là các phát biểu được thực thi đồng thời -> Việc thực thi không phụ thuộc vào vị trí xuất hiện của chúng trong chương trình

Vị trí: Trực tiếp trong mô tả kiến trúc

Ứng dụng: Dùng mô tả cho mạch dạng cấu trúc hoặc dataflow Cách gọi khác: phát biểu song song, dataflow

6

Chương 2: Ngôn ngữ VHDL

Concurrent statements (Phát biểu đồng thời)

 Gán tín hiệu (dùng toán tử)

 Mô tả PROCESS

 GENERATE

 Cài đặt component (COMPONENT INSTALLATION)

 Gán tín hiệu đồng thời (Concurrent Signal Assignment)

7

Chương 2: Ngôn ngữ VHDL

Gán tín hiệu (dùng toán tử)

S <= (A xor B) xor Cin; Cout <= (A and B) or (Cin and (A xor B));

Phần cứng tạo ra:

8

Chương 2: Ngôn ngữ VHDL

Nhắc lại về PROCESS

 Mô tả mạch theo hành vi

 Mỗi khối câu lệnh PROCESS là một khối lệnh tuần tự

 Khối PROCESS không có danh sách Sensitive list thì bắt buộc

phải xuất hiện lệnh WAIT

9

 Không giới hạn số lệnh PROCESS trong một mô tả kiến trúc

Chương 2: Ngôn ngữ VHDL

COMPONENT INSTALLATION

Khai báo (Declaration):

COMPONENT component_name IS GENERIC (generic_declarations ); PORT (input,_output_declarations); END COMPONENT component_name;

10

Cài đặt (Installation): instant_name: COMPONENT component_name GENERIC MAP( generics => generic values) PORT MAP (inputs_and_outputs => signals);

Chương 2: Ngôn ngữ VHDL

Ví dụ 1: Thanh ghi dịch

Sử dụng thiết kế D-FF ba lần

11

Khai báo và cài đặt component

Chương 2: Ngôn ngữ VHDL

Ví dụ 1: Thanh ghi dịch (tiếp)

Dạng đầy đủ

begin DFF1: D_flipflop port map (D => Din, CLK => CLK, Q => Q1); DFF2: D_flipflop port map (D => Q1, CLK => CLK, Q => Q2); DFF3: D_flipflop port map (Q2, CLK, Dout); end structure;

Dạng rút gọn

12

library IEEE; use IEEE.STD_LOGIC_1164.ALL; ----------------------------- entity shift_reg is port( Din : in std_logic; CLK : in std_logic; Dout : out std_logic ); end shift_reg; ----------------------------- architecture struct of shift_reg is signal Q1, Q2 : std_logic; component D_flipflop port( D : in std_logic; CLK : in std_logic; Q : out std_logic ); end component;

Ví dụ 2: Bộ đếm cấu hình được (configurable counter)

entity counter is generic ( N : natural; top_value : std_logic_vector(15 downto 0); SETTOP : boolean := FALSE ); port ( count :out std_logic_vector(N-1 downto 0); enable :in std_logic; clk :in std_logic; reset :in std_logic); end entity;

13

Chương 2: Ngôn ngữ VHDL

Khai báo component cho bộ đếm

component counter is generic ( N : natural; top_value : std_logic_vector(15 downto 0); SETTOP : boolean := FALSE ); port ( count :out std_logic_vector(N-1 downto 0); enable :in std_logic; clk :in std_logic; reset :in std_logic); end component;

14

Chương 2: Ngôn ngữ VHDL

Cài đặt component cho các bộ đếm

Dạng đầy đủ

Dạng rút gọn

-- installation of 4-bit and 8-bit counters counter1: counter generic map (N => 16, top_value => x"000a", SETTOP => TRUE) port map (count => cnt1, enable => enable, clk => clk, reset => reset); counter2: counter generic map (4, x"000b", FALSE) port map (cnt2, enable, clk, reset); counter3: counter generic map (8, x"001b", TRUE) port map (cnt3, enable, clk, reset);

15

Chương 2: Ngôn ngữ VHDL

CONCURENT SIGNAL ASSIGNMENT

 Gán tín hiệu dùng When  Gán tín hiệu dùng With … Select

16

___________________________________________ Concurrent signal assignment: Gán tín hiệu đồng thời

Chương 2: Ngôn ngữ VHDL

Gán tín hiệu dùng When

17

target <= waveform1 when condition1 else waveform2 when condition2 else • • • waveformN–1 when conditionN–1 else waveformN when conditionN else default_waveform;

Chương 2: Ngôn ngữ VHDL

Gán tín hiệu dùng With … Select

18

WITH expression SELECT target <= waveform1 WHEN choice_list1, waveform2 WHEN choice_list2, • • • waveformN–1 WHEN choice_listN–1, waveformN WHEN choice_listN, default_value WHEN OTHERS;

Chương 2: Ngôn ngữ VHDL

Thiết kế MUX dùng phát biểu đồng thời và tuần tự

din_1 when others;

library ieee; use ieee.std_logic_1164.all; ----------------------------- entity mux2 is port ( din_0 :in std_logic; din_1 :in std_logic; sel :in std_logic; dout :out std_logic); end entity; ----------------------------- architecture bhv of mux2 is begin with (sel) select dout <= din_0 when '0', end bhv;

library ieee; use ieee.std_logic_1164.all; ----------------------------- entity mux2 is port ( din_0 :in std_logic; din_1 :in std_logic; sel :in std_logic; dout :out std_logic); end entity; ----------------------------- architecture bhv of mux2 is begin process(din_0, din_1,sel) begin case sel is when '0' => dout <= d_in0; when others => dout <= d_in1; end case; end process; end bhv;

19

.

GENERATE

[label]:for generate_parameter_specification generate { concurrent_statement } end generate [label];

20

[label]: if condition generate { concurrent_statement } end generate [label];

Chương 2: Ngôn ngữ VHDL

Ví dụ với GENERATE (1)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; ---------------------------------------- entity adder4_gen is port( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); CI : in std_logic; SUM : out std_logic_vector(3 downto 0); CO : out std_logic ); end adder4_gen; ------------------------------

architecture dataflow of adder4_gen is signal C: std_logic_vector (4 downto 0); begin C(0) <= CI; CO <= C(4); Carry: for i in 1 to 4 generate C(i) <= (A(i-1) and B(i-1)) or (C(i-1) and (A(i-1) or B(i-1))); end generate Carry; Suma: FOR i IN 0 to 3 GENERATE SUM(i) <= A(i) xor B(i) xor C(i); END GENERATE Suma; end dataflow;

Sơ đồ mạch?

21

Chương 2: Ngôn ngữ VHDL

Ví dụ với GENERATE (2)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; ----------------------------------------- entity generate_expample2 is port( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); O : out std_logic_vector(1 downto 0) ); end generate_expample2; ------------------------------------------ architecture dataflow of generate_expample2 is begin msk: FOR i IN 0 to 3 GENERATE ifgen: IF i rem 2 = 0 GENERATE O(i/2) <= A(i) and B(i); END GENERATE ifgen; END GENERATE msk; end dataflow;

22

Sơ đồ mạch?

Chương 2: Ngôn ngữ VHDL

Mô tả máy trạng thái (FSM)

 Mô hình Moore vs Mealey  1-process FSM  2-process FSM

FSM

23

Moore machine Mealy machine

Chương 2: Ngôn ngữ VHDL

Moore vs Mealey (FSM)

X = 0

24

State type declaration

Khai báo kiểu:

-- declare the (state-machine) enumerated type type FSM_States is (RST, CNT, LOAD, OUT);

Khai báo tín hiệu:

-- declare signals of FSM_States type signal current_state, next_state: FSM_States;

25

current_state, next_state chỉ nhận một trong các giá trị trong tập hợp sau: RST, CNT, LOAD, OUT

Chương 2: Ngôn ngữ VHDL

1-Process FSM

X

Z

next_state <= ... ; Z <= ... ;

process(clk, rst) begin if(rst = ‘1’) then state <= s0; Z <= ‘0’; elsif (rising_edge(clk)) then case state is when S0 => next_state <= .... ; Z <= ... ; when S1 => end case; end if; end process;

26

Chương 2: Ngôn ngữ VHDL

2-Process Moore State Machine

X

Z

process (state) begin case state is when S0 => Z <= ... ; when S1 => Z <= ... ; end case; end process;

if( X = ‘1’) then next_state <= ... ; end if;

process ( clk, rst) begin if(rst = ‘1’) then State <= S0; elsif (rising_edge(clk)) then case state is when S0 => if(X =’1’) then next_state <= ... ; end if; when S1 => end case; end if; end process;

27

Chương 2: Ngôn ngữ VHDL

2-Process Mealy FSM

Z

X

if(X=’1’) then

end if;

if( X = ‘1’) then next state <= ... ; end if;

process (clk, rst) begin if(rst = ‘1’) then state <= S0; elsif (rising_edge(clk)) then case state is when S0 => next state <= ... ; when S1 => end case; end process;

process (state, X) begin case state is when S0 => if(X=’1’) then Z <= ... ; else Z <= ... ; end if; when S1 => if(X=’1’) then Z <= ... ; else Z <= ... ; end if; end case; end process;

28

Chương 2: Ngôn ngữ VHDL

Ví dụ thiết kế FSM đơn giản

_

29

Chương 2: Ngôn ngữ VHDL

Example: 1-Process Mealy FSM

library IEEE;

use IEEE.std_logic_1164.all;

entity fsm is

port ( clk, reset, x1 : IN std_logic;

outp : OUT std_logic);

when s1 => if x1='1' then state <= s2; else state <= s3;

end entity;

architecture beh1 of fsm is

type state_type is (s1,s2,s3,s4);

outp <= '1'; when s2 => state <= s4; outp <= '1'; when s3 => state <= s4; outp <= '0'; when s4 => state <= s1; outp <= '0';

signal state: state_type ;

begin

process (clk, reset)

begin if (reset ='1') then state <=s1; outp<='1'; elsif (clk='1' and clk'event) then case state is end if; end case; end if; end process; end beh1;

30

Chương 2: Ngôn ngữ VHDL

2-Process FSM

library IEEE;

use IEEE.std_logic_1164.all;

else state <= s3; end if;

entity fsm is

port ( clk, reset, x1 : IN std_logic;

outp : OUT std_logic);

end entity;

architecture beh1 of fsm is

type state_type is (s1,s2,s3,s4);

signal state: state_type ;

begin

process1: process (clk, reset)

begin

if (reset ='1') then state <=s1;

case state is when s1 => if x1='1' then state <= s2; when s2 => state <= s4; when s3 => state <= s4; when s4 => state <= s1; end case; end if; end process process1; process2 : process (state) begin case state is when s1 => outp <= '1'; when s2 => outp <= '1'; when s3 => outp <= '0'; when s4 => outp <= '0'; end case; end process process2; end beh1;

31

elsif (clk='1' and clk„event) then

VHDL testbench (Chương trình mô phỏng/kiểm tra thiết kế VHDL)

DUT

Output Verification

Input generate

DUT: Design Under Test

32

Chương 2: Ngôn ngữ VHDL

Example: VHDL Testbench

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

-------------------------------------------

entity adder4_test is

end adder4_test;

-------------------------------------------

architecture test of adder4_test is

component adder4 is

port (

A : in std_logic_vector(3 downto 0);

B : in std_logic_vector(3 downto 0);

CI : in std_logic;

-- khai bao cac tin hieu vao ra cho DUT signal A : std_logic_vector(3 downto 0) := "0101"; signal B : std_logic_vector(3 downto 0) := "1000"; signal CI : std_logic := '1'; -- output--- signal SUM : std_logic_vector(3 downto 0); signal CO : std_logic; begin DUT: component adder4 port map ( A => A, B=> B, CI => CI, SUM => SUM, CO =>CO ); end test;

SUM : out std_logic_vector(3 downto 0);

CO : out std_logic

);

33

end component;

Mô hình kiểm tra tự động

34

DUT: Design Under Test

Chương 2: Ngôn ngữ VHDL

Mô hình kiểm tra tự động: Ví dụ

35

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ----------------------------------------- entity adder4_etalon is port( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); CI : in std_logic; SUM : out std_logic_vector(3 downto 0); CO : out std_logic); end adder4_etalon; ------------------------------------------ architecture behavioral of adder4_etalon is signal s_sig: std_logic_vector(4 downto 0); signal a_sig: std_logic_vector(4 downto 0); signal b_sig: std_logic_vector(4 downto 0); begin a_sig <= '0' & A; b_sig <= '0' & B; plus: process (a_sig, b_sig, CI) begin s_sig <= a_sig + b_sig + CI; end process plus; SUM <= s_sig (3 downto 0); CO <= s_sig (4); end behavioral;

Mô hình kiểm tra tự động: Ví dụ

component adder4_etalon port (A : in std_logic_vector (3 downto 0); B : in std_logic_vector (3 downto 0); CI : in std_logic; SUM : out std_logic_vector (3 downto 0); CO : out std_logic ); end component; BEGIN --create clock create_clock: process begin clk <= '0'; wait for 50 ns; clk <= '1'; wait for 50 ns; end process create_clock; check: process (clk) variable info: line; variable test_cnt: integer := 0; begin if clk = '1' and clk'event then write(info, string'("Test # ")); write(info, integer'(test_cnt + 1)); write(info, string'(" a = ")); write(info, integer'(conv_integer(a_t))); write(info, string'(" b = "));

36

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; library STD; use STD.TEXTIO.ALL; ----------------------------------------- entity adder4_testbench is end adder4_testbench; ----------------------------------------- architecture testbenchfull of adder4_testbench is signal a_t : std_logic_vector(3 downto 0) := "0000"; signal b_t : std_logic_vector(3 downto 0) := "0000"; signal sum_t : std_logic_vector(3 downto 0); signal sum_e : std_logic_vector(3 downto 0); signal ci_t : std_logic := '0'; signal co_t : std_logic; signal co_e : std_logic; signal clk : std_logic := '0'; component adder4 port (A : in std_logic_vector (3 downto 0); B : in std_logic_vector (3 downto 0); CI : in std_logic; SUM : out std_logic_vector (3 downto 0); CO : out std_logic ); end component;

Mô hình kiểm tra tự động: Ví dụ

assert test_cnt < 512 report "end simulation" severity NOTE; end if; end process check; -- component installation dut: adder4 port map ( A => a_t, B => b_t, CI => ci_t, SUM =>sum_t, CO => co_t); etalon: adder4_etalon port map (A => a_t, B => b_t, CI => ci_t, SUM =>sum_e, CO => co_e); END testbenchfull;

write(info, integer'(conv_integer(b_t))); write(info, string'(" CI = ")); write(info, integer'(conv_integer(ci_t))); write(info, string'(" sum = ")); write(info, integer'(conv_integer(sum_t))); write(info, string'(" CO = ")); write(info, integer'(conv_integer(co_t))); write(info, string'(" sum_e = ")); write(info, integer'(conv_integer(sum_e))); write(info, string'(" CO_e = ")); write(info, integer'(conv_integer(co_e))); if sum_e /= sum_t or co_e /= co_t then write(info, string'("FAILURE")); else write(info, string'(" OK")); end if; writeline(output, info); -- input data generator. test_cnt := test_cnt + 1; ci_t <= not ci_t; if ci_t = '1' then a_t <= a_t +1; end if; if a_t = "1111" then b_t <= b_t + 1; end if;

37

Trắc nghiệm

Câu 1: Cấu trúc lệnh FOR … GENERATE thường dùng trong trường hợp nào A. Dùng cho các cấu trúc chương trình lặp đi lặp lại giống

B. Dùng cho các cấu trúc mô tả lặp lại giống nhau hoặc có

nhau trong mô tả thiết kế.

quy luật.

C. Dùng để mô tả cho vòng lặp cứng trong thiết kế.

D. Dùng mô tả các cấu trúc phần cứng có tính tùy biến về

38

số lượng các khối cài đặt.

Chương 2: Ngôn ngữ VHDL

Trắc nghiệm

Câu 2: Bản chất của câu lệnh PROCESS trong VHDL

A. Tạo một quá trình trong mô tả kiến trúc của thiết kế.

B. Là một khối lệnh tuần tự.

được xem như một cấu trúc lệnh đồng thời.

C. Là một khối lệnh chứa là các lệnh tuần tự nhưng

D. Là một câu lệnh đồng thời sử dụng trong mô tả các

39

quá trình.

Chương 2: Ngôn ngữ VHDL

Trắc nghiệm

Câu 3: Ưu điểm cơ bản của sử dụng câu lệnh gán tín hiệu đồng thời so với sử dụng cấu trúc tuần tự tương đương

A. Mang lại kết quả thiết kế tối ưu hơn

B. Mã chương trình đơn giản và ngắn gọn hơn

C. Mô tả sát hơn cấu trúc của mạch và giảm thiểu khả năng

D. Giảm thiểu khả năng gây ra lỗi chức năng của mạch

40

gây lỗi

Chương 2: Ngôn ngữ VHDL

Trắc nghiệm

Câu 4: Biến generic được sử dụng như thế nào trong thiết kế VHDL

A. Là các tham biến tĩnh ví dụ độ rộng bit, quy định cấu hình

chức năng….

B. Sử dụng như tham biến khi thiết kế nhưng phải là hằng số

khi sử dụng.

kế như một khối con.

C. Là một biến phát sinh ra trong quá trình sử dụng khối thiết

D. Sử dụng để quy định cho các đặc tính của các tham biến

41

động trong thiết kế.

Chương 2: Ngôn ngữ VHDL

Trắc nghiệm

Câu 5: Phân biệt tác dụng của lệnh IF tuần tự và IF… GENERATE

A. Lệnh IF tuần tự chỉ tác động lên các khối mô tả tuần tự còn lệnh IF

… GENERATE tác động lên khối lệnh song song

B. Lệnh IF tuần tự chỉ tác động lên các tham biến động còn lệnh

IF … GENERATE tác động lên các tham biến tĩnh.

C. Lệnh IF tuần tự là câu lệnh rẽ nhánh có điều kiện phân cấp còn

IF… GENERATE là lệnh với một giá trị điều kiện.

D. Lệnh IF tuần tự làm thay đổi cấu trúc thiết kế hiện tại theo điều kiện

logic của tham biến cài đặt còn IF … GENERATE cài đặt/hoặc

không cài đặt theo điều kiện của tham biến tĩnh trong câu lệnh.

42

Chương 2: Ngôn ngữ VHDL