YiHwa Lai 2003/08/15
大綱
z VHDL語言的基本概念
z 資料型別與資料物件的宣告 z VHDL的敘述語法
z 階層式設計
z 函式、程序與套件 z 問題與討論
z 參考資料
VHDL歷史背景
z VHDL-Very High Speed Integrated Circuit Hardware Description Language z 1983年美國國防部委託IBM、Texas Instrument、Intermetrics負責發展。
z 1987年定義成標準硬體語言,此一標準稱之為IEEE Std 1076-1987,又稱 為VHDL 87。
z 1993年再次更新,更新後之標準稱之為IEEE Std 1076-1993,又稱為VHDL 93。
z 1996年,IEEE將電路合成的程式標準與規格,加入到VHDL電路設計語言 中。
VHDL基本設計觀念
z VHDL語言程式之撰寫,可分為兩個部分:
¾ 單體(Entity):電路外觀之描述
¾ 架構(Architecture):電路內部功能之描述
Ex:
電路設計中的單體部分
z 單體部分主要分為兩大部分:
¾ 單體的宣告
¾ 輸出入埠的描述
z 單體宣告的語法如下:
Entity 單體名稱 is
port( 訊號A :模式 資料型態;
訊號B :模式 資料型態;
• • •
• • •
• • •
訊號N :模式 資料型態);
End單體名稱;
電路設計中的單體部分(續)
Ex:
ENTITY DFF is
PORT(CLK,D: IN STD_LOGIC;
Q: OUT STD_LOGIC );
END DFF;
z 輸出入埠模式
¾ In:表示該腳位要從外界接收信號
¾ Out:該腳位將傳送信號到外界
¾ Inout:可收送雙向模式的Port信號
In Out
電路設計中的架構部分
z 電路架構描述部分其語法如下:
Architecture 架構名稱 of 單體名稱 is
{架構之宣告區}
Begin
{架構描述程式}
End 架構名稱;
電路設計中的架構部分(續)
z 電路架構描述部分其設計的風格可歸納為三種型式:
¾ 結構性描述(Structure Description):主要透過元件的宣告與元件的叫用等方式,構
成電路中各元件的連線關係。
電路設計中的架構部分(續)
¾ 資料流型式(Data Flow):主要是使用VHDL語言中所內建的標準布林函式為主軸,
將各訊號間的布林代數關係,以布林方程式來表示之。
電路設計中的架構部分(續)
¾ 行為性描述(Behavior Description):屬於高階描述方式。主要使用電路特性的行
為性描述來設計,如此透過電腦的合成與最佳化,可以加快產品的設計週期,
並使設計之電路,非常易於維護。在VHDL語言中的行為性描述電路設計,通 常是使用Process的方式達成。
VHDL程式架構
資料的型別
z 邏輯訊號
¾ 布林代數(Boolean)
¾ 位元(Bit)
¾ 標準邏輯(Std_Logic)
¾ 基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)
¾ 內部訊號宣告(Signal)
z 數值訊號
¾ 整數(Integer)
¾ 實數(Real)
¾ 列舉式(Enumeration)資料型別
¾ 陣列(Array)資料型別
¾ 記錄(Record)資料型別
邏輯訊號-Boolean
z 布林代數(Boolean):
布林代數訊號型式的定義如下:
Type BOOLEAN is (False,True)
上面布林代數的訊號型式包含False和 True兩種狀態:
¾“False”代表邏輯狀態:’0’
¾“True”代表邏輯狀態:’1’
【註】Type是VHDL語言中用來宣告訊號型式的指令。
Ex:
type boolean is (false, true);
variable A,B,C: boolean;
邏輯訊號-Bit
z位元(Bit)
Bit型式是數位邏輯中最基本的邏輯型式,它在VHDL語法中宣告的定義如下:
Type BIT is (‘0’, ‘1’)
從上面的定義中,我們可以得知BIT的訊號型式共有‘0’和‘1’兩種類型。
在VHDL中關於BIT型式的邏輯可以適用的運算如下:
【註】邏輯運算子“XNOR”僅支援VHDL-93 Ex:
type bit is (‘0’,‘1’);
signal x,y,z: bit;
邏輯訊號-Std_Logic
z標準邏輯(STD_LOGIC)
在VHDL中標準邏輯訊號型式定義是:
Type STD_LOGIC is(‘X’, --Forcing Unknown;浮接不定
‘0’, --Forcing 0;低電位
‘1’, --Forcing 1;高電位
‘Z’, --High Impedance;高阻抗
‘W’, --Weak Unknown;弱浮接
‘L’, --Weak 0;弱低電位
‘H’, --Weak 1;弱高電位
‘-’, --Don’t care;不必理會
邏輯訊號-Bit_Vector & Std_Logic_Vector
z基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)
在數位邏輯電路中,有時候我們會將幾個屬性相同的訊號合成一組代表特定功 能的序列訊號,例如微處理機系統中的資料匯流排(Data Bus)或位址匯流排 (Address Bus)等。VHDL語法針對這樣的需求也定義了基本邏輯序列(Bit_Vector) 與標準邏輯序列(Std_Logic_Vector)兩種型態;簡單的說,一群Bit可以構成 Bit_Vector,而一群Std_Logic也可組成Std_Logic_Vector序列。
以上圖為例,我們可以將之以訊號序列型態描述如下:
邏輯訊號-Signal
z Signal指令是宣告電路內部自行使用的訊號,因為這類訊號沒有傳送到電路 的外部界面,所以通常我們都是在架構(Architecture)中宣告它,而非在 VHDL程式的單體(Entity)裡進行宣告。
數值訊號-Integer Data Type
z VHDL語言中的整數數值範圍 : ( - 231 + 1 ) to ( + 231 - 1 )
z Example of Integer Data Type:
Signal A:Integer; --32位元數值宣告 Signal B,C:Integer range 0 to 7; -- 3位元數值宣告 Variable INT_S:Integer; --32位元數值宣告
數值訊號-無號整數(UNSIGNED)序列
z Unsigned指令宣告,它同時具有邏輯和數值的特性,因此既可作邏輯處理 又可作數值運算。
Ex:
Signal A:Std_logic;
Signal B,C:Unsigned(3 downto 0);
……
A<=B(3) and B(2) or B(0) ; --邏輯處理
C<=B-1; --數值運算
數值訊號- Real Data Type
z VHDL語言中的實數範圍:
-1.0E38 to 1.0E38
z Example of Real Data Type:
Signal A,B:Real;
……
A<=3.0 ; --需要表示成小數點型式
B<=1.5E15;
數值訊號- Enumerated Data Type
z 列舉式資料型別(Enumeration type)是一種集合種類的宣告,使用者可以 使用一些有意義的名稱,將其定義成集合體的元素 。
z Example of Enumeration Data Type:
Type co_state IS (main_green, main_yellow, farm_green, farm_yellow);
Type std_ulogic IS (‘U’, ‘X’ ,‘0’, ‘1’, ‘Z’, ‘W’, ‘L’ ,‘H’, ‘-’);
Type week IS (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
數值訊號- Array Data Type
z 陣列資料型別是由同一種資料型別所組成的資料型別 。 z Example of Array Data Type:
Type Byte IS Array(7 downto 0) of Bit;
Type Word IS Array(31 Downto 0) of Bit;
z Example (二維的ROM):
Type ROM_table5x4 IS array (0 to 4, 0 to 3) of bit;
Constant ROM_con: ROM_table5x4:=
( (‘1’,’0’,’0’,’1’), (‘0’,’1’,’0’,’1’), (‘0’,’0’,’1’,’0’), (‘1’,’0’,’0’,’1’), (‘0’,’0’,’1’,’1’) );
數值訊號-Record Data Type
z 記錄資料型別(Record types)與陣列資料型別(Array Types)最大的差異是 在於記錄資料型別是由兩種或兩種以上資料型別所構成,它可視為族群元 素集合體的宣告。
z Example of Record Data Type:
Type MU2 IS Record
Din,Dout: bit_vector(7 downto 0);
S:bit;
End Record;
Signal X,Y:MU2;
資料物件
z 常數(Constants)
z 訊號(Signals)
z 變數(Variables)
z 別名(Aliases)
資料物件-常數(Constants)
z 在VHDL語言中,我們將固定值宣告成常數 ,它類以C語言中以#define來 設定常數值的作法。
z Example of Constants:
Constant A: Std_logic_vector(3 downto 0):=“0011”;
Constant Width: Integer:=8;
Constant PI : real := 3.1415926535897 ;
……
資料物件-訊號(Signals)
z 訊號可以用來宣告所有元件內部的信號線或內接腳位 。 z Example of Signals:
Signal A:Std_Logic_vector(4 downto 0);
Signal temp: bit_vector(0 to 3);
……
資料物件-變數(Variables)
z 變數之處理及設定一定要發生在行為描述程式內,而不可在行為描述程式 外,因此變數屬於局部(Local)物件 。
z Example of Variables:
Variable temp: Std_logic:= ‘0’;
Variable temp: Std_logic_Vector(3 downto 0);
Variable A,B:Boolean:=False
Variable Name
Data Type Assignment Statement
資料物件-別名(Aliases)
z 在電路中,若有一條匯流排需要區分成數束不同的子線連接到各個地方去 時,我們就可以將原來的母線分開來各自命名,宣告每一束子線並各給其 一個別名(Aliases)。
z Example of Aliases:
Signal A_Bus: Std_Logic_Vector(31 downto 0);
Alias Bank1 : Std_Logic_Vector(7 downto 0) IS A_Bus (31 downto 24);
Alias Cal_D : Std_Logic_Vector(15 downto 0) IS A_Bus (23 downto 8);
Alias Rank : Std_Logic_Vector(7 downto 0) IS A_Bus (7 downto 0);
運算子(Operators)
z 邏輯運算子:not and or xor nand xnor z 關係運算子:= /= < <= > >=
z 算術運算子:+ (加)、- (減)、* (乘)、/ (除)、**(次方)、REM、MOD z 位移運算子:SLA、SRA、SLL、SRL、ROL、ROR
運算子(Operators)- 邏輯運算子
z Logic operators:
not and or xor nand xnor
運算子(Operators)-關係運算子
z Relational operators:
¾ = , /= , < , <= , > , >=
¾ Operands must be of the same type
運算子(Operators)- 算術運算子
z Arith. operators:
¾ + (加)、- (減)、* (乘)、/ (除)、**(次方)、REM(求餘數)、MOD(求商數)
運算子(Operators)- 位移運算子
A=“10010101”
算術向左位移 算術向右位移 邏輯向左位移
邏輯向右位移 向左旋轉
向右旋轉
VHDL的敘述語法
z 在VHDL電路設計語言的架構描述中,可以分成兩種類型的敘述語法:
¾ 共時性敘述(Concurrent Statements)
¾ 順序性敘述(Sequence Statements)
z 在架構內的每一個程式敘述,均代表著同時發生的性質,但在Process敘述 內(或次程式)的程式敘述,則稱之為順序性敘述。
z 在電路架構中的每一個Process敘述或次程式,其均代表著共時性的意義。
Process(…) Begin
{順序性描述}
共時性敘述
z 直接設定敘述:使用 “<=”運算子 z 條件式的訊號設定敘述:when-else
訊號Y <= 訊號 A when (條件1) else 訊號 B when (條件2) else 訊號 C ;
z 選擇式的訊號設定敘述:with-select-when
with 選擇訊號 X select
訊號Y <= 訊號 A when 選擇訊號 X 為 m,
訊號 B when 選擇訊號 X 為 n,
:
訊號 Z when others ;
共時性敘述-when…else敘述
z Example:二對四解碼器電路
共時性敘述-with…select…when敘述
z Example:四對二編碼器電路
順序性敘述-Process敘述
z Process敘述是VHDL語言中,用來描述行為化電路模型的主要敘述。其語 法如下:
Label1:PROCESS (Sensitivity List) 變數宣告區
BEGIN
PROCESS主體敘述 END PROCESS Label1;
z 在PROCESS 的程式主體內主要是由順序性敘述,如if…then…else等敘述 方法來描述電路的行為化模型。
IF敘述-if…then…end if
z IF敘述的第一種架構為只有IF…Then…End IF,其語法如下:
if (條件式) then 命令敘述;
end if;
z 此種架構主要用途是用來描述記憶元件如正反器、閂鎖器…等。
Ex:
IF敘述-if…else…end if
z IF敘述的第二種架構為具有else指令的架構,其語法如下:
if (條件式) then 命令敘述 1;
else
命令敘述 2;
end if;
Ex:
IF敘述-if…elsif…else…end if
z IF敘述的第三種架構,具有2個以上的條件式,可以用來描述具有優先順序的 選擇邏輯電路,其語法如下:
if (條件式 1) then 命令敘述 1;
elsif (條件式 2) then 命令敘述 2;
else
命令敘述 3;
end if;
IF敘述-if…elsif…else…end if
Ex:
IF敘述-巢狀似敘述
z IF敘述也可以巢狀似敘述,其語法如下:
if (條件式 1) then if (條件式 2) then
命令敘述 1;
else
命令敘述 2;
end if;
else
命令敘述 3;
end if;
IF敘述-巢狀似敘述
z Ex:
Wait敘述
z Wait Until 條件式
Ex:Wait Until CLK’event and CLK=’1’;
z Wait On 訊號 Ex: Wait On a,b
z Wait For 時間表示式 Ex: Wait For 20ns;
Ex: Wait For (a*(b+c));
Case敘述-case…when敘述
z Case…when條件敘述指令,可以用來描述一個或一組特定的選擇訊號對於 一些電路所做成的選擇邏輯,其語法如下:
Case 選擇訊號 IS
When 選擇訊號1 =>
敘述命令1;
When 選擇訊號2 =>
敘述命令2;
: When Others =>
敘述命令N;
Case敘述-case…when敘述
z Ex:一對四的解多工器設計
LOOP敘述
z VHDL語言中使用LOOP敘述,來描述重複性的電路操作特性。
z LOOP敘述有三種寫法,分別為:
¾ for…loop
以遞減的方式從開始值執行到結束值為止,其語法如下:
for I in 開始值 downto 結束值 loop {命令敘述}
end loop;
以遞增的方式從開始值執行到結束值為止,其語法如下:
for I in 開始值 to 結束值 loop {命令敘述}
end loop;
¾
LOOP敘述
¾ 單純的loop敘述
單純的loop敘述會一直反覆的執行,直到exit或next的敘述出現,其條件為真時,才會 跳出loop迴圈敘述。其語法如下:
標題名稱:loop {順序性敘述}
end loop 標題名稱;
next敘述用來中斷這一次的迴圈運算,而重頭開始迴圈敘述的運算,其語法如下:
next 標題名稱 when 條件式;
exit敘述用來中斷整個迴圈敘述,程式流程直接跑到迴圈敘述的結尾處,其語法如下:
exit 標題名稱 when 條件式;
LOOP敘述-for…loop敘述 & while…loop敘述
z for…loop Ex:
z while…loop Ex:
LOOP敘述-單純的loop敘述
z loop指令與exit指令一起使用時,Ex:
z loop指令與next指令一起使用時,Ex:
方塊(Block)敘述
z Block主要是將同一電路中某一功能的電路以方塊敘述劃分起來,形成一 個獨立的電路模組,最後將這些獨立模組組合起來構成我們的電路,模組 化的設計方式可以使得系統的維護性和偵錯性大為提高。
z Block方塊敘述的語法如下:
方塊名稱:Block 資料物件宣告區 Begin
方塊內容程式
END Block 方塊名稱
方塊(Block)敘述
Ex:
Component與port map
z Component的功能能夠協助我們作元件資料庫的設計,它與port map結合可 以讓我們利用現有的component像堆積木一般累積出複雜的電路。
z Port Map腳位設定的方式如下:
¾ 位置對應表示式 (must match the port order) FA1: full_adder PORT MAP (Cin, a0, b0, S0, t1);
¾ 名稱對應表示式: signal => port_name
FA1: full_adder PORT MAP (Cin=>x, a0=>y, b0=>z, S0=>Sum, t1=>Carry);
Component與port map
Ex:利用四對一多工器的component建立十六對一多工器
¾ 四對一多工器描述(component)
library IEEE;
use IEEE.STD_LOGIC_1164.all;
ENTITY mux4_1 IS
PORT ( D0,D1,D2,D3 ,S1,S0 : IN STD_LOGIC; Y : OUT STD_LOGIC);
END mux4_1 ;
ARCHITECTURE a OF mux4_1 IS BEGIN
Y<=(D0 and (not S1)and (not S0))
Component與port map
¾ 十六對一多工器描述(component)
Generic和Generic map的使用
z Generic在VHDL語言中,係用來定義元件的參數,如此,VHDL中的元件 就成了參數化的元件,而元件 Generic的設定,可以透過Generic Map的方 式,將所欲設定的參數數值,傳給參數化元件。
z VHDL語言中的Generic必須在元件的單體宣告區域內來宣告之。
Ex:以一個具有Generic的元件RREG來完成一個8位元的暫存器
¾ RREG部分程式 LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY rreg IS
default value
Generic和Generic map的使用
¾ 8位元暫存器部分程式 ARCHITECTURE a OF reg8 IS
COMPONENT rreg
GENERIC ( Size: INTEGER := 2);
PORT ( CLK :IN STD_LOGIC;
nRST :IN STD_LOGIC;
D :IN STD_LOGIC_VECTOR( Size - 1 DOWNTO 0 );
Q :OUT STD_LOGIC_VECTOR( Size - 1 DOWNTO 0 ));
END COMPONENT;
BEGIN
U1: rreg GENERIC MAP (8) PORT MAP ( CLK => CLK,
nRST => nRST,
For-Generate敘述
z VHDL程式提供了For-Generate敘述來描述一些具有重覆性特性的電路,它 雖然以迴圈的型式來撰寫,但本身卻是屬於並行敘述指令之一,不可放在 Process指令敘述中使用。
z 其格式如下:
標記名稱:For I in 開始值 to 結束值 Generate
……
END Generate;
Ex:
G1:For I in 3 downto 0 Generate
SUM(I)<=A(I) xor B(I) xor Carry(I);
For-Generate敘述
z 以Generate 敘述設計一四位元加法器
ARCHITECTURE a OF full_add4 IS component FULL_ADD
port(SA,SB,SCin:in bit;
Scout,SUM :out bit);
end component;
signal CARRY:bit_vector(4 downto 0);
BEGIN
CARRY(0)<=cin;
G1:for I in 3 downto 0 generate
FA:FULL_ADD port map (CARRY(I),A(I),B(I),CARRY(I+1),SUM(I));
end generate G1;
cout<=CARRY(4);
函式(Functions)
z 函式(Functions)的宣告語法如下:
Function 函式名稱 (輸入參數:資料型別) Return 輸出參數型別;
z 函式(Functions)的主體內容語法如下:
Function 函式名稱 (輸入參數:資料型別) Return 輸出參數型別 IS 函式內的區域變數(Local Variable)宣告區
Begin
函式內的主體內容區 Return 輸出之參數名稱;
END 函式名稱;
函式(Functions)
Ex:函式(Functions)的宣告語法如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY function_calls IS PORT ( A,B,C,D,E: IN STD_LOGIC;
Y1,Y2,Y3 : OUT STD_LOGIC);
END function_calls;
ARCHITECTURE a OF function_calls IS
函式(Functions)
BEGIN
process(A,B,C,D,E) begin
Y1<=Fn1(A,B,C,D) xor E;
--呼叫Fn1函式(使用位置對應表示法) Y2<=Fn1(F3=>C,F4=>D,F1=>A,F2=>B) xor E;
--呼叫Fn1函式(使用名稱對應表示法) Y3<=E xor Fn1(A,B,F4=>D,F3=>C);
--呼叫Fn1函式(位置與名稱對應混合法) end process;
end a;
程序(Procedures)
z 程序(Procedures)的傳回值則可以不限於一個(與函式最大的不同) z 在VHDL語言中,程序(Procedure)的宣告語法如下:
Procedure 程序名稱 ( Signal 訊號A: 資料型別;
Signal 訊號B: 資料型別;
…..
Signal 訊號E: 資料型別;
Signal 訊號M: OUT 資料型別;
Signal 訊號N: OUT 資料型別 ) IS Begin
程序(Procedures)
Ex:
ENTITY adder4 IS
PORT ( a,b:in std_logic_vector(3 downto 0);
cin:in std_logic;
sum:out std_logic_vector(3 downto 0);
cout:out std_logic);
END adder4;
ARCHITECTURE structural OF adder4 IS
procedure full_adder(a,b,c:in std_logic;
sum,cout:out std_logic) IS begin
程序(Procedures)
BEGIN
process(a,b,cin)
variable result:std_logic_vector(3 downto 0);
variable carry:std_logic;
begin
full_adder(a(0),b(0),cin,result(0),carry);
--呼叫一位元全加法器程序 full_adder(a(1),b(1),carry,result(1),carry);
--呼叫一位元全加法器程序 full_adder(a(2),b(2),carry,result(2),carry);
--呼叫一位元全加法器程序
套件(Packages)
z Package是一種設計單元,它用來宣告一些VHDL中可使用的物件,讓使用 者 可 以 將 VHDL 中 的 Functions、Procedures 及 資 料 型 別 的 定 義 用 一 個 Package包裝起來,而凡是在套件(Package)內所定義和宣告的東西就變成 是公開的,可以在全程式中使用。其語法如下:
Package 套件名稱 IS --套件宣告部份
套件宣告部份 END 套件名稱;
Package Body 套件名稱 IS --套件主體 套件主體之內容
END 套件名稱;
套件(Packages)
z 當我們的VHDL程式需要使用某一個套件裡所定義的函式或程序時,其語 法如下:
USE 目錄名稱.套件名稱.指定的項目;
z 最簡單的例子就是在VHDL程式設計中一定會用使到的:
USE ieee.std_logic_1164.all
其意即為使用IEEE目錄下的std_logic_1164套件內所有的副程式與資料型 別。
z 若我們設計的VHDL程式需要用到自己所建立的my_package套件時,語法 如下:
USE work.my_package.all
套件(Packages)
Ex:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE parity_package IS
FUNCTION ODD_par8 (DI: STD_LOGIC_VECTOR(7 DOWNTO 0) ) RETURN STD_LOGIC;
FUNCTION ODD_par81 (DI: BIT_VECTOR(7 DOWNTO 0)) RETURN BIT;
END parity_package;
PACKAGE BODY parity_package IS --Function # 1
FUNCTION ODD_par8 (DI: STD_LOGIC_VECTOR(7 DOWNTO 0)) RETURN STD_LOGIC IS
VARIABLE temp: STD_LOGIC := '0';
BEGIN
FOR K IN 7 DOWNTO 0 LOOP
套件(Packages)
--Function # 2
FUNCTION ODD_par81 (DI: BIT_VECTOR(7 DOWNTO 0)) RETURN BIT IS
VARIABLE temp: BIT := '0';
BEGIN
FOR K IN 7 DOWNTO 0 LOOP
temp := DI(K) XOR temp;
END LOOP;
RETURN temp;
END ODD_par8;
END parity_package;
套件(Packages)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.parity_package.all;
ENTITY PAR_EX IS
PORT ( D_IN1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
D_IN2: IN BIT_VECTOR(7 DOWNTO 0);
PAR_OUT1: OUT STD_LOGIC;
PAR_OUT2: OUT BIT);
END PAR_EX;
ARCHITECTURE arch OF PAR_EX IS BEGIN
問題與討論
問題:如何呼叫Verilog程式?
建議:使用component與port map指令,來呼叫Verilog程式。
Ex:
--(verilog 程式)-- --(VHDL程式)-- begin
module add(a,b,c); library ieee; S1:add port map(x,y,sum);
input a; use ieee.std_logic_1164.all; end adder_arch;
input b; entity adder is output [1:0]c; port( x: std_logic;
wire [1:0]c; y: std_logic;
sum: std_logic_vector(1downto 0));
assign c=a+b; end adder;
architecture adder_arch of adder is endmodule; component add is
port( a: std_logic;
b: std_logic;
問題與討論
問題:如何簡化VHDL程式?
建議:利用Package設計方法。將常用的資料型別、元件、函式及程序,放入自訂的套件中。
Ex:¾ 未使用Package時
ENTITY PAR_EX IS
PORT ( D_IN1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
D_IN2: IN BIT_VECTOR(7 DOWNTO 0);
PAR_OUT1: OUT STD_LOGIC;
PAR_OUT2: OUT BIT);
END PAR_EX;
ARCHITECTURE arch OF PAR_EX IS --Function # 1
FUNCTION ODD_par8 (DI: STD_LOGIC_VECTOR(7 DOWNTO 0))
問題與討論
--Function # 2
FUNCTION ODD_par81 (DI: BIT_VECTOR(7 DOWNTO 0)) RETURN BIT IS
VARIABLE temp: BIT := '0';
BEGIN
FOR K IN 7 DOWNTO 0 LOOP
temp := DI(K) XOR temp;
END LOOP;
RETURN temp;
END ODD_par8;
BEGIN
PAR_OUT1 <= ODD_par8(D_IN1); --Require Function # 1;
PAR_OUT2 <= ODD_par81(D_IN2); --Require Function # 2;
END arch;
問題與討論
¾ 使用Package時
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.parity_package.all;
ENTITY PAR_EX IS
PORT ( D_IN1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
D_IN2: IN BIT_VECTOR(7 DOWNTO 0);
PAR_OUT1: OUT STD_LOGIC;
PAR_OUT2: OUT BIT);
END PAR_EX;
問題與討論
問題:如何整合2個以上功能方塊?
建議:於撰寫VHDL程式之前,先規劃功能方塊間彼此的控制訊號及資料型態,並繪製時序圖,
再進行程式撰寫。
MUX2 Modulation
Dp_ctrl
Edp_data
Mdp_data Mdp_enable
Mdp_reset
Da_data
Da_sleep
Mux2_CLK(2MHz) Mod_CLK(16MHz)
Dp_ctrl Edp_data Mux2_CLK
Mdp_enable Mdp_data
參考資料
z 參考書籍:
¾ 林傳生,使用VHDL電路設計語言之數位電路設計,儒林
¾ 黃文吉,VHDL基本程式寫作及應用,儒林
z 參考網站:
¾ www.vhdl.org
¾ www.xilinx.com
¾ www.altera.com