Bài giảng Thiết kế logic số - Chương 2: Ngôn ngữ VHDL (Phần 5) - Hoàng Văn Phú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
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Thiết kế logic số - Chương 2: Ngôn ngữ VHDL (Phần 5) - Hoàng Văn Phúc", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Thiết kế logic số - Chương 2: Ngôn ngữ VHDL (Phần 5) - Hoàng Văn Phúc
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
File đính kèm:
- bai_giang_thiet_ke_logic_so_chuong_2_ngon_ngu_vhdl_phan_5_ho.pdf