Vhdl Slides

9,575 views

Published on

VHDL - Thầy Lê Hải Sâm

Published in: Technology, Design
6 Comments
11 Likes
Statistics
Notes
No Downloads
Views
Total views
9,575
On SlideShare
0
From Embeds
0
Number of Embeds
52
Actions
Shares
0
Downloads
900
Comments
6
Likes
11
Embeds 0
No embeds

No notes for slide
  • Vhdl Slides

    1. 1. Bài 1 <ul><li>Vấn đề Mô hình hoá phần cứng </li></ul><ul><li>(Hardware Modeling) </li></ul>
    2. 2. VHDL là gì? <ul><li>Một từ viết tắt cho một từ viết tắt khác, VHDL là từ viết tắt của VHSIC Hardware Description Language </li></ul><ul><ul><li>Còn VHSIC là từ viết tắt của Very High Speed Integrated Circuit </li></ul></ul><ul><li>Tiếp theo, chúng ta bắt đầu tìm hiểu về xuất xứ và mục đích của ngôn ngữ này </li></ul>
    3. 3. VHDL - Mục đích và sự hình thành <ul><li>VHDL, trước hết và chủ yếu là một công cụ để mô hình hoá phần cứng (hardware modeling) </li></ul><ul><ul><li>Để mô phỏng (simulation) và tổng hợp (synthesis) mạch </li></ul></ul><ul><li>Chuẩn IEEE 1076 rất hoàn chỉnh cho việc mô hình hoá thiết bị, nhưng nó mới chỉ định nghĩa các tham số khái quát cho việc tổng hợp thiết bị </li></ul><ul><li>Kết quả: một mô hình phần cứng đã cho không hẳn đã phù hợp với một thiết kế ở mức cổng logic đã có thông qua các công cụ và các công nghệ đích (target) khác nhau </li></ul>
    4. 4. Chuẩn hoá VHDL <ul><li>Tổ chức IEEE chính thức phê chuẩn chấp nhận ngôn ngữ VHDL như là một chuẩn của họ vào năm 1987, chuẩn IEEE 1076 </li></ul><ul><ul><li>Giống như các chuẩn kác của IEEE, chuẩn IEEE 1076 được sửa đổi theo chu kỳ tối thiểu là 5 năm </li></ul></ul><ul><li>Sửa đổi đầu tiên được thực hiện năm 1993, và VHDL-93 hiện nay được coi là phiên bản chính thức của ngôn ngữ này, hiện nay bắt đầu xuất hiện VHDL 200X </li></ul><ul><ul><li>Tuy nhiên, hầu hết các công cụ (tool) </li></ul></ul><ul><ul><li>đều hỗ trợ phiên bản đầu tiên (VHDL-87) </li></ul></ul><ul><ul><li>Các bộ phận của VHDL 200X </li></ul></ul><ul><ul><li>được hỗ trợ bởi một số tool </li></ul></ul>VHDL-87 VHDL-93 VHDL-2X
    5. 5. Language Subsets <ul><li>Không phải tất cả các cấu trúc VHDL đều có thể tổng hợp được. Ví dụ, wait for 10 ns là một cấu trúc mô hình hoá thông dụng, nhưng nó không tương ứng với và cũng không thể tạo ra một phần tử ở mức cổng logic </li></ul>IEEE 1076 (modeling) IEEE 1076 (synthesis)
    6. 6. Các mức trừu tượng trong mô tả phần cứng Behavioral Logic RTL Layout Ít chi tiết hơn, thiết kế và mô phỏng nhanh hơn Chi tiết hơn, phụ thuộc công nghệ, thiết kế và mô phỏng chậm hơn DFF AND_OR2 CLB_R5C5 CLB_R5C6 F
    7. 7. Sự chồng chéo trong VHDL Behavioral Logic RTL Layout Place & Route Utility FPGA Vendor Library Synthesizable Code Hardware Model Sum <= A + B after 3 ns ; Sum <= A + B ; component Xlx_add2 port ( A: in bit ; B: in bit ; Sum: out bit ); end component ;
    8. 8. Trình tự thiết kế Top-Down <ul><li>VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế </li></ul>
    9. 9. Nguyên tắc phân đoạn <ul><li>Khi tiến hành phân đoạn một thiết kế trong VHDL, cần lưu tâm cân nhắc một số các điểm chính sau </li></ul><ul><ul><li>Tín hiệu ra có chốt (Register) tại biên giới các module </li></ul></ul><ul><ul><ul><li>Phù hợp với cấu trúc mã nguồn dạng RTL </li></ul></ul></ul><ul><ul><li>Giảm đến tối thiểu số clock trên mỗi block </li></ul></ul><ul><ul><ul><li>Quan trọng đối với các ràng buộc về thời gian, Important for timing constraints, tối ưu hoá cấu trúc mạch </li></ul></ul></ul><ul><ul><li>Duy trì các tín hiệu then chốt trong phạm vi mỗi block </li></ul></ul><ul><ul><ul><li>Hầu hết các công cụ đều không tối ưu thông qua biên giới hierarchy </li></ul></ul></ul><ul><ul><li>Kích thước của từng block đủ nhỏ để có thể kiểm tra nhanh chóng </li></ul></ul><ul><ul><ul><li>Mẫu thử nhanh, đơn giản cho mỗi sub-module </li></ul></ul></ul>
    10. 10. Cấu trúc Top - Down A[3:0] entity Add_4 B[3:0 ] C_in SUM [3:0] C_out C_out Sum A B C_in entity Full_Add A B entity Half_Add Sum Carry Leaf Cell Macro
    11. 11. Kiểm tra thiết kế <ul><li>Khi s ử dụng VHDL, c ó thể thực hiện các bước kiểm tra thiết kế , b ắt đầu từ Behavioral Simulation </li></ul>VHDL modules Synthesis Place & Route Behavioral Simulation (Testbench driven) Gate-Level Functional (Netlist-driven ) Gate-Level Timing ( Back-annotated netlist ) V I T A L VHDL Initiative Toward ASIC Libraries SDF (Standard Delay Format) & Structural VHDL File
    12. 12. Các bước kiểm tra thiết kế <ul><ul><li>(1) Mô phỏng Behavioral </li></ul></ul><ul><ul><ul><li>Thực hiện mã nguồn mô tả hành vi, dùng testbench </li></ul></ul></ul><ul><ul><li>(2) Mô phỏng RTL </li></ul></ul><ul><ul><ul><li>Thực hiện file mã nguồn RTL, </li></ul></ul></ul><ul><ul><ul><li>dùng testbench </li></ul></ul></ul><ul><ul><li>(3) Mô phỏng chức năng trong VHDL </li></ul></ul><ul><ul><ul><li>Thực hiện file .vhd mô tả cấu trúc, </li></ul></ul></ul><ul><ul><ul><li>dùng testbench </li></ul></ul></ul><ul><ul><li>(4) Mô phỏng chức năng thiết bị ở mức cổng </li></ul></ul><ul><ul><ul><li>Mô phỏng netlist pre-P&R EDN </li></ul></ul></ul><ul><ul><ul><li>dùng công cụ mức cổng </li></ul></ul></ul><ul><ul><li>(5) Mô phỏng theo quan hệ thời gian trong VHDL </li></ul></ul><ul><ul><ul><li>Thực hiện file cấu trúc .vhd và file SDF; </li></ul></ul></ul><ul><ul><ul><li>dùng testbench </li></ul></ul></ul><ul><ul><li>(6) Mô phỏng quan hệ thời gian ở mức cổng </li></ul></ul><ul><ul><ul><li>Mô phỏng netlist post P&R EDN netlist, sử dụng các delays </li></ul></ul></ul>VHDL modules Synthesis Place & Route
    13. 13. Kiểm tra thiết kế? <ul><li>Chip level </li></ul><ul><li>Board level </li></ul><ul><li>Std parts model </li></ul><ul><li>Model bus operation </li></ul><ul><li>Discrete event-driven </li></ul><ul><li>Flexibility over strictly netlist-driven </li></ul>Test-Bench Behavioral Module MCU FPGA PLD Memory
    14. 14. Kết luận <ul><li>VHDL là một ngôn ngữ dùng để mô hình hoá phần cứng của thiết bị </li></ul><ul><li>Tổng hợp logic là một tập con của toàn bộ ngôn ngữ </li></ul><ul><li>Các vấn đề về công cụ và công nghệ có ảnh hưởng đến việc tổng hợp logic của một thiết kế </li></ul><ul><li>Các mô phỏng HDL có thể bao gồm các dữ liệu định thời (back-annotated timing data) </li></ul>
    15. 15. Bài 2 <ul><li>Ngôn ngữ VHDL </li></ul>
    16. 16. Design Units trong VHDL <ul><li>Entity </li></ul><ul><li>Architecture </li></ul><ul><li>Configuration </li></ul><ul><li>Package </li></ul><ul><li>Package Body </li></ul><ul><li>Library </li></ul>Chương trình VHDL bao gồm các design units. Một số design units độc lập với các design unit khác.
    17. 17. Các loại Design Unit <ul><li>Trong VHDL có hai loại design unit , đó là: </li></ul><ul><ul><li>Primary </li></ul></ul><ul><ul><ul><li>Không phụ thuộc vào các design unit khác </li></ul></ul></ul><ul><ul><li>Secondary </li></ul></ul><ul><ul><ul><li>Phụ thuộc vào primary design unit </li></ul></ul></ul><ul><li>Mỗi khi có thay đổi trong primary design unit, cần phải kiểm tra lại secondary design unit. Nếu không, chương trình sẽ có lỗi. </li></ul><ul><li>Các secondary unit không thể tồn tại độc lập -- tức là, phải phụ thuộc primary unit </li></ul>
    18. 18. Entity <ul><li>Entity mô tả external interface của thực thể được thiết kế, cùng các thuộc tính liên quan với interface đó </li></ul>entity Half_Add is port (A, B : in std_logic ; Carry, Sum : out std_logic ) ; end Half_Add ; A Carry Sum B Chú thích: VHDL’93 cho phép dùng optional reserved word entity ngay sau reserved word end, ví dụ , ‘end entity Half_Add ; ’
    19. 19. Architecture <ul><li>Architecture mô tả hoạt động bên trong của thực thể (entity) gắn với nó (primary unit) </li></ul><ul><ul><li>Một architecture thể hiện một chức năng của thực thể gắn với nó, có thể có nhiều architecture cho một thực thể </li></ul></ul>architecture My_Arch of Half_Add is begin Sum <= A xor B ; Carry <= A and B ; end My_Arch ; Note : VHDL’93 cho phép sử dụng reserved word architecture sau reserved word end
    20. 20. Multiple Architecture <ul><li>Có thể có nhiều architecture cùng tồn tại để mô tả hoạt động của một thực thể </li></ul><ul><ul><li>Chúng có thể biểu diễn các giai đoạn khác nhau của quá trình thiết kế hoặc các cách tiếp cận khác nhau cho cùng một chức năng (optimization for speed verus area, etc.) </li></ul></ul>entity Half_Add is . . . end Half_Add ; architecture BEH of Half_Add is . . . end BEH ; architecture RTL of Half_Add is . . . end RTL ; architecture XLX of Half_Add is . . . end XLX ; entity Cnt64 is . . . end Cnt64 ; architecture BEH of Cnt64 is . . . end BEH ; architecture RTL of Cnt64 is . . . end RTL ; architecture XLX of Cnt64 is . . . end XLX ;
    21. 21. Package <ul><li>Một package declaration được dùng để khai báo các dữ liệu dùng cho toàn bộ thiết kế, bao gồm: </li></ul><ul><ul><li>Constants, data types, subtypes, subprogram và function declarations, v.v… </li></ul></ul>package My_Pack is constant. . . . . . function. . . . . . component . . . . . . subtype. . . end package My_pack ; library IEEE; use IEEE.std_logic_1164.all ; . . . use work. My_Pack .all ; entity . . .
    22. 22. Package Body <ul><li>Một package body là một dependent unit của một package , nó chứa các thông tin chi tiết về các đối tượng trong package </li></ul><ul><ul><li>Subprograms, deferred constants </li></ul></ul>package My_Pack is constant. . . . . . function bv_to_integer ( . . . component . . . . . . subtype. . . end My_Pack ; package body My_Pack is function bv_to_integer (BV: bit_v.. return integer is variable … begin for index in BV'range loop . . . . . . . end My_Pack ; declaration details
    23. 23. Library <ul><li>V ề cơ bản, tất cả các đối tượng VHDL đều được lưu trong các thư viện </li></ul><ul><ul><li>Theo định nghĩa, thư viện là một tập hợp các đơn vị thiết kế (design unit) đã được kiểm chứng </li></ul></ul><ul><ul><li>Work v à std l à hai thư viện dùng được cho mọi design unit </li></ul></ul>package std_logic_1164 is .. package std_logic_arith is .. package std_logic_unsigned is .. library IEEE ;
    24. 24. Library <ul><li>Libraries v à Packages comprise the VHDL Design Management structure </li></ul><ul><ul><li>Theo m ột nghĩa nào đó, nó tương tự như directories v à subdirectories </li></ul></ul>package std_logic_1164 is .. package std_logic_arith is .. package std_logic_unsigned is .. library IEEE ;
    25. 25. Khởi tạo các Library <ul><li>Tên của library đơn thuần là một tham trỏ về mặt logic </li></ul><ul><ul><li>Chuẩn VHDL không quy định các yêu cầu chặt chẽ về cấu trúc của library, do vậy chúng không dễ được chuyển giao giữa các tool </li></ul></ul>package Fast_Counters is .. package DSP_Filters is .. library My_Lib ; use My_Lib.Fast_Counters .all ; entity Mod1 is port ( . . . library My_Lib
    26. 26. Khởi tạo các Library <ul><li>Thông thường, cần phải tạo các thư viện trong mỗi tool cụ thể thay vì attach các thư viện đã có ở đâu đó </li></ul><ul><ul><li>Đặt tên cho library, và sau đó phân tách các design unit được chọn đưa vào nó </li></ul></ul>package Fast_Counters is .. package DSP_Filters is .. library My_Lib ; use My_Lib.Fast_Counters .all ; entity Mod1 is port ( . . . library My_Lib
    27. 27. Work Library <ul><li>Đây là th ư mục con ( sub-directory) m ặc định được dùng để lưu giữ tất cả các đơn vị thiết kế đã được biên dịch (compiled design units) , trừ khi có các chỉ định khác. </li></ul><ul><li>M ỗi một công cụ mô phỏng hoặc tổng hợp đều sẽ tạo ra một cấu trúc như thế </li></ul><ul><ul><li>Chú ý: hiển thị ở library là nhãn tên của design unit chứ không phải là tên của source file </li></ul></ul>
    28. 28. Work Library <ul><li>Một ví dụ về nội dung của </li></ul><ul><li>work library </li></ul>Design Unit Identifier entity HALF_ADD entity DFF entity REG4 package My_Counters . . . architecture RTL architecture STRUCTURAL Secondary (dependent) design units tham trỏ tới primary unit tương ứng với nó
    29. 29. Ví dụ về Hierarchy : DFF entity DFF is port (D, Clock : in std_logic ; Reset : in std_logic ; Q : out std_logic) ; end entity DFF ; architecture RTL of DFF is begin process (Clock, Reset) begin If (Reset = ‘1’ ) then Q <= ‘0’ ; elsif (Clock’event and Clock = ‘1’) then Q <= D ; end if ; end process ; end architecture RTL ; Clock Reset D Q
    30. 30. Ví dụ về Hierarchy : REG-4 entity REG_4 is port (D_in : in std_logic_vector (3 downto 0); Clk, Rst : in std_logic ; Q_out : out std_logic_vector (3 downto 0)); end REG_4; architecture Structural of REG_4 is component DFF port ( D, Clock : in std_logic ; Reset : in std_logic; Q : out std_logic ) ; end component ; begin U3 : DFF port map ( D_in(3), Clk, Rst, Q_out(3)); U2 : DFF port map ( D_in(2), Clk, Rst, Q_out(2)); U1 : DFF port map ( D_in(1), Clk, Rst, Q_out(1)); U0 : DFF port map ( D_in(0), Clk, Rst, Q_out(0)); end Structural ; Clk Rst D_in(3) D_in(2) D_in(1) D_in(0) Q_out(3) Q_out(2) Q_out(1) Q_out(0) DFF DFF DFF DFF U3 U0 U1 U2 REG_4
    31. 31. Liên kết Tín hiệu <ul><li>Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng </li></ul><ul><ul><li>Liên kết theo vị trí: Các tín hiệu ở mức cao được liệt kê theo đúng trật tự của các cổng (port) ở mức thấp trong component declaration </li></ul></ul><ul><ul><ul><li>U1: DFF port map (D_in, Clk, Rst, Q_out) ; </li></ul></ul></ul>component DFF port ( D, Clock : in std_logic ; Reset : in std_logic ; Q : out std_logic ) ; end component ;
    32. 32. Liên kết Tín hiệu <ul><li>Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng </li></ul><ul><ul><li>Liên kết theo tên: Các cổng (ports) và tín hiệu (signals) được liệt kê một cách rõ ràng, đầy đủ, không phụ thuộc trật tự (strongly recommended) </li></ul></ul><ul><ul><ul><li>U1: DFF port map ( D =>D_in(1), Clock =>Clk, Reset =>Rst, Q =>Q_out(1)) ; </li></ul></ul></ul>component DFF port ( D, Clock : in std_logic ; Reset : in std_logic ; Q : out std_logic ) ; end component ;
    33. 33. Signal Declaration <ul><li>Tất cả các tín hiệu bên trong thực thể cần phải được khai báo rõ ràng </li></ul>architecture Structural of Top is component Sub_A port (A1, A2, A3 : in std_logic ; A4 : out std_logic_vector (3 downto 0)) ; end component ; component Sub_B port (B1: in std_logic_vector (3 downto 0 ) ; B2, B3, B4 : out std_logic) ; end component ; signal Bus_1 : std_logic_vector (3 downto 0) ; signal Sig_1: std_logic ; begin U0 : Sub_A port map ( I1, I2, Sig_1, Bus_1 ) ; U1 : Sub_B port map ( Bus_1, Sig_1 , O1, O2) ; end Structural ; Sub_A Sub_B Top I1 I2 O1 O2 Sig_1 Bus_1 A1 A2 A4 A3 B4 B3 B2 B1 entity Top is port (I1, I2 : in std_logic; 01, 02 : out std_logic) ; end Top ;
    34. 34. Cụ thể hoá phần tử entity REG_4 is port (D_in : in std_logic_vector (3 downto 0) ; Clk, Rst : in std_logic ; Q_out : out std_logic_vector (3 downto 0)) ; end REG_4 ; architecture Xilinx_Struct of REG_4 is component FDC port (D : in std_logic ; Clock, Reset : in std_logic ; Q : out std_logic) ; end component ; begin U3 : FDC port map (D=>D_in(3), Clock=>Clk, Reset=>Rst, Q=> Q_out(3)) ; U2 : FDC port map (D=>D_in(2), Clock=>Clk, Reset=>Rst, Q=> Q_out(2)) ; U1 : FDC port map (D=>D_in(1), Clock=>Clk, Reset=>Rst, Q=> Q_out(1)) ; U0 : FDC port map (D=>D_in(0), Clock=>Clk, Reset=>Rst, Q=> Q_out(0)) ; end Xilinx_Struct ; <ul><li>Component instantiation from target library may be helpful for chip level optimization ( i.e., Xilinx Virtex ) </li></ul>Clk Rst D_in(3) D_in(2) D_in(1) D_in(0) Q_out(3) Q_out(2) Q_out(1) Q_out(0) FDC FDC FDC FDC U3 U2 U1 U0
    35. 35. Sử dụng Generics <ul><li>Generics l à các tham số có thể cập nhật động (thay đổi giá trị) trong từng câu lệnh c ụ thể hoá phần tử c ủa thiết kế ( component instantiation ) </li></ul><ul><ul><li>Điều này cho phép khai báo các tham số một cách linh hoạt, mềm dẻo </li></ul></ul>library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned_all; use IEEE.std_logic_arith.all; entity My_Cntr is generic ( Count_Width : integer := 8 ); port ( Data_In: in std_logic_vector ( Count_Width -1 downto 0); Clk, Reset, Load, UpDn : in std_logic ; Q_Out: out std_logic_vector ( Count_Width -1 downto 0)); end entity My_Cntr; architecture RTL of My_Cntr is • • • • end architecture RTL;  Lab Marker
    36. 36. Cập nhật giá trị của Generics <ul><li>Sử dụng một generic map cùng với port map , khi c ó một phần tử được cụ thể hoá đâu đó trong thiết kế </li></ul><ul><ul><li>Nếu không có generic map , generic nhận giá trị mặc định ban đầu </li></ul></ul>library IEEE; u se IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned_all; use IEEE.std_logic_arith.all; entity MY_TOP_DESIGN is port ( DATA_BUS: in std_logic_vector (63 downto 0); CLOCK, RST, LD, CNTRL : in std_logic ; DATA_Out: out std_logic_vector (63 downto 0)) ; end entity MY_TOP_DESIGN; architecture STRUCTURAL of MY_TOP_DESIGN is component My_Cntr generic ( Count_Width : integer := 8 ); port ( Data_In: in std_logic_vector ( Count_Width -1 downto 0); Clk, Reset, Load, UpDn : in std_logic ; Q_Out: out std_logic_vector ( Count_Width -1 downto 0)); end component ; begin U0: My_Cntr generic map (Count_Width => 64) port map (DATA_BUS, CLOCK, RST, LD, CNTRL, DATA_OUT ) ; • • • • end architecture RTL;
    37. 37. Biên dịch VHDL <ul><li>Có thể có bốn giai đoạn biên dịch ứng với bốn mức xử lý cho một mô hình phần cứng VHDL </li></ul><ul><ul><li>Analysis (phân tích) </li></ul></ul><ul><ul><ul><li>Design unit được kiểm tra lỗi cú pháp. Sau khi hoàn tất, nó sẽ được lưu giữ ở work directory </li></ul></ul></ul><ul><ul><li>Elaboration (chỉnh sửa) </li></ul></ul><ul><ul><ul><li>Cấu trúc hierarchy của thiết kế được dàn trải bắt đầu từ mức cao nhất. Ứng với mỗi sub-module cụ thể chỉ có một copy duy nhất được tạo ra </li></ul></ul></ul><ul><ul><li>Synthesis (tổng hợp) </li></ul></ul><ul><ul><ul><li>Dạng mô tả netlist của thiết kế được tạo ra hoặc theo format chuẩn công nghiệp hoặc theo một vendor-specific format </li></ul></ul></ul><ul><ul><li>Execution (chỉ mô phỏng) </li></ul></ul><ul><ul><ul><li>Mô hình được mô phỏng theo các bước thời gian gián đoạn. Nó được điều khiển bởi các sự kiện ở các tín hiệu đồng bộ quá trình </li></ul></ul></ul>
    38. 38. Quy trình biên dịch <ul><li> entity DFF is port (D, Clk : in Reset: in Q: out . . . architecture.. </li></ul>Analyze Elaborate Execute Synthesize
    39. 39. Trình tự Biên dịch <ul><li>Do mối quan hệ giữa các primary và secondary design unit cũng như khả năng có thể cụ thể hoá các module ở mức thấp hơn, nên quá trình biên dịch luôn tuân theo một trật tự nghgiêm ngặt </li></ul><ul><li>Các entity phải được phân tích trước các architecture tương ứng với chúng </li></ul><ul><li>Các package cần phải được phân tích trước các package body </li></ul><ul><li>Mỗi một module cần phải được phân tích trước khi nó được tham trỏ bởi các module khác </li></ul><ul><ul><li>Đây là trình tự biên dịch Bottom-up </li></ul></ul>
    40. 40. Comments <ul><li>Comments (chú thích) có tác dụng làm cho mã nguồn trở nên dễ hiểu hơn, điều này cũng tương tự như ở các ngôn ngữ khác </li></ul>- - Comments bắt đầu bằng hai dấu gạch ngang - - Chúng chỉ tiếp tục cho đến hết dòng - - Một comment trên nhiều dòng cần phải dùng - - hai dấu gạch ngang trên tất cả các dòng A_OUT <= ‘1’ ; - - Comments có thể viết từ đây
    41. 41. Kết luận <ul><li>VHDL bao gồm các primary và secondary design unit </li></ul><ul><li>Trật tự biên dịch chương trình VHDL được thực hiện theo một quy luật chặt chẽ </li></ul><ul><li>Tất cả các design unit đã được kiểm chứng được lưu trong một thư viện gọi là work library </li></ul><ul><li>Có thể sử dụng Generics để tăng tính linh hoạt của mã nguồn ( source code ) </li></ul>
    42. 42. Bài 3 <ul><li>Signals và Data Types </li></ul>
    43. 43. Data Types <ul><li>Data types là một yếu tố quan trọng trong VHDL (cũng như trong các ngôn ngữ khác) </li></ul><ul><ul><li>Mỗi một kiểu dữ liệu chỉ cho phép nhận các giá trị trong một giải nhất định </li></ul></ul><ul><ul><li>Mỗi đối tượng (signal, variable, constant, hoặc port) cần phải có kiểu dữ liệu nhất định khi được khai báo (declared) </li></ul></ul><ul><li>VHDL là một ngôn ngữ định kiểu rất chặt chẽ </li></ul><ul><ul><li>Các tín hiệu liên kết với nhau cần phải có cùng kiểu </li></ul></ul><ul><li>Trong VHDL có nhiều kiểu dữ liệu cho phép mô tả phần cứng và kiểm tra lỗi nhằm đảm bảo sự tương thích tín hiệu trong các mô hình lớn và phức tạp </li></ul><ul><ul><li>Cần tuân thủ quy tắc kiểm tra kiểu trong các mô hình cả hành vi (behavioral) và mức cổng (gate-level) </li></ul></ul>
    44. 44. Signals và Ports <ul><li>Kiểu dữ liệu và độ rộng bus cần phải phù hợp trong các lệnh gán tín hiệu (signal) và cổng vào ra (port) </li></ul>entity REG_4 is port ( D_in1 : in std_logic_vector (3 downto 0); Cntrl : in std_logic_vector (1 downto 0); Clock, Reset : in std_logic ; Q_out : out std_logic_vector (3 downto 0)); end entity REG_4; signal A : integer ; signal B : bit ; signal C : integer ; signal D : std_logic ; A <= C; A <= C + 1; A <= B; D <= C; B <= D; Q_out <= Cntrl;
    45. 45. Các loại data type trong VHDL <ul><li>Có 4 categories (loại) data types trong VHDL </li></ul><ul><ul><li>Scalar </li></ul></ul><ul><ul><ul><li>Single value object, defined indices, ordered </li></ul></ul></ul><ul><ul><li>Composite </li></ul></ul><ul><ul><ul><li>Group objects, similar or different types </li></ul></ul></ul><ul><ul><li>Access </li></ul></ul><ul><ul><ul><li>Defines pointers to objects </li></ul></ul></ul><ul><ul><ul><li>covered in Advanced VHDL course </li></ul></ul></ul><ul><ul><li>File </li></ul></ul><ul><ul><ul><li>Sequence of objects of given type </li></ul></ul></ul><ul><ul><ul><li>covered in Advanced VHDL course </li></ul></ul></ul>
    46. 46. Scalar Data Types <ul><li>Kiểu dsữ liệu vô hướng nhận các giá trị đơn lẻ. Trong VHDL, lớp các data type này gồm có: </li></ul><ul><ul><li>Bit </li></ul></ul><ul><ul><li>Boolean </li></ul></ul><ul><ul><li>Integer </li></ul></ul><ul><ul><li>Real </li></ul></ul><ul><ul><li>Physical </li></ul></ul><ul><ul><li>Character </li></ul></ul><ul><ul><li>Std_logic and std_ulogic </li></ul></ul><ul><ul><li>Enumerated </li></ul></ul>
    47. 47. Bit và Boolean <ul><li>Vừa đủ để mô hình hoá phần cứng, nhưng nó không cho phép mô tả các giá trị high-impedance, unknown, don’t care, v.v... </li></ul><ul><li>Thích hợp cho việc mô hình hoá ở mức khái niệm lý thuyết </li></ul>type bit is ( ‘0’, ‘1’ ) ; type boolean is ( false, true ) ; architecture BEHAVE of MUX is signal A,B,Sel, Z : bit ; begin if Sel = ‘1’ then Z <= A ; else Z <= B ; end if . . . if Sel =‘1’, if F >= G.. both yield boolean result
    48. 48. Integer và Real <ul><li>Chấp nhận các giá trị và các đại lượng một cách trực quan và linh hoạt </li></ul><ul><ul><li>Cần phải quy định giải giá trị cho các kiểu nguyên (integer), nếu không nó sẽ sử dụng giải giá trị mặc định với số nguyên 32-bit </li></ul></ul><ul><li>Cho phép người thiết kế sử dụng các giá trị floating point </li></ul><ul><ul><li>Khai báo các kiểu real với giải giá trị thực nhất định </li></ul></ul><ul><ul><li>Cách dùng giá trị kiểu ‘Real’ không giống như ‘Integer’ </li></ul></ul>type integer is range . . . type real is range . . . signal A : integer range 0 to 7; signal B : integer range 15 downto 0 ; type CAPACITY is range -25.0 to 25.0 ; signal Sig_1 : CAPACITY := 3.0 ;
    49. 49. Physical <ul><li>Kiểu vật lý (Physical type) được dùng để định lượng các đại lượng vật lý như là khối lượng, độ dài, thời gian </li></ul><ul><li>Kiểu vật lý được định nghĩa theo đơn vị cơ sở của nó </li></ul><ul><ul><li>Bất kỳ đơn vị dẫn xuất nào cũng là bội của đơn vị cơ sở </li></ul></ul>Time l à kiểu vật lý duy nhất được định nghĩa trong VHDL. N ó rất cần thiết cho việc mô phỏng thời gian trễ và các tham số khác có liên quan thời gian . type time is range 1 to 1000000 units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; . . . constant Tpd : time := 3ns ; . . . Z <= A after Tpd ;
    50. 50. Std_logic và Std_ulogic <ul><li>Std_logic được phát triển từ hệ thống MVL (Multi-Value Logic) v à được dùng để mô hình hoá phần cứng một cách chi tiết hơn so với kiểu bit </li></ul><ul><ul><li>Hỗ trợ các mức giá trị khác nhau của tín hiệu: don't-care conditions, unknown, three-state … </li></ul></ul><ul><ul><li>Được định nghĩa trong gói IEEE std_logic_1164 </li></ul></ul>type std_ulogic is ( ‘U’, -- Uninitialized ‘X’, -- Forcing Unknown ‘0’, -- Forcing Zero ‘1’, -- Forcing One ‘Z’, -- High Impedance ‘W’, -- Weak Unknown ‘L’, -- Weak Zero ‘H’, -- Weak One ‘ - ‘ -- Don’t Care ) ; Recall: type bit is limited to (‘0’, ‘1’).
    51. 51. So sánh Std_logic và Std_ulogic <ul><li>Cả hai kiểu đều chứa cùng một tập các giá trị như nhau </li></ul><ul><ul><li>Sự khác nhau ở chỗ thực hiện mạch (implementation) </li></ul></ul><ul><ul><li>Chữ u trong ulogic có nghĩa là unresolved </li></ul></ul><ul><li>Nếu người thiết kế sử dụng hai hay nhiều tín hiệu điều khiển một cửa ra chung thì anh ta phải dùng một hàm resolution (có trong gói ieee_std_1164 ) để quyết định trên thực tế tín hiệu nào được đưa tới cửa ra </li></ul><ul><li>Std_ulogic không có khả năng đó, nhưng nó tạo ra một công cụ nội tại để kiểm tra các lỗi wired-oring do sơ suất </li></ul>signal A,B,C,Res_Out : std_logic ; signal Out_1 : std_ulogic ; Out_1 <= A ; Out_1 <= B ; Out_1 <= C ; C B A Out_1 C B A Res_Out <= A; Res_Out <= B; Res_Out <= C; Res_Out X
    52. 52. Signal Resolution <ul><li>Một cửa ra cụ thể không thể có nhiều tín hiệu điều khiển kiểu wire-or </li></ul><ul><ul><li>Để mô hình một cửa ra ba trạng thái, ta sử dụng một lệnh gán tín hiệu có điều kiện và data-type là std_logic: </li></ul></ul>signal A,B,C,Res_Out : std_logic ; C B A Res_Out <= A when En0 = ‘1’ else ‘Z’ ; Res_Out <= B when En1 = ‘1’ else ‘Z’ ; Res_Out <= C when En2 = ‘1’ else ‘Z’ ; Res_Out En0 En2 En1
    53. 53. Enumerated (liệt kê) <ul><li>Tăng mức độ linh hoạt trong việc mô hình hoá phần cứng </li></ul><ul><ul><li>Các kiểu liệt kê do người dùng định nghĩa sử dụng các giá trị có thể nhận biết một cách dễ dàng và thích hợp với hoạt động của mô hình </li></ul></ul><ul><ul><li>Làm cho các chương trình dễ hiểu hơn nhất là khi mô tả các máy trạng thái (hệ logic dãy) hoặc các hệ thống phức tạp </li></ul></ul>type My_State is ( RST, LOAD, FETCH, STOR, SHIFT ) ; . . . signal STATE, NEXT_STATE : My_State ; . . . case ( STATE ) is when LOAD => . . . if COND_A and COND_B then NEXT_STATE <= FETCH ; else NEXT_STATE <= STOR ;
    54. 54. Composite Data Types <ul><li>Các data type hỗn hợp là sự kết hợp các phần tử dưới dạng một array hoặc một record </li></ul><ul><ul><li>Bit_vector, Std_logic_vector và String là các kiểu hỗn hợp đã được định nghĩa trong VHDL </li></ul></ul><ul><li>Câu lệnh này tạo nên một kiểu bit_vector (array) từ một nhóm 4 bit </li></ul><ul><ul><li>Trong VHDL không định nghĩa đâu là LSB hoặc MSB; do vậy, khi biên dịch giá trị này không được tự động hiểu là ‘3’ Chú ý: dùng dấu trích kép (“0011”) cho các đối tượng có kiểu bit_vector, std_logic_vector hoặc string, và dùng dấu trích đơn (‘1’) cho các đối tượng có kiểu bit, std_logic và character </li></ul></ul>signal A_word : bit_vector (3 downto 0) := “0011” ;
    55. 55. Array <ul><li>Array là nhóm các phần tử đơn có cùng kiểu (type) ban đầu </li></ul>type WORD is array (3 downto 0) of std_logic ; index position 0 1 2 3 B_bus Nếu B_bus có kiểu WORD, giá trị có thể có của các phần tử là? Còn nếu B_bus có kiểu DATA? signal B_bus : WORD ; type DATA is array (3 downto 0) of i nteger range 0 to 9 ; signal B_bus : DATA ;
    56. 56. Phép gán các Array <ul><li>Khi g án giá trị một array cho m ột array khác, thì : </li></ul><ul><ul><li>1. C ác array c ần phải có cùng kiểu giá trị </li></ul></ul><ul><ul><li>2. C ác array ph ải có cùng độ dài </li></ul></ul><ul><ul><li>3. Ph ép gán được thực hiện theo vị trí, từ trái sang phải </li></ul></ul>signal My_BusA, My_BusB: bit_vector (3 downto 0) ; signal My_BusC : bit_vector (0 to 3) ; 3 0 1 2 3 0 1 2 My_BusA My_BusB My_BusB <= My_BusA ; My_BusA 3 0 1 2 0 3 2 1 My_BusC Inadvertent bit-swap? My_BusC <= My_BusA ;
    57. 57. Cách viết lệnh gán Array <ul><li>Để đơn giản các phép gán array – và làm cho chương trình dễ đọc hơn - người thiết kế có thể sử dụng các giá trị ở cơ số 16 (hexadecimal) hoặc 8 (octal) </li></ul><ul><ul><li>Có thể sử dụng dấu gạch dưới các giá trị biến cho dễ đọc </li></ul></ul>Data_Word <= X”A6F”; Data_Word <= ”101001101111” ; Data_Word <= O”5157”; Data_Word <= B”1010_0110_1111” ; signal Data_Word : std_logic_vector (11 downto 0) ;
    58. 58. Records Record là nhóm các phần tử đơn có kiểu ban đầu có thể khác nhau . type OPCODE is record PARITY : bit; ADDRESS : std_logic_vector ( 0 to 3 ); DATA_BYTE : std_logic_vector ( 7 downto 0 ); NUM_VALUE : integer range 0 to 6; STOP_BITS : bit_vector (1 downto 0); end record ; . . . signal TX_PACKET, RX_PACKET : OPCODE ; PARITY ADDRESS DATA_BYTE NUM_VALUE STOP_BITS . . . T X _ P A C K E T
    59. 59. String String là array của các character signal Warning1: string (1 to 30) := “ Unexpected Outputs Detected” ; --declared within the architecture variable Warning2: string (1 to 30) := “ Unstable, Aborting Now” ; --declared within the process constant Warning3: string (1 to 20) := “ Entering FSM State2” ; --declared within the package or architecture process ( A_sig , B_sig, C_sig ) begin if ( A_sig and B_sig ) /= ‘1’ then report Warning1 ; elsif ( A_sig and C_sig ) = ‘1’ then report Warning2 & “ Problem Mod2 “; end if ; end process ; process ( A_sig , B_sig, C_sig ) begin assert ( A_sig and B_sig ) /= ‘1’ then report Warning1 ; severity note ; end if ; end process ; process ( A_sig , B_sig, C_sig ) begin if ( A_sig and B_sig ) /= ‘1’ then report “ Unexpected Outputs…” ; elsif ( A_sig and C_sig ) = ‘1’ then report “ I need a vacation “; end if ; end process ;
    60. 60. Phép gộp các Array <ul><li>Phép g ộ p (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán </li></ul>signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7); signal Q_Out : std_logic_vector (31 downto 0); signal A, B, C, D : std_logic; signal WORD : std_logic_vector (3 downto 0); (A,B,C,D)<=WORD; WORD <= ( A, B, C, D ) ; Q_Out <= ( others => ‘0’ ) ; WORD <= ( 2 => ‘1’, 3 => D, others => ‘0’ ) ; The total number of elements on both sides of any assignment must match, “others” can be used as a default assignment, regardless of the array size Only scalar data variables are allowed on the left-side aggregates. H_Byte <= ( 7|6|0 => ‘1’, 2 to 5 => ‘0’ ) ;
    61. 61. Gộp các Record <ul><li>Phép gộp (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán </li></ul>type D_WORD is record UPPER : std_logic_vector (7 downto 0 ) ; LOWER : std_logic_vector (7 downto 0 ) ; end record ; signal DATA_WORD : D_WORD ; signal H_BYTE, L_BYTE: std_logic_vector (7 downto 0); signal TX_PACKET, RX_PACKET : OPCODE ; --defined earlier TX_PACKET <= ( ‘1’,”0011”,”11101010”,5,”10” ) ; TX_PACKET. ADDRESS <= ( “0011” ) ; Only records can accept aggregate of arrays TX_PACKET. ADDRESS(2) <= ‘0’ ; DATA_WORD <= ( H_BYTE, L_BYTE) ; DATA_WORD <= ( LOWER => L_BYTE, UPPER=> H_BYTE) ; DATA_WORD <= ( LOWER | UPPER=> H_BYTE); DATA_WORD <= ( others => H_BYTE);
    62. 62. Tạo lập các Array 2-D <ul><li>Khi cần mô hình hoá các cấu trúc bộ nhớ, người thiết kế phải tạo ra một cấu trúc array 2 chiều (2-D structure) </li></ul><ul><ul><li>Đây thực sự là một array của các array (hoặc các record) </li></ul></ul>type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0); signal My_Mem : Mem_Array ; 0 1 2 3 7 6 5 4 3 2 1 0
    63. 63. Tạo Array của các Record <ul><li>Array của các record thường được dùng trong các ứng dụng xử lý gói tin (packet handling) </li></ul>type Data_Array is array ( 0 to 2 ) of OPCODE ; signal My_Data : Data_Array ; My_Data type OPCODE is record PARITY : bit; ADDRESS : std_logic_vector ( 0 to 3 ); DATA_BYTE : std_logic_vector ( 7 downto 0 ); NUM_VALUE : integer range 0 to 6; STOP_BITS : bit_vector (1 downto 0); end record ; . . . signal TX_PACKET, RX_PACKET : OPCODE ; PARITY ADDRESS DATA_BYTE NUM_VALUE STOP_BITS . . . . . . . . .
    64. 64. Phép gán các Array 2-D <ul><li>Với hầu hết các ứng dụng của memory, vector địa chỉ Read/Write được chuyển thành dạng integer, để tham trỏ tới một phần tử trong array 2-D - Hàm biến đổi conv_integer có trong gói ieee.std_logic_unsigned </li></ul>My_Mem ( conv_integer( W_Addr)) <= Data_In ; . . . D_Out <= My_Mem ( conv_integer (R_Addr)); type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0 ); signal My_Mem : Mem_Array ; signal R_Addr, W_Addr : std_logic_vector (1 downto 0 ) ; 7 6 5 4 3 2 1 0 0 1 2 3
    65. 65. Initializing a ROM Array <ul><li>Với các ứng dụng ROM, phép kết tập (aggregate) là một công cụ tiện ích để kích hoạt mạng array 2-D </li></ul>constant My_ROM : ROM_Array := ( 0 => (others => ‘1’) , 1 => “10100010”, 2 => “00001111”, 3 => “11110000” ) ; type ROM_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0); constant My_ROM : ROM_Array := --continued below 7 6 5 4 3 2 1 0 0 1 2 3
    66. 66. Kiểu con trong VHDL <ul><li>Một kiểu con (subtype) trong VHDL là một tập hợp có hạn chế của một kiểu (type) đã có </li></ul><ul><ul><li>Kiểu đã có cũng có thể là một kiểu đã được định nghĩa trong IEEE1076 hoặc cũng có thể do người dùng tạo ra </li></ul></ul><ul><li>Các kiểu con (Subtypes) thường được dùng để phát hiện lỗi ‘out-of-range’ trong kết quả mô phỏng, và cũng có thể có tác dụng tối ưu hoá quá trình tổng hợp logic </li></ul>subtype My_Int is integer range 0 to 255 ; Label Base Type Constraint subtype My_Small_Int is My_Int range 5 to 30 ;
    67. 67. Sử dụng kiểu con trong VHDL type My_State is ( Load, Jump, Add, Sub, Div, Mult , StorA, StorB) ; signal Curr_State, Next_State : My_State ; Label Base Type Constraint subtype Arith_Ops is My_State range Add to Mult ; subtype My_OHE_State is std_logic_vector ( 3 downto 0 ) ; constant Init_St0 : My_OHE_State := “0001” ; constant Load_St1 : My_OHE_State := “0010” ; constant Jump_St2 : My_OHE_State := “0100” ; constant Stor_St3 : My_OHE_State := “1000” ;
    68. 68. Bài 4 <ul><li>Operators và Expressions </li></ul>
    69. 69. Các toán tử trong VHDL <ul><li>VHDL chứa một lượng lớn các toán tử (operator) dùng cho việc mô hình hoá phần cứng </li></ul><ul><li>Tuy nhiên, mỗi toán tử được sử dụng với (những) kiểu dữ liệu (data type) nhất đ ịnh </li></ul><ul><ul><li>Đặc biệt, cần lưu ý các toán tử số học (arithmetic) không dùng được với các kiểu dữ liệu phức hợp (bit_vector and std_logic_vector), vì các array không có giá trị bằng số tường minh </li></ul></ul><ul><li>Các Function (subprogram) được tạo ra để khắc phục những vấn đề liên quan </li></ul><ul><ul><li>Các hàm này có trong các gói được gọi là “arithmetic packages ” </li></ul></ul>
    70. 70. Operator Overloading <ul><li>Operator overloading (chồng hàm) trong VHDL có nghĩa là một toán tử cụ thể (ví dụ, ‘+’ ) có thể được dùng với các data type khác nhau </li></ul><ul><ul><li>Điều này xảy ra do các subprogram riêng biệt được viết cho từng data type nhất định </li></ul></ul>Compiler tự động chọn sub-function thích hợp dựa trên data type của các operands signal A, B : std_logic_vector ( 3 downto 0 ) ; signal C, D : integer range 0 to 31 ; signal Q_Out : std_logic_vector ( 15 downto 0 ); Y <= A + B ; -- add 2 vectors F <= C + D ; -- add 2 integers Q_Out <= Q_Out + 1; -- add vector and integer
    71. 71. Các toán tử Logic <ul><li>Các logical operator được định nghĩa với các toán hạng có kiểu (data type) bit, boolean, bit_vector và std_logic_vector </li></ul>and or nand nor xor not xnor (VHDL-93) Y <= G or ( F and H ) ; Z <= A and B ; Z B A F H G Y
    72. 72. Các toán tử Logic với biến kiểu Array Quy tắc sử dụng với biến kiểu Array 1. Các array phải có cùng kiểu (type) 2. Các array phải có cùng kích thước 3. Phép toán thực hiện với các phần tử cùng vị trí trong mỗi array, từ trái sang phải signal A_vec, B_vec, C_vec : bit_vector ( 7 downto 0 ) ; B_vec (7) A_vec (7) C_vec (7) B_vec (6) A_vec (6) C_vec (6) B_vec (5) A_vec (5) C_vec (5) B_vec (0) A_vec (0) C_vec (0) . . . C_vec <= A_vec and B_vec ;
    73. 73. Các toán tử quan hệ <ul><li>Các toán tử quan hệ có thể dùng với hầu hết các data type </li></ul><ul><li>Tất cả các toán tử quan hệ đều cho kết quả kiểu (type) Boolean </li></ul>= Equality /= Inequality < Less than <= Less than or equal > Greater than >= Greater than or equal signal FLAG_BIT : boolean ; signal A, B : integer ; FLAG_BIT <= ( A > B ) ; Nếu A lớn hơn B, FLAG_BIT sẽ được gán giá trị true, ngược lại FLAG_BIT được gán giá trị false
    74. 74. Toán tử quan hệ với các Array <ul><li>Ví dụ này cho kết quả là false </li></ul><ul><ul><li>Các vector được so sánh từ trái sang phải. Việc so sánh được thực hiện lần lượt theo từng phần tử </li></ul></ul><ul><li>Quy tắc: để đảm bảo phép so sánh số được hợp lý các array cần phải có cùng kích thước </li></ul>Rules for use on Arrays 1. Arrays must be same type 2. Arrays may be different lengths 3. Arrays of different lengths are aligned left and then lexically compared -- Compares ASCII values signal A_vec : bit_vector ( 7 downto 0 ) := “11000110” ; signal B_vec : bit_vector ( 5 downto 0 ) := “111001” ; if ( A_vec > B_vec ) then State <= Normal else State <= Code_Red end if …
    75. 75. Các toán tử số học <ul><li>Các toán tử số học dùng với các kiểu dữ liệu (data type) integer, real, và physical </li></ul><ul><li>Các toán tử số học vốn không dùng với các dữ liệu có kiểu array </li></ul>+ Addition - Subtraction * Multiplication / Division abs Absolute Value ** Exponentiation signal A_num, B_num : integer range 0 to 15 ; signal Z_num : integer range 0 to 31 ; Z_num <= ( A_num + B_num ) ; + Z_num A_num B_num Infers a 5-bit adder
    76. 76. Phép tính số học với các biến Array <ul><li>Để thực hiện các phép tính số học cần có các function định nghĩa sẵn trong IEEE hoặc từ các hãng cung cấp phần mềm thiết kế </li></ul><ul><ul><li>Các function như vậy thường được đặt trong các gói gọi là “arithmetic packages”. Một số công cụ (tool) dịch sẵn các gói này và đặt ở thư viện của chúng </li></ul></ul><ul><ul><li>Các gói std_logic_unsigned và std_logic_arith được xác lập trong thư viện IEEE để phát huy khả năng trao đổi mã nguồn giữa các công cụ khác nhau </li></ul></ul><ul><li>Toán tử “+” là overloaded </li></ul>package STD_LOGIC_UNSIGNED is function “+” (A,B: std_logic_vector) return std_logic_vector ; function “+” (A: std_logic_vector, B: integer ) return std_logic_vector ; function “+” (A,B: std_logic_vector) return integer ; . . . . library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.Std_Logic_Unsigned.all ; use IEEE.Std_Logic_Arith.all;
    77. 77. Array Arithmetic <ul><li>Nếu có các function thích hợp có thể dùng được trong module thiết kế (thông qua mệnh đề “use”), thì compiler sẽ tự động truyền tham số cho trả lại kết quả tính từ subprogram đó </li></ul><ul><ul><li>Nếu không, compiler sẽ thông báo lại rằng các operator đó là “undefined” </li></ul></ul>signal A_vec : std_logic_vector ( 7 downto 0 ) := “11001001” ; signal B_vec : std_logic_vector ( 7 downto 0 ) := “11100100 ” ; signal Z_vec : std_logic_vector ( 8 downto 0 ) ; signal D_int : integer range ( 0 to 9 ) ; Z_vec < = A_vec + D_int ; Z_vec < = A_vec + B_vec ;
    78. 78. Các toán tử Shift (dịch) <ul><li>Các toán tử Shift được định nghĩa trong VHDL-93 và rất hay được sử dụng, nhất là khi cần mô tả hoạt động của các phần tử trong cấu trúc máy tính </li></ul><ul><li>Mỗi toán tử có hai toán hạng, toán hạng trái có kiểu array one-dimension (1-D) và toán hạng phải có kiểu nguyên (integer) chỉ số bước cần dịch (hoặc quay). Số âm cũng được dùng để chỉ chiều dịch (hoặc quay) ngược lại </li></ul><ul><li>Kết quả của các phép dịch (hoặc quay) có cùng kiểu và kích thước với toán hạng trái </li></ul>
    79. 79. Các toán tử Shift (dịch) <ul><li>sll - Logical left shift </li></ul><ul><li>srl - Logical right shift </li></ul><ul><li>sla - Arithmetic left shift </li></ul><ul><li>sra - Arithmetic right shift </li></ul><ul><li>rol - rotate left logical </li></ul><ul><li>ror - rotate right logical </li></ul>
    80. 80. Shift Operator - Các ví dụ <ul><li>V í dụ: </li></ul><ul><li>signal A_vec : bit_vector (7 downto 0) := “11000110”; </li></ul><ul><li>signal D_vec : bit_vector (7 downto 0); </li></ul>D_vec <= A_vec sll 2; D_vec <= A_vec sra 2; D_vec <= A_vec ror 3; D_vec <= A_vec srl 2; D_vec <= A_vec sra -2; “ 00011000” “ 11110001” “ 11011000” “ 00110001” “ 00011000” cho kq
    81. 81. Concatenation <ul><li>Toán tử nối (concatenation) “&” cho phép kết nối các biến kiểu scalar và kiểu array thành kiểu array lớn hơn </li></ul><ul><ul><li>Các phép gán được thực hiện với sự tương hợp vị trí (positional association) </li></ul></ul>signal A_vec, B_vec : std_logic_vector ( 7 downto 0 ) ; signal Z_vec : std_logic_vector ( 15 downto 0 ) ; signal A_bit, B_bit, C_bit, D_bit : std_logic ; signal X_vec : std_logic_vector ( 2 downto 0 ) ; signal Y_vec : std_logic_vector ( 8 downto 0 ) ; Z_vec <= A_vec & B_vec ; X_vec <= A_bit & B_bit & C_bit ; Y_vec <= B_vec & D_bit ;
    82. 82. Nhóm các toán tử <ul><li>Có thể sử dụng dấu ngoặc đơn để nhóm các toán tử trong một biểu thức đã cho làm cho nó dễ đọc hơn </li></ul>Z <= A + B + C + D ; Z <= ( A + B ) + ( C + D ) ; B A C D Z 3 logic levels D Z A B C 2 logic levels This is especially important when the target technology is LUT (Look-Up Table) based. Each added level of logic incurs additional block and routing delays + + + + + +
    83. 83. Các Slice của Array <ul><li>Một nhóm các phần tử kề cận nhau trong một array được goại là một slice và có thể được tham trỏ đồng thời </li></ul><ul><ul><li>Các phần tử khác của array không bị ảnh hưởng bởi phép gán slice </li></ul></ul>signal A_vec, B_vec : std_logic_vector (7 downto 0) ; signal Z_vec : std_logic_vector (15 downto 0) ; signal A_bit, B_bit, C_bit, D_bit : std_logic ; Z_vec (15 downto 8) <= A_vec ; B_vec <= Z_vec (12 downto 5) ; A_vec (1 downto 0) <= C_bit & D_bit ; . . . Z_vec (5 downto 1) <= B_vec (1 to 5 ) ; The direction (ascending or descending) of the slice must be consistent with the direction of the array as it was originally declared
    84. 84. Slice và Concatenation <ul><li>Ví dụ, để mô hình hoá một biểu thức có điều kiện với các phần tử được chọn không liền nhau (9,8,3,2,1, và 0) từ ‘Status’ bus gồm 16-bit </li></ul><ul><ul><li>Giải mã toàn bộ bus có thể làm tăng số lượng mạch logic tổ hợp và làm cho thiết bị làm việc chậm hơn) </li></ul></ul>signal Status_Bus : std_logic_vector (15 downto 0) ; signal Int_Bus : std_logic_vector ( 5 downto 0 ) ; . . . Int_Bus <= Status_Bus ( 9 downto 8 ) & Status_Bus ( 3 downto 0 ) ; Inefficient !! process ( Status_Bus ) begin case ( Status_Bus ) is when “110111 11 0101 0011 ” => < sequential statement(s) > ; when . . . process ( Status_Bus ) begin case ( Status_Bus(9 downto 8) & Status_Bus (3 downto 0)) is when “ 110011 ” => < sequential statement(s) > ; when . . . Will Not Compile! process ( Int_Bus ) begin case ( Int_Bus ) is when “ 110011 ” => < sequential statement(s) > ; when . . . Optimal !!
    85. 85. Bài 5 <ul><li>Các câu lệnh Concurrent và Sequential </li></ul>
    86. 86. Mô hình hoá phần cứng <ul><li>Để mô hình hoá một thực thể phần cứng một cách có hiệu quả, VHDL sử dụng cả các câu lệnh concurrent (đồng thời) lẫn sequential (tuần tự) </li></ul><ul><li>Các câu lệnh được gọi là concurrent khi chúng được thực hiện không tuỳ thuộc vào vị trí của chúng trong chương trình </li></ul><ul><li>Các câu lệnh được gọi là sequential khi chúng được thực hiện một cách tuần tự theo trình tự viết chúng trong chương trình, giống như các lệnh trong các phần mềm thông thường </li></ul><ul><ul><li>Tất cả các câu lệnh viết trong một process là những lệnh sequential </li></ul></ul>
    87. 87. Cấu trúc ngôn ngữ architecture RTL of ENTITY_1 is . . . begin concurrent statements ; . . . process begin sequential statements ; . . . end process ; . . . concurrent statements ; . . . process begin sequential statements ; . . . end process ; ... end architecture RTL ; <ul><li>Mọi câu lệnh nằm ngoài một process đều là lệnh concurrent </li></ul>
    88. 88. Process <ul><li>Một process bao gồm các câu lệnh sequential </li></ul><ul><ul><li>Các câu lệnh trong một process được thực hiện lần lượt </li></ul></ul><ul><li>Mỗi process đều phải được hoạt kích theo một cách nhất định </li></ul><ul><ul><li>Thường là do sự thay đổi của các tín hiệu trong process, hoặc các điều kiện cụ thể trong một câu lệnh ‘wait’ </li></ul></ul>architecture RTL of My_And2 is begin . . . process (A, B) begin C <= A and B ; end process ; . . . end architecture RTL;
    89. 89. Các Process là đồng thời <ul><li>Trong việc mô hình hoá phần cứng, quan điểm về concurrency (tính đồng thời) là rất cần thiết </li></ul><ul><ul><li>Bất kỳ sự thay đổi nào ở tín hiệu ‘C’ - cửa ra của c ổng G1, cũng đều được đồng thời đưa tới cửa vào của các cổng G2 và G3 </li></ul></ul>G1 G2 G3 B A C C<=A and B ... Process 1 process (C,..) begin Process 3 If C = ‘1’ then ... Process 2 C C
    90. 90. Mô hình kết nối trong VHDL <ul><li>Chỉ có các tín hiệu (signal) là có thể chuyển giá trị từ một process sang một process khác </li></ul><ul><ul><li>Các process concurrent, được liên kết bởi các tín hiệu, thường được gọi là VHDL Connectivity Model (mô hình kết nối) </li></ul></ul>C<=A and B ... Process n process (C,..) begin Process n2 If C = ‘1’ then ... Process n1 C C process n process ( ... Rst Sig1 Sig2 Process n4 Process n3
    91. 91. Các thành phần của Process architecture Behave of DFF is begin . . . Reg1 : process ( Clock, Reset ) begin if Reset = ‘1’ then Q <= ‘0’ ; elsif ( Clock ’event and Clock = ‘1’ ) then Q <= D ; end if ; end process ; . . . end Behave ; Optional Label Signals in sensitivity list create implied “wait” condition Signal updated with new value when process suspends All statements within the process are handled sequentially, in order Keyword Keywords “end” and “process”
    92. 92. Bên trong và bên ngoài Process architecture ... process ( ) begin Out1 <= A; Out1 <= B; . . . end process ; end architecture ; architecture . . . begin Out1 <= A; Out1 <= B; . . . end architecture ; B B Chỉ có phép gán cuối cùng là có hiệu lực Out1 ? Out1 A Cần phải có một hàm resolution cho tín hiệu ra ‘Out1’
    93. 93. Tạm dừng các Process <ul><li>Mỗi process cần phải có một cơ chế để kích hoạt, điều đó cũng có nghĩa là có cơ chế để tạm dừng (suspending) process </li></ul><ul><ul><li>Điều này tạo nên trạng thái đợi (wait) cho process </li></ul></ul><ul><li>Với đoạn mã RTL, các tín hiệu trong sensitivity list tạo nên một điều kiện wait mặc địnhcho process </li></ul><ul><li>Đối với các mô hình hành vi, người thiết kế thưòng dùng các câu lệnh wait. Trong VHDL có bốn dạng lệnh wait </li></ul>wait on... An event on given signal wait until... A specific condition wait for ... A specified time amount wait Indefinite suspension wait on A, B ; wait until CLK = ‘1’ ; wait for 10 ns ; wait;
    94. 94. Các điều kiện Wait <ul><li>Ví dụ dưới đây so sánh các điều kiện ‘wait’ từ các câu lệnh được viết rõ ràng (explicit) và điều kiện ‘wait’ ẩn ý (implicit) </li></ul><ul><ul><li>Note: Một số compiler dùng tổng hợp mạch không hỗ trợ điều kiện explicit ‘wait’ </li></ul></ul>FYI: Another important consideration is that all processes are initialized before simulation, that means they are run until the first ‘wait’ condition is met Given that fact, what is the value on ‘C’ at simulation time zero — assuming use of std_logic for each of the examples above ? process (A, B) begin C <= A and B ; end process ; process begin wait on A, B ; C <= A and B ; end process ; process begin C <= A and B ; wait on A, B ; end process ;
    95. 95. Modeling Concurrency <ul><li>Công cụ mô phỏng VHDL được hoạt kích theo sự kiện </li></ul><ul><ul><li>Tại một thời điểm bất kỳ trong thời gian mô phỏng, (1) tất cả các process được thực hiện cho đến khi bị tạm dừng, (2) giá trị của các tín hiệu được cập nhật, (3) sự thay đổi giá trị ở các tín hiệu làm cho các process liên quan được thực hiện </li></ul></ul><ul><li>Thời gian giữa các công đoạn này được gọi là delta cycle </li></ul><ul><li>Theo cách đó, các process và các lệnh concurrent được coi như xảy ra đồng thời tại mỗi điểm mô phỏng </li></ul>Simulation discrete time step 998 999 1000 1001 D1 D+n D+2 D+1 1002 . . . Delta cycles in-between D1 D+2 D+1 . . . Delta cycles in-between Concurrent Operations
    96. 96. Sắp xếp trình tự các Event <ul><li>Cơ chế sắp xếp trình tự các event là hạt nhân của môi trường mô hình hoá hành vi trong VHDL </li></ul><ul><li>Mỗi hoạt động (transaction) của thực thể được sắp đặt ở một thời điểm thích hợp </li></ul><ul><li>Bước thời gian chỉ tăng lên khi không còn transaction nào khác ở thời điểm mô phỏng </li></ul>
    97. 97. Scheduling Events Simulation discrete time steps t t+1 t+2 t+3 D1 D+n D+2 D+1 t+4 . . . Delta cycles D1 D+2 D+1 . . . Delta cycles Transaction Queue t + 3 t + 4 t + 5 . . . . . . Int <= ‘1’ Data<= ‘0’ Out1 <= ‘1’ ; Out2 <= ‘0’ ; . . . Int <= ‘1’ after 1 ns; . . . Data <= ‘0’ after 2 ns; . . . . . . Out2<= ‘0’ Out1<= ‘1’ ns Discrete Time Delta Cycles
    98. 98. <ul><li>Câu lệnh gán tín hiệu “Z <= A” tạo ra một transaction trong VHDL </li></ul><ul><li>Cụ thể, giá trị hiện tại của A được đọc và được dùng để gán cho tín hiệu Z </li></ul>Transactions process (. . .) begin Z <= A ; F <= G ; . . . end process ;
    99. 99. Events <ul><li>Nếu giá trị của “Z” hoặc “F” thực sự có thay đổi sau lệnh gán (transaction), ta nói có một event xuất hiện ở tín hiệu đó </li></ul><ul><li>Mỗi một phép gán tín hiệu đều gây ra một transaction, nhưng không phải tất cả các transaction đều làm xuất hiện các event ở tín hiệu được gán </li></ul><ul><li>Một event ở một tín hiệu đã cho có thể hoạt kích một process chỉ khi tín hiệu đó có tên trong sensitivity list của proccess </li></ul>process (A, G) begin Z <= A; F <= G; . . . end process ; Z<=A; ... Process 1 process (Z,..) begin Process 3 If Z = ‘1’ then ... Process 2 Z Z
    100. 100. Building Registers process ( Clk) begin if (Clk’ event and Clk = ‘1’) then C <= A and B ; end if; end process; Mọi phép gán tín hiệu xảy ra sau mệnh đề: if clock’event and clock = ‘1’ then... đều tạo ra một cấu trúc thanh ghi (register) C Clk B A
    101. 101. Khái quát về Signal và Variable trong VHDL <ul><li>Hầu như mọi kết nối giữa các điểm trong một thực thể đều có thể được mô hình hoá bằng signal (tín hiệu) hoặc variable (biến) </li></ul><ul><li>Tuy nhiên, cần phân biệt cách dùng, các khả năng và những hạn chế của từng đối tượng này </li></ul><ul><li>Ở mức thực thể, tất cả các port được khai báo thuộc lớp signal, chúng có khả năng trao đổi giá trị với các module khác, và có thể dùng được cho mọi process được khai báo trong các architecture body lệ thuộc </li></ul><ul><li>Trong mỗi architecture body, tất cả các tín hiệu được khai báo chỉ có tác dụng cục bộ với architecture đó, và chỉ được dùng với các process được khai báo trong cùng architecture đó </li></ul><ul><li>Trong mỗi process, có thể khai báo và sử dụng variable để mô phỏng các mối liên kết cục bộ </li></ul>
    102. 102. Phạm vi của Signal và Variable <ul><li>Port là signal, được khai báo ở mức cao nhất (entity) </li></ul><ul><li>Trong mỗi architecture có thể có các signal cục bộ </li></ul><ul><li>Trong mỗi process có thể có các variable cục bộ </li></ul>entity architecture Input Ports Signals process Variables Output Ports
    103. 103. Phép gán với Signal <ul><li>VHDL phân biệt rất rõ ràng trong việc xử lý với các đối tương thuộc các lớp signal và variable </li></ul><ul><li>Các quy tắc cơ bản là: </li></ul><ul><ul><li>Tất cả các signal và variable được gán phải có cùng kiểu (type) </li></ul></ul><ul><ul><li>Tất cả các signal và variable được gán phải có cùng kích thước (size) </li></ul></ul><ul><li>Nếu signal là một port, người thiết kế phải lưu ý thêm: </li></ul><ul><ul><li>Signals có mode “in” có thể đọc nhưng không được gán giá trị </li></ul></ul><ul><ul><li>Signals có mode “out” có thể được gán giá trị trong process, nhưng không được đọc </li></ul></ul>
    104. 104. Phép gán với Signal entity Count_1 is port (Clk, D : in bit ; Q : out integer range...); end Count_1; architecture WRONG of Count_1 is begin process (Clk) begin If Clk’ event and Clk =‘1’ then Q <= Q + 1; end if ; end process ; Q Internal_Cnt Will produce compiler error architecture RTL of Count_1 is signal Internal_Cnt : integer range ... ; begin process (Clk) begin If Clk’ event and Clk =‘1’ then Internal_Cnt <= Internal_Cnt + 1 ; end if ; end process ; Q <= Internal_Cnt ; Counter
    105. 105. Using Variables <ul><li>Vì phạm vi của một variable chỉ giới hạn trong process ở đó nó được khai báo, ta không thể sử dụng nó để trao đổi giá trị với các module khác, như cách sử dụng các signal </li></ul><ul><li>Bất kỳ variable nào được đọc trước khi giá trị của nó được xác định, đều sẽ được suy diễn như là một register trong cấu trúc hardware nếu như nó được dùng với một process có clock </li></ul><ul><ul><li>Phải cẩn thận khi sử dụng variable trong các process có clock </li></ul></ul><ul><li>Tuy nhiên, rất nên sử dụng các variable được trong các mạch logic tổ hợp trung gian </li></ul><ul><li>Chúng làm tăng tốc độ của việc chạy mô phỏng vì chỉ cần ít delta cycles cho việc cập nhật các tín hiệu ra </li></ul>
    106. 106. Variable trong các Process có Clock process ( Clk ) variable B, C, D : bit := ‘1’ ; begin If ( Clk ’event and Clk =‘1’) then B := A ; C := B ; D := C ; end if ; end process ; Clk A D process ( Clk ) variable B, C, D : bit := ‘1’ ; begin If ( Clk ’event and Clk =‘1’ ) then D := C ; C := B ; B := A ; end if ; end process ; Clk A C B D
    107. 107. entity Count_1 is port (Clk, D : in std_logic ; Q : out std_logic_vector ...); end Count_1; architecture WRONG of Count_1 is begin process (Clk) begin If Clk’ event and Clk =‘1’ then Q <= Q + 1; end if ; end process ; Q Internal_Cnt Alternate Solution Will produce compiler error architecture RTL of Count_1 is begin process (Clk) variable Internal_Cnt : std_logic_vector .. begin If Clk’ event and Clk =‘1’ then Internal_Cnt := Internal_Cnt + 1 ; Q <= Internal_Cnt ; end if ; end process ; Counter
    108. 108. Các lệnh điều khiển chương trình trong VHDL Bài 6
    109. 109. Cấu trúc ngôn ngữ architecture RTL of ENTITY_1 is . . . begin concurrent statements ; . . . process begin case ( sel_a ) is when… . . . end case ; end process ; . . . . . . process begin if (sel_b = “00”) then . . . else…. end if ; end process ; ... end architecture RTL ; <ul><li>Các lệnh if/else , case hoặc loop phải được viết bên trong một process </li></ul>
    110. 110. Các câu lệnh If/Else <ul><li>Câu lệnh if/else làm cho các giao dịch được thực hiện dựa trên những điều kiện nhất định. Có ba dạng lệnh if/else cơ bản sau: </li></ul>process begin if (boolean expression) then sequential statements; end if ; process begin if (boolean expression) then sequential statements ; else sequential statements ; end if ; process begin if (boolean expression 1) then sequential statements ; elsif (boolean expression 2) then sequential statements ; elsif (boolean expression 3) then sequential statements ; else sequential statements ; end if ;
    111. 111. Ví dụ về lệnh If/Elsif <ul><li>1. Điều kiện đầu tiên thoả mãn sẽ được thực hiện ngay </li></ul><ul><li>2. Các điều kiện có thể gối nhau </li></ul><ul><li>3. Điều kiện đầu tiên của lệnh if/elsif có ưu tiên cao nhất </li></ul>process (A, B, C, D, Sel) begin If (Sel = “00”) then Z <= A ; elsif (Sel = “01”) then Z <= B ; elsif (Sel = “10”) then Z <= C ; elsif (Sel = “11”) then Z <= D ; end if; end process ; Z D C B A Sel D C B A Z Late arriving signal? Sufficient for std_logic?
    112. 112. Câu lệnh Case <ul><li>Câu lệnh case làm cho các giao dịch được thực hiện tuỳ thuộc vào giá trị của biểu thức chọn </li></ul><ul><li>Lệnh case có hai dạng cơ bản : </li></ul>process (…) begin case ( selector expression ) is when ... => sequential statements ; when ... => sequential statements ; when ... => sequential statements ; end case ; . . . end process ; process (...) begin case ( selector expression ) is when ... => sequential statements ; . . . when others => sequential statements ; end case ; . . . end process ;
    113. 113. <ul><li>Tất cả các giá trị có thể có của biểu thức chọn đều phải được chỉ rõ (specified) trong câu lệnh </li></ul><ul><li>Các điều kiện không được chồng ch éo ( gối) nhau </li></ul><ul><li>Giải các giá trị được mô tả phải hữu hạn (discrete) </li></ul><ul><li>Lệnh Case thích hợp với các cấu trúc kiểu LUT </li></ul><ul><ul><li>Hầu hết các công cụ tổng hợp mạch </li></ul></ul><ul><ul><li>đều tạo ra cấu trúc MUX từ lệnh case </li></ul></ul>Ví dụ về lệnh Case process (A, B, C, D, Sel ) begin case Sel is when “00” => Z <= A ; when “01” => Z <= B ; when “10” => Z <= C ; when “11” => Z <= D ; end case ; . . . end process ; Is this sufficient for std_logic? Z D C B A Sel
    114. 114. Các điều kiện chồng chéo <ul><li>Ví dụ dưới đây minh hoạ trường hợp các điều kiện chồng chéo nhau. Khi đó ta chỉ có thể sử dụng lệnh if/elseif . Muốn sử dụng lệnh case phải chỉnh lại các điều kiện </li></ul>process (A, B, C, D, Sel) begin If ( Sel <= 3 ) then Z <= A ; elsif ( Sel <= 5 ) then Z <= B ; elsif ( Sel <= 7 ) then Z <= C ; elsif ( Sel <= 9 ) then Z <= D ; end if; end process ; D C B A Z
    115. 115. Giải hữu hạn các giá trị <ul><li>Nếu một giải các giá trị được dùng làm điều kiện của một lệnh case hoặc if/else, nó cần phải hữu hạn (discrete) </li></ul>process (…) begin if (x = 12 to 14) then sequential statements ; . . . case ( selector expression ) is when 0 to 7 => sequential statements ; when 4.3 to 7.7 => sequential statements ; when “1000” to “1010” => sequential statements ; when “1000” | “1010” => sequential statements ; . . . end process ;
    116. 116. Lệnh gán Signal có điều kiện <ul><li>Lệnh gán tín hiệu có điều kiện là một dạng có tác dụng tương đương lệnh if/else </li></ul><ul><li>Cả hai câu lệnh đều có chung một kết quả khi mô phỏng hoặc tổng hợp mạch </li></ul><ul><ul><li>Tuy nhiên, cấu trúc bên phải làm cho chương trình ngắn gọn hơn </li></ul></ul> architecture ... begin process ( A,B, C, Sel ) begin if (Sel = “00” ) then Z <= A ; elsif (Sel = “10”) then Z <= B ; elsif (Sel = “11”) then Z <= C ; else Z <= ‘X’ ; end if ; end process ; end architecture ; architecture ... begin Z <= A when Sel = “00” else B when Sel = “10” else C when Sel = “11” else ‘X’ ; end architecture ;
    117. 117. Lệnh gán Signal có lựa chọn <ul><li>Lệnh gán tín hiệu có lựa chọn là một dạng lệnh có tác dụng tương đương với lệnh case </li></ul><ul><li>Quy tắc sử dụng hoàn toàn giống với lệnh case: </li></ul><ul><ul><li>(1) Tât cả các điều kiện phải được liệt kê đủ </li></ul></ul><ul><ul><li>(2) Các điều kiện không được chồng chéo nhau </li></ul></ul>architecture ... begin process ( A,B,C, SEL ) begin case (SEL) is when “00” => Z <= A ; when “10” => Z <= B ; when “11” => Z <= C ; when others => Z <= ‘X’ ; end case ; end process ; end architecture ; architecture... with SEL select Z <= A when “00” , B when “10” , C when “11” , ‘X’ when others ; end architecture ;
    118. 118. Outline <ul><li>If/else Statements </li></ul><ul><li>Case Statement </li></ul><ul><li>Concurrent Form of If/else and Case Statements </li></ul><ul><li>Loop Statements </li></ul><ul><li>Summary </li></ul>
    119. 119. Các câu lệnh Loop <ul><li>Các câu lệnh loop có thể được dùng cho mọi trường hợp có vòng lặp </li></ul><ul><li>Lệnh loop có nhiều dạng khác nhau, mỗi dạng sử dụng một phương pháp điều khiển lặp riêng. Dạng thông dụng nhất là “for … loop” </li></ul><ul><ul><li>Biến chỉ số ‘ index ’ cho vòng lặp không được khai báo riêng, không thể gán giá trị cho nó, và không được sử dụng ở ngoài vòng lặp </li></ul></ul><ul><ul><li>Nó được dùng như là </li></ul></ul><ul><ul><li>một hằng số </li></ul></ul><ul><ul><li>Sau mỗi phép lặp, giá trị của nó được cập nhật theo chiều hướng ghi trong câu lệnh từ trái sang phải </li></ul></ul>process ( A, B_bus ) begin for i in 7 downto 0 loop C_bus (i) <= A and B_bus (i) ; end loop ;
    120. 120. Sử dụng các lệnh Loop <ul><li>Khi tổng hợp, lệnh loop được “ dàn trải ra” </li></ul><ul><ul><li>Việc tổng hợp mạch dựa trên kết quả logic của từng phép lặp </li></ul></ul><ul><li>Khi mô phỏng, các lệnh loop tạo nên một công cụ linh hoạt để mô hình hoá hành vi </li></ul><ul><li>Các lệnh loop đặc biệt còn hay được sử dụng trong các chương trình con (function và procedure) </li></ul>process ( A, B_bus ) begin for i in 7 downto 0 loop C_bus (i) <= A and B_bus (i) ; end loop ; A B_bus (7) A . . . A B_bus (6) B_bus (0) C_bus (7) C_bus (6) C_bus (0)

    ×