Bài giảng Thiết kế logic số - Chương 2.5: Phát biểu đồng thời, mô hình FSM và testbench trên VHDL - Hoàng Văn Phúc
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
nhau trong mô tả thiết kế.
B. Dùng cho các cấu trúc mô tả lặp lại giống nhau hoặc có
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ề
số lượng các khối cài đặt
42 trang |
Chia sẻ: huongthu9 | Lượt xem: 719 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Thiết kế logic số - Chương 2.5: Phát biểu đồng thời, mô hình FSM và testbench trên VHDL - Hoàng Văn Phúc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Thiết kế logic số
(VLSI design)
https://sites.google.com/site/phucvlsi/teaching
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
Nội dung: Phát biểu đồng thời; mô tả FSM; VHDL
testbench
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,
Minh hoạ trên ModelSim
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
thời; cách mô tả FSM và viết testbench trên VHDL
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.
Giới thiệu Bài giảng
Chương 2: Ngôn ngữ VHDL 2
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
Nhắc lại bài cũ
Chương 2: Ngôn ngữ VHDL 3
Đ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?
Câu hỏi thảo luận chính
Chương 2: Ngôn ngữ VHDL 4
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
Mô tả PROCESS
Cài đặt component (COMPONENT INSTALLATION)
GENERATE
Gán tín hiệu đồng thời (Concurrent Signal Assignment)
7
Concurrent statements (Phát biểu đồng thời)
Chương 2: Ngôn ngữ VHDL
Gán tín hiệu (dùng toán tử)
8
Gán tín hiệu (dùng toán tử)
Chương 2: Ngôn ngữ VHDL
S <= (A xor B) xor Cin;
Cout <= (A and B) or
(Cin and (A xor B));
Phần cứng tạo ra:
Nhắc lại về PROCESS
Mỗi khối câu lệnh PROCESS là một khối lệnh tuần tự
Mô tả mạch theo hành vi
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
Không giới hạn số lệnh PROCESS trong một mô tả kiến trúc
9 Chương 2: Ngôn ngữ VHDL
COMPONENT component_name IS
GENERIC (generic_declarations );
PORT (input,_output_declarations);
END COMPONENT component_name;
COMPONENT INSTALLATION
instant_name: COMPONENT component_name
GENERIC MAP( generics => generic values)
PORT MAP (inputs_and_outputs => signals);
Khai báo (Declaration):
Cài đặt (Installation):
10 Chương 2: Ngôn ngữ VHDL
Ví dụ 1: Thanh ghi dịch
11 Chương 2: Ngôn ngữ VHDL
Q
Q
SET
CLR
D
Q
Q
SET
CLR
D
Q
Q
SET
CLR
D
Din
CLK
Dout
Sử dụng thiết kế D-FF ba lần
Khai báo và cài đặt component
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;
12
Ví dụ 1: Thanh ghi dịch (tiếp)
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 đầy đủ
Dạng rút gọn
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;
Ví dụ 2: Bộ đếm cấu hình được (configurable counter)
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;
Chương 2: Ngôn ngữ VHDL 14
-- 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);
Cài đặt component cho các bộ đếm
Chương 2: Ngôn ngữ VHDL 15
Dạng
đầy đủ
Dạng
rút gọn
Gán tín hiệu dùng When
Gán tín hiệu dùng With Select
CONCURENT SIGNAL ASSIGNMENT
Chương 2: Ngôn ngữ VHDL 16
___________________________________________
Concurrent signal assignment: Gán tín hiệu đồng thời
target <= waveform1 when condition1 else
waveform2 when condition2 else
•
•
•
waveformN–1 when conditionN–1 else
waveformN when conditionN else
default_waveform;
Gán tín hiệu dùng When
Chương 2: Ngôn ngữ VHDL 17
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;
Gán tín hiệu dùng With Select
Chương 2: Ngôn ngữ VHDL 18
.
Thiết kế MUX dùng phát biểu đồng thời và tuần tự
19
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',
din_1 when others;
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;
[label]:for generate_parameter_specification
generate
{ concurrent_statement }
end generate [label];
GENERATE
[label]: if condition
generate
{ concurrent_statement }
end generate [label];
Chương 2: Ngôn ngữ VHDL 20
Ví dụ với GENERATE (1)
Chương 2: Ngôn ngữ VHDL 21
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?
Ví dụ với GENERATE (2)
Chương 2: Ngôn ngữ VHDL 22
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;
Sơ đồ mạch?
Mô tả máy trạng thái (FSM)
Mô hình Moore vs Mealey
1-process FSM
2-process FSM
FSM
Moore
machine
Mealy
machine
Chương 2: Ngôn ngữ VHDL 23
Moore vs Mealey (FSM)
24
X = 0
State type declaration
-- declare the (state-machine) enumerated type
type FSM_States is (RST, CNT, LOAD, OUT);
-- declare signals of FSM_States type
signal current_state, next_state: FSM_States;
Khai báo kiểu:
Khai báo tín hiệu:
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 25
1-Process FSM
Chương 2: Ngôn ngữ VHDL 26
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 =>
next_state <= ... ;
Z <= ... ;
end case;
end if;
end process;
X Z
2-Process Moore State Machine
Chương 2: Ngôn ngữ VHDL 27
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 =>
if( X = ‘1’) then
next_state <= ... ;
end if;
end case;
end if;
end process;
process (state)
begin
case state is
when S0 => Z <= ... ;
when S1 => Z <= ... ;
end case;
end process;
X Z
2-Process Mealy FSM
Chương 2: Ngôn ngữ VHDL 28
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 =>
if( X = ‘1’) then
next state <= ... ;
end if;
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;
X
Z
Ví dụ thiết kế FSM đơn giản
_
Chương 2: Ngôn ngữ VHDL 29
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);
end entity;
architecture beh1 of fsm is
type state_type is (s1,s2,s3,s4);
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
when s1 =>
if x1='1' then state <= s2;
else state <= s3;
end if;
outp <= '1';
when s2 => state <= s4; outp <= '1';
when s3 => state <= s4; outp <= '0';
when s4 => state <= s1; outp <= '0';
end case;
end if;
end process;
end beh1;
Chương 2: Ngôn ngữ VHDL 30
31
library IEEE;
use IEEE.std_logic_1164.all;
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;
elsif (clk='1' and clk„event) then
2-Process FSM
case state is
when s1 => if x1='1' then state <= s2;
else state <= s3;
end if;
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;
VHDL testbench
(Chương trình mô phỏng/kiểm tra thiết kế VHDL)
DUT
Input
generate
Output
Verification
DUT: Design Under Test
Chương 2: Ngôn ngữ VHDL 32
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;
SUM : out std_logic_vector(3 downto 0);
CO : out std_logic
);
end component;
-- 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;
33
Mô hình kiểm tra tự động
Chương 2: Ngôn ngữ VHDL 34
DUT
Tạo giá trị
đầu vào
So sánh
giá trị
đầu ra
Mô hình tham
chiếu
Kết quả
kiểm tra
DUT: Design Under Test
Mô hình kiểm tra tự động: Ví dụ
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;
35
Mô hình kiểm tra tự động: Ví dụ
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;
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
Mô hình kiểm tra tự động: Ví dụ
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;
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;
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
nhau trong mô tả thiết kế.
B. Dùng cho các cấu trúc mô tả lặp lại giống nhau hoặc có
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ề
số lượng các khối cài đặt.
Chương 2: Ngôn ngữ VHDL 38
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. Là một khối lệnh chứa là các lệnh tuần tự nhưng
được xem như một cấu trúc lệnh đồng thời.
D. Là một câu lệnh đồng thời sử dụng trong mô tả các
quá trình.
Chương 2: Ngôn ngữ VHDL 39
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
gây lỗi
D. Giảm thiểu khả năng gây ra lỗi chức năng của mạch
Chương 2: Ngôn ngữ VHDL 40
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.
C. Là một biến phát sinh ra trong quá trình sử dụng khối thiết
kế như một khối con.
D. Sử dụng để quy định cho các đặc tính của các tham biến
động trong thiết kế.
Chương 2: Ngôn ngữ VHDL 41
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.
Chương 2: Ngôn ngữ VHDL 42
Các file đính kèm theo tài liệu này:
- bai_giang_thiet_ke_logic_so_chuong_2_5_phat_bieu_dong_thoi_m.pdf