Bài giảng Thiết kế logic số: Lecture 2.5 do TS. Hoàng Văn Phúc biên soạn nhằm mục đích phục vụ cho việc giảng dạy. Nội dung bài giảng gồm: Phát biểu đồng thời, mô hình FSM và testbench trên VHDL, 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.
Trang 1Thiế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
Trang 2 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
Trang 3 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
tuần tự, cấu trúc mô phỏng kiểm tra
Nhắc lại bài cũ
Trang 4 Đ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 gán tín hiệu có điều
kiện và các phát biểu if, case?
Câu hỏi thảo luận chính
Trang 5VHDL statements (Phát biểu VHDL)
VHDL statements
5
Chương 2: Ngôn ngữ VHDL
Trang 6Concurrent statements (Phát biểu đồ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
Trang 10instant_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
Trang 12DFF1: 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
Trang 13count :out std_logic_vector(N-1 downto 0);
enable :in std_logic;
Trang 14Khai báo component cho bộ đếm
count :out std_logic_vector(N-1 downto 0);
enable :in std_logic;
clk :in std_logic;
reset :in std_logic);
end component;
Trang 15installation of 4-bit and 8-bit counters
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
Dạng đầy đủ
Dạng rút gọn
Trang 16 Gán tín hiệu dùng When
Gán tín hiệu dùng With … Select
CONCURENT SIGNAL ASSIGNMENT
_
Concurrent signal assignment: Gán tín hiệu đồng thời
Trang 17target <= 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
Trang 18WITH expression SELECT
target <= waveform1 WHEN choice_list1,
waveform2 WHEN choice_list2,
default_value WHEN OTHERS;
Gán tín hiệu dùng With … Select
Trang 19din_0 :in std_logic;
din_1 :in std_logic;
sel :in std_logic;
dout :out std_logic);
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;
Trang 21CO <= 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?
Trang 22ifgen: 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?
Trang 23Mô tả máy trạng thái (FSM)
Mô hình Moore vs Mealey
1-process FSM
Moore machine
Mealy machine
Trang 24Moore vs Mealey (FSM)
24
X = 0
Trang 25State 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
Trang 261-Process FSM
process(clk, rst)
begin if(rst = ‘1’) then state <= s0;
next_state <= ;
Z <= ; end case;
end if;
end process;
Trang 272-Process Moore State Machine
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;
Trang 282-Process Mealy FSM
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
Trang 29Ví dụ thiết kế FSM đơn giản
_
Trang 30Example: 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;
Trang 31library IEEE;
use IEEE.std_logic_1164.all;
entity fsm is
port ( clk, reset, x1 : IN std_logic;
outp : OUT std_logic);
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;
end process process1;
process2 : process (state) begin
case state is when s1 => outp <= '1';
Trang 32VHDL testbench (Chương trình mô phỏng/kiểm tra thiết kế VHDL)
DUT
Input
generate
Output Verification
DUT: Design Under Test
Trang 33khai 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
Trang 34Mô hình kiểm tra tự động
Mô hình tham
chiếu
Kết quả kiểm tra
DUT: Design Under Test
Trang 35Mô hình kiểm tra tự động: Ví dụ
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);
s_sig <= a_sig + b_sig + CI;
end process plus;
SUM <= s_sig (3 downto 0);
CO <= s_sig (4);
Trang 36Mô hình kiểm tra tự động: Ví dụ
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;
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
variable test_cnt: integer := 0;
Trang 37Mô hình kiểm tra tự động: Ví dụ
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
Trang 38Trắ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
Trang 39C 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
Trang 40
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
Trang 41C 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ế
Trang 42Trắ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