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