2014年10月10日 星期五

VHDL 觀念釐清

hardware.html
http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf
http://www.csd.nutn.edu.tw/VHDL/CH4.pdf

RTL (Register Transfer level)
Rising_edge(clk) & clk'event and clk = '1'
如果clk正常工作的話兩個都可以正常使用,但是如果clk在低電位時為unknown,使用clk'event and clk = '1' 會造成沒有訊號,Rising_edge(clk)正常,rising_edge has a few extra checks built-in to make sure that you actually have an edge.,Use Rising_edge(clk) instead of clk'event and clk = '1'


std_logic,std_logic_vector & bit,bit_vector
bit : 只能用來代表'0' or '1'
std_logic : 可以用來代表七種資料型態,包括
U’(Uninitialized)
X’(Forcing Unknown)
0’(Forcing 0)
1’(Forcing 1)
Z’(High Impedance)
W’(Weak Unkonwn)
L’(Weak 0)
H’(Weak 1)
-‘(Don’t Care)

所以在程式中當確定訊號只會為0或是1的時候即可以用bit,在某些shift operator中無法使用
std_logic_vector,所以可以使用下列的函式來轉換,不用另外加library,已經在std_logic_1164

"To_bit"
"To_bitvector"
"To_StdLogic"
"To_StdLogicvector"
"To_StdULogic"
"To_StdULogicvector"

integer,signed,unsigned 轉換(Xilinx)

use IEEE.NUMERIC_STD.ALL;
<signed_sig> = TO_SIGNED(<int_sig>, <integer_size>); – integer to signed
<unsigned_sig> = TO_UNSIGNED(<int_sig>, <integer_size>); – integer to unsigned
<int_sig> = TO_INTEGER(<signed_sig>); – signed to integer
<int_sig> = TO_INTEGER(<unsigned_sig>); – unsigned to integer

Delay

Delta Delay
In VHDL simulations, all signal assignments occur with some infinitesimal delay, known as delta delay. Technically, delta delay is of no measurable unit, but from a hardware design perspective one should think of delta delay as being the smallest time unit one could measure, such as a femtosecond (fs).
這是每級預設的最小延遲
慣性延遲(inertial delay model)
可以用在程式當中,但是synthesis後會被optimized, Inertial delay is basically a default component delay
a <= b after 1ns;
wait for time expressions
wait on signal
wait until condition
wait;
這些都是不能合成的,最好只用在testbench裡面
傳遞延遲
通常用在testbench的輸入輸出,Transport delay basically represents a wire delay.

a <= transport b after 1ns;

Concurrent & Sequential Statements


Concurrent為共時性敘述,每個processblock之間為Concurrent
Sequential 為順序性敘述,process內的為Sequential



Signal & Variable


signal assignment statement Target物件 <= 表示式;
variable assignment statement Target物件 := 表示式;

Signal variable都可以指定初始值



Signal 不可以重複設定,可以用在package,entity,architecture,ports
Signal只有在process,procedure,function順時執行到時才會改變資料



variable可以重複設定,可以用在process,procedure,function
variable資料隨時可被更新
模擬時無法看到variablewaveform

Subtypes

次資料型別係用來表示一個資料型別的子集合 (Sub-Sets)

subtype SUBTYPE_NAME is TYPE_NAME [範圍宣告];

次資料型別的宣告,由一個關鍵字subtypeSUBTYPE來表示。之後的識別字為次資料型別
的名稱。關鍵字的後面的識別字用來表示所使用的原始資料型別。最後所宣告的範圍限制,
乃是對次資料型別所局限的範圍做一個定義

SUBTYPE First_ten IS INTEGER RANGE 0 to 9;

有兩種場合,需要使用到次資料型別:
(1)在訊號指定或Case指定的命令列中加以限制其資料的範圍,以控制電路合成的結果。
(2)建立一個解值(Resolved)的資料型別。


Function & Procedure
function可以用來做一些常用的數學運算,但是只能回傳一個值
Procedure function最大的差別在於它可以回傳一個以上的值,而且可以不同型態

array and records types

array types,一組資料物件
陣列資料物件中的元素,可以使用陣列的指標(Index) 來指定陣列中指定位置的元素
type BYTE is array (0 to 7) of bit;
陣列資料型別,通常使用在線性結構的一組資料中,也可以用來表示多維的陣列資料型別
也可以在使用的時候,不宣告其元素的方式來使用,增加程式設計上的彈性

records types,一組不同的資料物件所組合而成
記錄資料型別,係由一組不同的資料物件所組合而成的資料型別,而陣列中的每一個元素可
以是任意的資料型別。
# 在記錄型別內的每一個元素,都可以用一個名稱來加入設定或指定。
# VHDL電路設計語言中的記錄資料型別類似於C語言中的結構(Structure)。記錄資料型別
內的每一個元素,可以是任意的資料型別,也包含陣列資料型別與記錄資料型別均可用來當
作記錄資料型別內的元素。

type OPTYPE is (ADD, SUB, JMP);
type INSTRUCT is
record
OPCODE: OPTYPE;
SOURCE: integer;
DESTINATION: integer;
end record;




沒有留言:

張貼留言