Vấn đề Mô hình hoá phần cứng (Hardware Modeling)

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

Còn VHSIC là từ viết tắt của Very High Speed Integrated Circuit

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

 

ppt120 trang | Chia sẻ: Mr Hưng | Lượt xem: 868 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Vấn đề Mô hình hoá phần cứng (Hardware Modeling), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 1Vấn đề Mô hình hoá phần cứng (Hardware Modeling)VHDL là gì?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 LanguageCòn VHSIC là từ viết tắt của Very High Speed Integrated Circuit 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àyVHDL - Mục đích và sự hình thànhVHDL, trước hết và chủ yếu là một công cụ để mô hình hoá phần cứng (hardware modeling)Để mô phỏng (simulation) và tổng hợp (synthesis) mạch 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ị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 Chuẩn hoá VHDLTổ 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 1076Giố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 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 Tuy nhiên, hầu hết các công cụ (tool)đều hỗ trợ phiên bản đầu tiên (VHDL-87)Các bộ phận của VHDL 200X được hỗ trợ bởi một số toolVHDL-87VHDL-93VHDL-2XIEEE 1076 (modeling)IEEE 1076 (synthesis)Language SubsetsKhô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 logicBehavioralLogicRTLLayoutÍt chi tiết hơn, thiết kế và mô phỏng nhanh hơnChi 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_R5C6Các mức trừu tượng trong mô tả phần cứng FSự chồng chéo trong VHDL BehavioralLogicRTLLayoutPlace & Route UtilityFPGA Vendor LibrarySynthesizable CodeHardware Model Sum D_in(1), Clock =>Clk, Reset =>Rst, Q =>Q_out(1)) ;component DFF port (D, Clock : in std_logic ; Reset : in std_logic ; Q : out std_logic ) ; end component ; 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_ASub_BTopI1I2O1O2Sig_1Bus_1A1A2A4A3B4B3B2B1entity Top is port (I1, I2 : in std_logic; 01, 02 : out std_logic) ; end Top ; Signal DeclarationTất cả các tín hiệu bên trong thực thể cần phải được khai báo rõ ràngentity 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 ; Component instantiation from target library may be helpful for chip level optimization ( i.e., Xilinx Virtex )ClkRstD_in(3)D_in(2)D_in(1)D_in(0)Q_out(3)Q_out(2)Q_out(1)Q_out(0)FDCFDCFDCFDCU3U2U1U0Cụ thể hoá phần tử Sử dụng GenericsGenerics 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)Điều này cho phép khai báo các tham số một cách linh hoạt, mềm dẻolibrary 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 MarkerCập nhật giá trị của GenericsSử 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ếNếu không có generic map, generic nhận giá trị mặc định ban đầulibrary IEEE; use 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;Biên dịch VHDL 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 Analysis (phân tích)Design unit được kiểm tra lỗi cú pháp. Sau khi hoàn tất, nó sẽ được lưu giữ ở work directoryElaboration (chỉnh sửa)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 Synthesis (tổng hợp)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 formatExecution (chỉ mô phỏng)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 Analyze ElaborateExecute SynthesizeQuy trình biên dịch entity DFF is port (D, Clk : in Reset: in Q: out . . . architecture..Trình tự Biên dịch 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ặtCác entity phải được phân tích trước các architecture tương ứng với chúngCác package cần phải được phân tích trước các package body 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Đây là trình tự biên dịch Bottom-up- - 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 = G.. both yield boolean resultBit và Boolean 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...Thích hợp cho việc mô hình hoá ở mức khái niệm lý thuyếtInteger và RealChấp nhận các giá trị và các đại lượng một cách trực quan và linh hoạtCầ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-bitCho phép người thiết kế sử dụng các giá trị floating point Khai báo các kiểu real với giải giá trị thực nhất định Cách dùng giá trị kiểu ‘Real’ không giống như ‘Integer’ 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 ;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 . . . if COND_A and COND_B then NEXT_STATE ‘0’ ) ; WORD ‘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 sizePhép gộp các Array 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ánOnly scalar data variables are allowed on the left-side aggregates.H_Byte ‘1’, 2 to 5 => ‘0’ ) ; 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 earlierTX_PACKET L_BYTE, UPPER=> H_BYTE) ; DATA_WORD H_BYTE); DATA_WORD H_BYTE); Tạo lập các Array 2-DKhi 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)Đây thực sự là một array của các array (hoặc các record)type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0); signal My_Mem : Mem_Array ; 7 6 5 4 3 2 1 00 1 2 3Tạo Array của các RecordArray của các record thường được dùng trong các ứng dụng xử lý gói tin (packet handling) type Data_Array is array ( 0 to 2 ) of OPCODE ; signal My_Data : Data_Array ; 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;PARITYADDRESSDATA_BYTENUM_VALUESTOP_BITS. . .. . .. . .My_DataPhép gán các Array 2-DVớ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_unsignedtype 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 00 1 2 3 My_Mem (conv_integer( W_Addr)) (others => ‘1’) , 1 => “10100010”, 2 => “00001111”, 3 => “11110000” ) ; 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 logicKiểu con trong VHDLMộ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ó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 subtype My_Int is integer range 0 to 255 ; Label Base Type Constraintsubtype My_Small_Int is My_Int range 5 to 30 ;Sử dụng kiểu con trong VHDLtype My_State is ( Load, Jump, Add, Sub, Div, Mult, StorA, StorB) ; signal Curr_State, Next_State : My_State ; Label Base Type Constraintsubtype 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” ; Bài 4Operators và ExpressionsCác toán tử trong VHDLVHDL 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 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 Đặ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 Các Function (subprogram) được tạo ra để khắc phục những vấn đề liên quanCác hàm này có trong các gói được gọi là “arithmetic packages” Operator OverloadingOperator 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Đ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 địnhCompiler tự động chọn sub-function thích hợp dựa trên data type của các operandssignal 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 Greater than >= Greater than or equalsignal FLAG_BIT : boolean ; signal A, B : integer ;FLAG_BIT 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ị falseCác toán tử quan hệCác toán tử quan hệ có thể dùng với hầu hết các data type Tất cả các toán tử quan hệ đều cho kết quả kiểu (type) Boolean 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 valuessignal A_vec : bit_vector ( 7 downto 0 ) := “11000110” ; signal B_vec : bit_vector ( 5 downto 0 ) := “111001” ;if ( A_vec > B_vec ) then State ; when . . .signal Int_Bus : std_logic_vector ( 5 downto 0 ) ; . . . Int_Bus ; when . . .Will Not Compile!process ( Int_Bus ) begin case ( Int_Bus ) is when “110011” => ; when . . .Optimal !!Bài 5 Các câu lệnh Concurrent và Sequential Mô hình hoá phần cứngĐể 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ự)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ìnhCá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 Tất cả các câu lệnh viết trong một process là những lệnh sequential 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 ;Mọi câu lệnh nằm ngoài một process đều là lệnh concurrentCấu trúc ngôn ngữarchitecture RTL of My_And2 is begin . . . process (A, B) begin C 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 ;Câu lệnh CaseCâ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ọnLệnh case có hai dạng cơ bản: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ệnhCác điều kiện không được chồng chéo (gối) nhauGiải các giá trị được mô tả phải hữu hạn (discrete)Lệnh Case thích hợp với các cấu trúc kiểu LUT Hầu hết các công cụ tổng hợp mạch đều tạo ra cấu trúc MUX từ lệnh caseprocess (A, B, C, D, Sel ) begin case Sel is when “00” => Z Z Z Z sequential statements ; when 4.3 to 7.7 => sequential statements ; when “1000” to “1010” => sequential statements ; when “1000” | “1010” => sequential statements ; . . . end process ; Giải hữu hạn các giá trị 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)Lệnh gán Signal có điều kiện 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 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ạchTuy nhiên, cấu trúc bên phải làm cho chương trình ngắn gọn hơn architecture ... begin process ( A,B, C, Sel ) begin if (Sel = “00” ) then Z Z Z Z 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 ;Lệnh gán Signal có lựa chọnLệ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 caseQuy tắc sử dụng hoàn toàn giống với lệnh case: (1) Tât cả các điều kiện phải được liệt kê đủ(2) Các điều kiện không được chồng chéo nhauOutlineIf/else StatementsCase StatementConcurrent Form of If/else and Case StatementsLoop StatementsSummaryprocess ( A, B_bus ) begin for i in 7 downto 0 loop C_bus (i) <= A and B_bus (i) ; end loop ;Các câu lệnh Loop Các câu lệnh loop có thể được dùng cho mọi trường hợp có vòng lặpLệ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”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ặpNó được dùng như là một hằng số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ảiprocess ( A, B_bus ) begin for i in 7 downto 0 loop C_bus (i) <= A and B_bus (i) ; end loop ;AB_bus (7) A... AB_bus (6)B_bus (0)C_bus (7)C_bus (6)C_bus (0)Sử dụng các lệnh LoopKhi tổng hợp, lệnh loop được “dàn trải ra”Việc tổng hợp mạch dựa trên kết quả logic của từng phép lặpKhi 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 viCá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)

Các file đính kèm theo tài liệu này:

  • pptvhdlslides_1211016514615988_8_0373.ppt
Tài liệu liên quan