SlideShare a Scribd company logo
Bài 1 Vấ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 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
VHDL - Mục đích và sự hình thành 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) Để 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á VHDL 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 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 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ố tool VHDL-87 VHDL-93 VHDL-2X
Language Subsets 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 IEEE 1076 (modeling) IEEE 1076 (synthesis)
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
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 ;
Trình tự thiết kế Top-Down  VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế
Nguyên tắc phân đoạn  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  Tín hiệu ra có chốt (Register) tại biên giới các module  Phù hợp với cấu trúc mã nguồn dạng RTL  Giảm đến tối thiểu số clock trên mỗi block 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 Duy trì các tín hiệu then chốt trong phạm vi mỗi block Hầu hết các công cụ đều không tối ưu thông qua biên giới hierarchy Kích thước của từng block đủ nhỏ để có thể kiểm tra nhanh chóng Mẫu thử nhanh, đơn giản cho mỗi sub-module
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
Kiểm tra thiết kế 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 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
Các bước kiểm tra thiết kế   (1) Mô phỏng Behavioral  Thực hiện mã nguồn mô tả hành vi, dùng testbench  (2) Mô phỏng RTL  Thực hiện file mã nguồn RTL,  dùng testbench  (3) Mô phỏng chức năng trong VHDL  Thực hiện file .vhd mô tả cấu trúc,  dùng testbench  (4) Mô phỏng chức năng thiết bị ở mức cổng Mô phỏng netlist pre-P&R EDN  dùng công cụ mức cổng (5) Mô phỏng theo quan hệ thời gian trong VHDL Thực hiện file cấu trúc .vhd và file SDF;  dùng testbench (6) Mô phỏng quan hệ thời gian ở mức cổng Mô phỏng netlist post P&R EDN netlist, sử dụng các delays VHDL  modules Synthesis Place & Route
Kiểm tra thiết kế? Chip level Board level Std parts model Model bus operation  Discrete event-driven  Flexibility over strictly  netlist-driven Test-Bench Behavioral Module    MCU FPGA PLD Memory
Kết luận VHDL là một ngôn ngữ dùng để mô hình hoá phần cứng của thiết bị Tổng hợp logic là một tập con của toàn bộ ngôn ngữ 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ế Các mô phỏng HDL có thể bao gồm các dữ liệu định thời (back-annotated timing data)
Bài 2 Ngôn ngữ VHDL
Design Units trong VHDL Entity Architecture Configuration Package Package Body Library 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.
Các loại Design Unit  Trong VHDL có hai loại  design unit , đó là: Primary Không phụ thuộc vào các design unit khác Secondary Phụ thuộc vào primary design unit  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. Các secondary unit không thể tồn tại độc lập  -- tức là,   phải phụ thuộc primary unit
Entity 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  đó 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  ; ’
Architecture Architecture mô tả hoạt động bên trong của thực thể (entity) gắn với nó (primary unit) 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ể 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
Multiple Architecture Có thể có nhiều architecture cùng tồn tại để mô tả hoạt động của một thực thể 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.)  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  ;
Package 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: Constants, data types, subtypes, subprogram và function declarations, v.v… 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 . . .
Package Body 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 Subprograms, deferred constants 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
Library  V ề cơ bản, tất cả các đối tượng  VHDL  đều được lưu trong các thư viện 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 Work v à  std l à hai thư viện dùng được cho mọi  design unit package   std_logic_1164  is .. package   std_logic_arith  is .. package   std_logic_unsigned  is .. library  IEEE ;
Library  Libraries v à  Packages comprise the VHDL Design Management structure Theo m ột nghĩa nào đó, nó tương tự như  directories v à  subdirectories package   std_logic_1164  is .. package   std_logic_arith  is .. package   std_logic_unsigned  is .. library  IEEE ;
Khởi tạo các Library  Tên của library đơn thuần là một tham trỏ về mặt logic 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 package   Fast_Counters  is .. package   DSP_Filters  is .. library  My_Lib ; use   My_Lib.Fast_Counters .all  ; entity  Mod1  is   port  ( . . . library  My_Lib
Khởi tạo các Library  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 đó Đặt tên cho library, và sau đó phân tách các design unit được chọn đưa vào nó package   Fast_Counters  is .. package   DSP_Filters  is .. library  My_Lib ; use   My_Lib.Fast_Counters .all  ; entity  Mod1  is   port  ( . . . library  My_Lib
Work Library Đâ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. 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ế 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
Work Library Một ví dụ về nội dung của  work library 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ó
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
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
Liên kết Tín hiệu 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ê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  U1: DFF port map (D_in, Clk, Rst, Q_out) ; component  DFF    port  ( D, Clock  : in std_logic ;    Reset  : in std_logic ;   Q  : out std_logic ) ; end  component ;
Liên kết Tín hiệu 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ê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)  U1: DFF port map ( D =>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 ;
Signal Declaration 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 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 ;
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 ;   Component instantiation from target library may be helpful for chip level optimization   ( i.e., Xilinx   Virtex ) 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
Sử dụng Generics 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 ) Đ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 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
Cập nhật giá trị của Generics 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ế Nếu không có  generic map , generic nhận giá trị mặc định ban đầu 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;
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 directory Elaboration (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 format Execution (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
Quy trình biên dịch   entity  DFF  is   port  (D, Clk :  in   Reset:  in   Q:  out  . . . architecture.. Analyze Elaborate Execute Synthesize
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ặt Các  entity  phải được phân tích trước các  architecture  tương ứng với chúng Cá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 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 - -  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
Kết luận VHDL bao gồm các  primary  và  secondary design unit 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ẽ 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 Có thể sử dụng  Generics  để tăng tính linh hoạt của mã nguồn ( source code )
Bài 3 Signals và  Data Types
Data Types Data types là một yếu tố quan trọng trong VHDL (cũng như trong các ngôn ngữ khác) 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 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) VHDL là một ngôn ngữ định kiểu rất chặt chẽ Các tín hiệu liên kết với nhau cần phải có cùng kiểu 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 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)
Signals và Ports 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) 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;
Các loại data type trong VHDL  Có 4 categories (loại) data types trong VHDL Scalar Single value object, defined indices, ordered  Composite Group objects, similar or different types  Access Defines pointers to objects covered in Advanced VHDL course    File Sequence of objects of given type covered in Advanced VHDL course
Scalar Data Types 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ó: Bit Boolean Integer Real Physical Character  Std_logic  and std_ulogic Enumerated
Bit 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ết 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
Integer và Real 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 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 Cho 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 ;
Physical 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 Kiểu vật lý được định nghĩa theo đơn vị cơ sở của nó Bất kỳ đơn vị dẫn xuất nào cũng là bội của đơn vị cơ sở 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 ;
Std_logic và Std_ulogic 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 Hỗ trợ các mức giá trị khác nhau của tín hiệu: don't-care conditions, unknown, three-state …  Được định nghĩa trong gói IEEE std_logic_1164 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’).
So sánh Std_logic và Std_ulogic Cả hai kiểu đều chứa cùng một tập các giá trị như nhau Sự khác nhau ở chỗ thực hiện mạch (implementation) Chữ  u  trong ulogic có nghĩa là  unresolved 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 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 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
Signal Resolution 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   Để 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: 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
Enumerated (liệt kê) Tăng mức độ linh hoạt trong việc mô hình hoá phần cứng 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 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 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 ;
Composite Data Types 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 Bit_vector, Std_logic_vector và String là các kiểu hỗn hợp đã được định nghĩa trong VHDL Câu lệnh này tạo nên một kiểu bit_vector (array) từ một nhóm 4 bit 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  signal  A_word  :  bit_vector  (3 downto 0)  :=  “0011”  ;
Array Array là nhóm các phần tử đơn có cùng kiểu (type) ban đầu 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 ;
Phép gán các Array  Khi g án giá trị một  array cho m ột array khác, thì : 1. C ác  array c ần phải có cùng kiểu giá trị 2. C ác  array ph ải có cùng độ dài 3. Ph ép gán được thực hiện theo vị trí, từ trái sang phải 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 ;
Cách viết lệnh gán Array Để đơ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) Có thể sử dụng dấu gạch dưới các giá trị biến cho dễ đọc  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) ;
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
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 ;
Phé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án 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’ ) ;
Gộp các Record 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 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);
Tạo lập các Array 2-D 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) Đâ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 ;  0   1   2   3 7  6  5  4  3  2  1  0
Tạo Array của các Record Array 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 ;  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 . . . . . . . . .
Phép gán các Array 2-D 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 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
Initializing a ROM Array  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 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
Kiểu con trong VHDL 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ó 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   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 subtype   My_Int  is integer range  0  to  255 ; Label Base Type Constraint subtype  My_Small_Int  is  My_Int   range  5  to  30 ;
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” ;
Bài 4 Operators và Expressions
Các toán tử trong VHDL 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  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 quan Các hàm này có trong các gói được gọi là “arithmetic packages ”
Operator Overloading 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 Đ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 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
Các toán tử Logic 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 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
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 ;
Cá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 =  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
Toán tử quan hệ với các Array Ví dụ này cho kết quả là false  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ử 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 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  …
Các toán tử số học 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  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 +   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
Phép tính số học với các biến Array Để 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ế 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 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 Toán tử “+” là overloaded 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;
Array Arithmetic  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 đó Nếu không, compiler sẽ thông báo lại rằng các operator đó là “undefined”  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  ;
Các toán tử Shift (dịch) 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 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 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
Các toán tử Shift (dịch) sll - Logical left shift srl - Logical right shift sla - Arithmetic left shift sra - Arithmetic right shift rol - rotate left logical ror - rotate right logical
Shift Operator - Các ví dụ   V í dụ: signal A_vec : bit_vector (7 downto 0) := “11000110”; signal D_vec : bit_vector (7 downto 0); 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
Concatenation 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 Các phép gán được thực hiện với sự tương hợp vị trí (positional association) 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 ;
Nhóm các toán tử 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 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 + + + + + +
Các Slice của Array 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 Các phần tử khác của array không bị ảnh hưởng bởi phép gán slice 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
Slice và Concatenation 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 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) 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 !!
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ình 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  Tất cả các câu lệnh viết trong một process là những lệnh sequential
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  ; Mọi câu lệnh nằm ngoài một process đều là lệnh concurrent
Process Một process bao gồm các câu lệnh sequential  Các câu lệnh trong một process được thực hiện lần lượt Mỗi process đều phải được hoạt kích theo một cách nhất định 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’ architecture   RTL of My_And2 is begin . . . process  (A, B) begin   C <= A and B ; end process  ; . . . end architecture RTL;
Các Process là đồng thời 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 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  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
Mô hình kết nối trong VHDL 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 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) 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
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”
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’
Tạm dừng các Process 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 Điều này tạo nên trạng thái đợi (wait) cho process  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 Đố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 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;
Các điều kiện Wait 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) Note: Một số  compiler dùng tổng hợp mạch không hỗ trợ điều kiện explicit ‘wait’  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 ;
Modeling Concurrency Công cụ mô phỏng VHDL được hoạt kích theo sự kiện 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 Thời gian giữa các công đoạn này được gọi là delta cycle  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 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
Sắp xếp trình tự các Event 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 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 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
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
Câu lệnh gán tín hiệu “Z <= A” tạo ra một transaction trong VHDL 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 Transactions process  (. . .)  begin   Z <= A ;   F <= G ;   . . . end process  ;
Events 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 đó 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 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 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
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
Khái quát về Signal và Variable trong VHDL  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) 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 Ở 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  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 đó 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ộ
Phạm vi của Signal và Variable Port là signal, được khai báo ở mức cao nhất (entity) Trong mỗi architecture có thể có các signal cục bộ Trong mỗi process có thể có các variable cục bộ entity architecture  Input Ports Signals process  Variables Output Ports
Phép gán với Signal  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 Các quy tắc cơ bản là:  Tất cả các signal và variable được gán phải có cùng kiểu (type) Tất cả các signal và variable được gán phải có cùng kích thước (size) Nếu signal là một port, người thiết kế phải lưu ý thêm: Signals có mode “in” có thể đọc nhưng không được gán giá trị Signals có mode “out” có thể được gán giá trị trong process, nhưng không được đọc
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
Using Variables 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 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 Phải cẩn thận khi sử dụng variable trong các process có clock 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 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
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
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
Các lệnh điều khiển chương trình trong VHDL Bài 6
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  ; Các lệnh   if/else ,  case   hoặc   loop   phải được viết bên trong một process
Các câu lệnh  If/Else 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: 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  ;
Ví dụ về lệnh  If/Elsif 1. Điều kiện đầu tiên thoả mãn sẽ được thực hiện ngay 2. Các điều kiện có thể gối nhau 3. Điều kiện đầu tiên của lệnh  if/elsif   có ưu tiên cao nhất 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?
Câu lệnh  Case 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 Lệnh  case  có hai dạng cơ bản : 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 ;
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 Các điều kiện không được chồng ch éo  ( gối) nhau Giả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 case 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
Các điều kiện chồng chéo  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 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
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) 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 ;
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ạch Tuy 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 <= 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 ;
Lệnh gán Signal có lựa chọn 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 Quy 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 nhau 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 ;
Outline If/else Statements Case Statement Concurrent Form of If/else and Case Statements Loop Statements Summary
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ặp 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” 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 Nó đượ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ải process  ( A, B_bus )   begin   for  i in 7 downto 0  loop   C_bus (i) <= A  and  B_bus (i) ;  end  loop  ;
Sử dụng các lệnh  Loop Khi 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ặp 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 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) 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)

More Related Content

PDF
Vi Điều Khiển Ứng Dụng AT89s52
PDF
Giáo trình thiết kế mạch logic số
PDF
Đề tài: Thiết kế hệ thống giám sát nhiệt độ - độ ẩm phòng trồng nấm bào ngư
PDF
Huong dan su dung phan mem Pspice
PDF
Đề tài: Thiết kế hệ thống đo độ ẩm, HAY, 9đ
DOC
Chuong6 hoạt động ngắt
DOC
Đề tài: Nghiên cứu thiết kế mô hình trạm cấp phôi tự động, HAY
PDF
Chuong 04 mach logic
Vi Điều Khiển Ứng Dụng AT89s52
Giáo trình thiết kế mạch logic số
Đề tài: Thiết kế hệ thống giám sát nhiệt độ - độ ẩm phòng trồng nấm bào ngư
Huong dan su dung phan mem Pspice
Đề tài: Thiết kế hệ thống đo độ ẩm, HAY, 9đ
Chuong6 hoạt động ngắt
Đề tài: Nghiên cứu thiết kế mô hình trạm cấp phôi tự động, HAY
Chuong 04 mach logic

What's hot (20)

PDF
Đề tài: Thiết kế và thi công cân điện tử, HAY, 9đ
PDF
Huongdanthuchanh lcd
PDF
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
PDF
[Cntt] bài giảng kĩ thuật vi xử lí
DOCX
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
PPTX
Báo cáo hệ thống đóng táo tự động dùng plc
DOCX
Đề tài: Thiết bị khóa cửa bằng bảo mật và thẻ chip RFID, HAY
DOCX
Đề tài_ Thiết kế mạch nghịch lưu.docx
PDF
Đề tài: Robot dò line điều khiển qua điện thoại, HAY, 9đ
PDF
Kỹ thuật số
DOC
Đề tài: Đo tốc độ động cơ dùng 8051, HAY, 9đ
PDF
Giải Cơ sở dữ liệu phân tán - PTIT
DOC
Đề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đ
PDF
Đồ án Thiết kế bộ chỉnh lưu hình cầu 1 pha kép để điều khiển tốc độ động cơ đ...
DOC
Giáo trình kỹ thuật số Chương 3 -4.doc
PDF
Kiến trúc máy tính và hợp ngữ bài 05
PDF
Điện tử công suất, Trần Trọng Minh.pdf
PDF
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
PDF
Đề tài: Xây dựng bộ đếm xung, ứng dụng đo tốc độ động cơ, HAY
DOCX
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
Đề tài: Thiết kế và thi công cân điện tử, HAY, 9đ
Huongdanthuchanh lcd
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
[Cntt] bài giảng kĩ thuật vi xử lí
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Báo cáo hệ thống đóng táo tự động dùng plc
Đề tài: Thiết bị khóa cửa bằng bảo mật và thẻ chip RFID, HAY
Đề tài_ Thiết kế mạch nghịch lưu.docx
Đề tài: Robot dò line điều khiển qua điện thoại, HAY, 9đ
Kỹ thuật số
Đề tài: Đo tốc độ động cơ dùng 8051, HAY, 9đ
Giải Cơ sở dữ liệu phân tán - PTIT
Đề tài: Thiết kế hệ thống đo nhiệt độ, HAY, 9đ
Đồ án Thiết kế bộ chỉnh lưu hình cầu 1 pha kép để điều khiển tốc độ động cơ đ...
Giáo trình kỹ thuật số Chương 3 -4.doc
Kiến trúc máy tính và hợp ngữ bài 05
Điện tử công suất, Trần Trọng Minh.pdf
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Xây dựng bộ đếm xung, ứng dụng đo tốc độ động cơ, HAY
[Báo cáo] Bài tập lớn Xử lý tín hiệu số: Thiết kế bộ lọc FIR
Ad

Similar to Vhdl Slides (20)

PPT
Vhdl
PDF
De-cuong-on-tap-NNMTPC.pdf
PDF
Tong quan ve_fpga__1226
PDF
Sinh vienit.net --57669587-c-dhkh-hue
PDF
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
PDF
Reverse Engineering .NET - Advanced Patching, Playing with IL
PDF
Luận văn Thiết kế thi công hệ thống giám sát và điều khiển thiết bị bằng GPRS...
PPT
Bai 1 Gioi Thieu Verilog Va Quartus
PDF
Asp.net 3.5 _1
PDF
Những thuật ngữ thường gặp trong Reverse Engineering .NET
PDF
Topic2_DevOps(Development)_Framework.pdf
PDF
OOP_02_Java can ban.pdf
PPTX
Phan 1 sv
PPT
Linux+03
PDF
Control builder
PDF
Lập trình PLC S7 1200 tiếng Việt-Chuong 4 khái niệm lập trình
PDF
Nhat nghe c#
PDF
C# cơ bản hay
PDF
Nhat nghe c#
PDF
Nhat nghe c#
Vhdl
De-cuong-on-tap-NNMTPC.pdf
Tong quan ve_fpga__1226
Sinh vienit.net --57669587-c-dhkh-hue
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Reverse Engineering .NET - Advanced Patching, Playing with IL
Luận văn Thiết kế thi công hệ thống giám sát và điều khiển thiết bị bằng GPRS...
Bai 1 Gioi Thieu Verilog Va Quartus
Asp.net 3.5 _1
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Topic2_DevOps(Development)_Framework.pdf
OOP_02_Java can ban.pdf
Phan 1 sv
Linux+03
Control builder
Lập trình PLC S7 1200 tiếng Việt-Chuong 4 khái niệm lập trình
Nhat nghe c#
C# cơ bản hay
Nhat nghe c#
Nhat nghe c#
Ad

More from hoadktd (7)

PPT
Traffic Light Control
PPT
Traffic Light Control
PPT
Usb
PPT
Profibus Em277
PPT
Giaotrinh Win Cc
PPT
Dientuso Sld2
PPT
Dientuso Sld
Traffic Light Control
Traffic Light Control
Usb
Profibus Em277
Giaotrinh Win Cc
Dientuso Sld2
Dientuso Sld

Vhdl Slides

  • 1. Bài 1 Vấn đề Mô hình hoá phần cứng (Hardware Modeling)
  • 2. 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 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
  • 3. VHDL - Mục đích và sự hình thành 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) Để 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
  • 4. Chuẩn hoá VHDL 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 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 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ố tool VHDL-87 VHDL-93 VHDL-2X
  • 5. Language Subsets 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 IEEE 1076 (modeling) IEEE 1076 (synthesis)
  • 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. 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. Trình tự thiết kế Top-Down VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế
  • 9. Nguyên tắc phân đoạn 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 Tín hiệu ra có chốt (Register) tại biên giới các module Phù hợp với cấu trúc mã nguồn dạng RTL Giảm đến tối thiểu số clock trên mỗi block 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 Duy trì các tín hiệu then chốt trong phạm vi mỗi block Hầu hết các công cụ đều không tối ưu thông qua biên giới hierarchy Kích thước của từng block đủ nhỏ để có thể kiểm tra nhanh chóng Mẫu thử nhanh, đơn giản cho mỗi sub-module
  • 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. Kiểm tra thiết kế 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 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. Các bước kiểm tra thiết kế (1) Mô phỏng Behavioral Thực hiện mã nguồn mô tả hành vi, dùng testbench (2) Mô phỏng RTL Thực hiện file mã nguồn RTL, dùng testbench (3) Mô phỏng chức năng trong VHDL Thực hiện file .vhd mô tả cấu trúc, dùng testbench (4) Mô phỏng chức năng thiết bị ở mức cổng Mô phỏng netlist pre-P&R EDN dùng công cụ mức cổng (5) Mô phỏng theo quan hệ thời gian trong VHDL Thực hiện file cấu trúc .vhd và file SDF; dùng testbench (6) Mô phỏng quan hệ thời gian ở mức cổng Mô phỏng netlist post P&R EDN netlist, sử dụng các delays VHDL modules Synthesis Place & Route
  • 13. Kiểm tra thiết kế? Chip level Board level Std parts model Model bus operation Discrete event-driven Flexibility over strictly netlist-driven Test-Bench Behavioral Module MCU FPGA PLD Memory
  • 14. Kết luận VHDL là một ngôn ngữ dùng để mô hình hoá phần cứng của thiết bị Tổng hợp logic là một tập con của toàn bộ ngôn ngữ 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ế Các mô phỏng HDL có thể bao gồm các dữ liệu định thời (back-annotated timing data)
  • 15. Bài 2 Ngôn ngữ VHDL
  • 16. Design Units trong VHDL Entity Architecture Configuration Package Package Body Library 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. Các loại Design Unit Trong VHDL có hai loại design unit , đó là: Primary Không phụ thuộc vào các design unit khác Secondary Phụ thuộc vào primary design unit 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. Các secondary unit không thể tồn tại độc lập -- tức là, phải phụ thuộc primary unit
  • 18. Entity 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 đó 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. Architecture Architecture mô tả hoạt động bên trong của thực thể (entity) gắn với nó (primary unit) 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ể 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. Multiple Architecture Có thể có nhiều architecture cùng tồn tại để mô tả hoạt động của một thực thể 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.) 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. Package 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: Constants, data types, subtypes, subprogram và function declarations, v.v… 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. Package Body 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 Subprograms, deferred constants 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. Library V ề cơ bản, tất cả các đối tượng VHDL đều được lưu trong các thư viện 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 Work v à std l à hai thư viện dùng được cho mọi design unit package std_logic_1164 is .. package std_logic_arith is .. package std_logic_unsigned is .. library IEEE ;
  • 24. Library Libraries v à Packages comprise the VHDL Design Management structure Theo m ột nghĩa nào đó, nó tương tự như directories v à subdirectories package std_logic_1164 is .. package std_logic_arith is .. package std_logic_unsigned is .. library IEEE ;
  • 25. Khởi tạo các Library Tên của library đơn thuần là một tham trỏ về mặt logic 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 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. Khởi tạo các Library 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 đó Đặt tên cho library, và sau đó phân tách các design unit được chọn đưa vào nó 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. Work Library Đâ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. 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ế 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
  • 28. Work Library Một ví dụ về nội dung của work library 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. 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. 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. Liên kết Tín hiệu 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ê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 U1: DFF port map (D_in, Clk, Rst, Q_out) ; component DFF port ( D, Clock : in std_logic ; Reset : in std_logic ; Q : out std_logic ) ; end component ;
  • 32. Liên kết Tín hiệu 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ê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) U1: DFF port map ( D =>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 ;
  • 33. Signal Declaration 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 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. 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 ; Component instantiation from target library may be helpful for chip level optimization ( i.e., Xilinx Virtex ) 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. Sử dụng Generics 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 ) Đ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 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. Cập nhật giá trị của Generics 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ế Nếu không có generic map , generic nhận giá trị mặc định ban đầu 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. 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 directory Elaboration (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 format Execution (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
  • 38. Quy trình biên dịch entity DFF is port (D, Clk : in Reset: in Q: out . . . architecture.. Analyze Elaborate Execute Synthesize
  • 39. 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ặt Các entity phải được phân tích trước các architecture tương ứng với chúng Cá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
  • 40. Comments 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 - - 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. Kết luận VHDL bao gồm các primary và secondary design unit 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ẽ 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 Có thể sử dụng Generics để tăng tính linh hoạt của mã nguồn ( source code )
  • 42. Bài 3 Signals và Data Types
  • 43. Data Types Data types là một yếu tố quan trọng trong VHDL (cũng như trong các ngôn ngữ khác) 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 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) VHDL là một ngôn ngữ định kiểu rất chặt chẽ Các tín hiệu liên kết với nhau cần phải có cùng kiểu 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 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)
  • 44. Signals và Ports 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) 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. Các loại data type trong VHDL Có 4 categories (loại) data types trong VHDL Scalar Single value object, defined indices, ordered Composite Group objects, similar or different types Access Defines pointers to objects covered in Advanced VHDL course File Sequence of objects of given type covered in Advanced VHDL course
  • 46. Scalar Data Types 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ó: Bit Boolean Integer Real Physical Character Std_logic and std_ulogic Enumerated
  • 47. Bit 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ết 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. Integer và Real 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 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 Cho 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 ;
  • 49. Physical 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 Kiểu vật lý được định nghĩa theo đơn vị cơ sở của nó Bất kỳ đơn vị dẫn xuất nào cũng là bội của đơn vị cơ sở 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. Std_logic và Std_ulogic 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 Hỗ trợ các mức giá trị khác nhau của tín hiệu: don't-care conditions, unknown, three-state … Được định nghĩa trong gói IEEE std_logic_1164 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. So sánh Std_logic và Std_ulogic Cả hai kiểu đều chứa cùng một tập các giá trị như nhau Sự khác nhau ở chỗ thực hiện mạch (implementation) Chữ u trong ulogic có nghĩa là unresolved 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 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 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. Signal Resolution 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 Để 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: 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. Enumerated (liệt kê) Tăng mức độ linh hoạt trong việc mô hình hoá phần cứng 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 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 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. Composite Data Types 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 Bit_vector, Std_logic_vector và String là các kiểu hỗn hợp đã được định nghĩa trong VHDL Câu lệnh này tạo nên một kiểu bit_vector (array) từ một nhóm 4 bit 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 signal A_word : bit_vector (3 downto 0) := “0011” ;
  • 55. Array Array là nhóm các phần tử đơn có cùng kiểu (type) ban đầu 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. Phép gán các Array Khi g án giá trị một array cho m ột array khác, thì : 1. C ác array c ần phải có cùng kiểu giá trị 2. C ác array ph ải có cùng độ dài 3. Ph ép gán được thực hiện theo vị trí, từ trái sang phải 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. Cách viết lệnh gán Array Để đơ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) Có thể sử dụng dấu gạch dưới các giá trị biến cho dễ đọc 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. 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. 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. Phé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án 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. Gộp các Record 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 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. Tạo lập các Array 2-D 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) Đâ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 ; 0 1 2 3 7 6 5 4 3 2 1 0
  • 63. Tạo Array của các Record Array 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 ; 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. Phép gán các Array 2-D 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 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. Initializing a ROM Array 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 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. Kiểu con trong VHDL 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ó 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 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 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. 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. Bài 4 Operators và Expressions
  • 69. Các toán tử trong VHDL 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 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 quan Các hàm này có trong các gói được gọi là “arithmetic packages ”
  • 70. Operator Overloading 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 Đ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 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. Các toán tử Logic 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 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. 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. Cá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 = 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. Toán tử quan hệ với các Array Ví dụ này cho kết quả là false 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ử 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 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. Các toán tử số học 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 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 + 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. Phép tính số học với các biến Array Để 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ế 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 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 Toán tử “+” là overloaded 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. Array Arithmetic 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 đó Nếu không, compiler sẽ thông báo lại rằng các operator đó là “undefined” 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. Các toán tử Shift (dịch) 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 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 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
  • 79. Các toán tử Shift (dịch) sll - Logical left shift srl - Logical right shift sla - Arithmetic left shift sra - Arithmetic right shift rol - rotate left logical ror - rotate right logical
  • 80. Shift Operator - Các ví dụ V í dụ: signal A_vec : bit_vector (7 downto 0) := “11000110”; signal D_vec : bit_vector (7 downto 0); 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. Concatenation 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 Các phép gán được thực hiện với sự tương hợp vị trí (positional association) 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. Nhóm các toán tử 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 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. Các Slice của Array 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 Các phần tử khác của array không bị ảnh hưởng bởi phép gán slice 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. Slice và Concatenation 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 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) 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. Bài 5 Các câu lệnh Concurrent và Sequential
  • 86. 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ình 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 Tất cả các câu lệnh viết trong một process là những lệnh sequential
  • 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 ; Mọi câu lệnh nằm ngoài một process đều là lệnh concurrent
  • 88. Process Một process bao gồm các câu lệnh sequential Các câu lệnh trong một process được thực hiện lần lượt Mỗi process đều phải được hoạt kích theo một cách nhất định 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’ architecture RTL of My_And2 is begin . . . process (A, B) begin C <= A and B ; end process ; . . . end architecture RTL;
  • 89. Các Process là đồng thời 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 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 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. Mô hình kết nối trong VHDL 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 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) 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. 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. 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. Tạm dừng các Process 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 Điều này tạo nên trạng thái đợi (wait) cho process 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 Đố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 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. Các điều kiện Wait 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) Note: Một số compiler dùng tổng hợp mạch không hỗ trợ điều kiện explicit ‘wait’ 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. Modeling Concurrency Công cụ mô phỏng VHDL được hoạt kích theo sự kiện 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 Thời gian giữa các công đoạn này được gọi là delta cycle 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 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. Sắp xếp trình tự các Event 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 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 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
  • 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. Câu lệnh gán tín hiệu “Z <= A” tạo ra một transaction trong VHDL 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 Transactions process (. . .) begin Z <= A ; F <= G ; . . . end process ;
  • 99. Events 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 đó 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 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 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. 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. Khái quát về Signal và Variable trong VHDL 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) 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 Ở 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 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 đó 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ộ
  • 102. Phạm vi của Signal và Variable Port là signal, được khai báo ở mức cao nhất (entity) Trong mỗi architecture có thể có các signal cục bộ Trong mỗi process có thể có các variable cục bộ entity architecture Input Ports Signals process Variables Output Ports
  • 103. Phép gán với Signal 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 Các quy tắc cơ bản là: Tất cả các signal và variable được gán phải có cùng kiểu (type) Tất cả các signal và variable được gán phải có cùng kích thước (size) Nếu signal là một port, người thiết kế phải lưu ý thêm: Signals có mode “in” có thể đọc nhưng không được gán giá trị Signals có mode “out” có thể được gán giá trị trong process, nhưng không được đọc
  • 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. Using Variables 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 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 Phải cẩn thận khi sử dụng variable trong các process có clock 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 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
  • 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. 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. Các lệnh điều khiển chương trình trong VHDL Bài 6
  • 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 ; Các lệnh if/else , case hoặc loop phải được viết bên trong một process
  • 110. Các câu lệnh If/Else 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: 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. Ví dụ về lệnh If/Elsif 1. Điều kiện đầu tiên thoả mãn sẽ được thực hiện ngay 2. Các điều kiện có thể gối nhau 3. Điều kiện đầu tiên của lệnh if/elsif có ưu tiên cao nhất 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. Câu lệnh Case 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 Lệnh case có hai dạng cơ bản : 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. 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 Các điều kiện không được chồng ch éo ( gối) nhau Giả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 case 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. Các điều kiện chồng chéo 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 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. 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) 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. 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ạch Tuy 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 <= 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. Lệnh gán Signal có lựa chọn 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 Quy 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 nhau 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. Outline If/else Statements Case Statement Concurrent Form of If/else and Case Statements Loop Statements Summary
  • 119. 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ặp 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” 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 Nó đượ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ải process ( A, B_bus ) begin for i in 7 downto 0 loop C_bus (i) <= A and B_bus (i) ; end loop ;
  • 120. Sử dụng các lệnh Loop Khi 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ặp 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 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) 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)