一些學到的或自己總結的vhdl經驗點滴,紀錄下來,以免以後忘記了。因為有些是自己總結的,肯定有錯誤或不周之處,歡迎高手指正!內容逐步補充中。
1。如何判斷乙個process綜合結果是組合邏輯還是時序邏輯?
a:乙個比較簡單的辦法是看敏感訊號和條件語句的條件,如果是電平觸發的,很可能是時序邏輯;如果是邊緣觸發的,則是時序邏輯。
2。採用二程序狀態機比單程序狀態機好,把同步時序和組合邏輯分開,有利於綜合器優化**。碰到需要對時鐘計數的時候,可能會覺得用單程序方便點,如果要用雙程序結構的話,可以把計數放在同步程序裡,給出乙個計數值,而組合程序用這個值作為輸入,這樣保證組合程序仍然是組合邏輯(裡面不含邊沿觸發條件)。
3。採用統一的介面時序。乙個fpga設計裡通常都是有多個模組,如果各個模組的介面都不相同,那將會帶來不少麻煩。因此盡可能採用統一的介面時序。ram形式介面(一般由片選、位址、輸入(n)、輸出(n)、讀寫訊號組成,實際應用時可增加中斷訊號)簡單、快速,通常是第一選擇。各個模組都採用ram介面後,對模組的操作訊號和時序都是一樣的,所不同的就是對不同的位址寫入不同資料,以使用各模組的功能,而且可以統一掛接到匯流排上。所以一般微控制器內部各種模組都是採用相同的介面,掛接到內部匯流排上,實現於cpu核心的連線。
例如乙個收發器的內部介面例子:
---- 暫存器定義
-- 位址 名稱 r/w 說明
-- 00 datatrans r 8 bit要傳送的資料
-- 00 datarecv w 8 bit接收到的資料
-- 01 control r/w 控制暫存器:
-- [0]=收發模式 0:接收模式;1:傳送模式
-- [1..7]=保留
-- 10 status r/w 狀態暫存器
-- [0]=接收資料就緒 讀到1時有資料收到;寫入1時清除中斷
-- [1]=傳送資料完成 讀到1時傳送資料完成;寫入1時清除中斷
-- [2..7]=保留
-- 11 none 保留
--entity transceiver is
port(
-- 收發模組介面
clkin : in std_logic; -- 50mhz clock input
reset : in std_logic;
address : in std_logic_vector(1 downto 0); -- 暫存器位址
datain : in std_logic_vector(7 downto 0); -- 資料輸入
dataout : out std_logic_vector(7 downto 0); -- 資料輸出
write : in std_logic; -- 寫使能
cs : in std_logic; -- 片選
irq : out std_logic; -- 中斷輸出
-- 外部介面
rxd : in std_logic; -- 接max481 ro
txd : out std_logic; -- 接max481 di
...);
end entity transceiver;
(再羅嗦一句:這個收發器後來使用了fifo作為介面使用起來也是很方便)。
4。function/procedure內必須是組合邏輯嗎?由於function/procedure是立刻返回的,如果是乙個需要幾個時鐘才輸出結果的時序邏輯,那呼叫者怎麼知道它什麼時候返回呢?所以我覺得應該是組合邏輯,但目前還沒找到證實的資料,是否正確,望高手指點!
5。altera不建議設計者在fpga內部使用三態埠。因為altera的產品中只有io部分有三態門,而在內部邏輯電路只能用多路器實現,因此一般不要在內部使用三態門。同時altera指出:其實內部三態門毫無意義。
6。理解敏感訊號。敏感訊號是併發語句的必要要素,指明了併發語句被執行的條件。敏感訊號有顯式和隱式,對於process,敏感訊號顯式說明;對於併發訊號代入(a <= b),隱含指明了b是 敏感訊號;對於條件訊號代入(q <= "00" when sel = "0" else q <= "11"),when後面判斷的訊號sel就是隱含的敏感訊號;對於選擇訊號代入(with sel select q <= "00" when 0 ....),with後的sel就是隱含的敏感訊號。要注意的是,if語句裡條件判斷的訊號並不是敏感訊號,而只是分支條件,所以if語句只能用在程序內,不是併發語句。比較一下if語句和with語句,可以看出if條件中的訊號只是單純起乙個分支條件的作用,而with後的訊號則起到分枝條件和敏感訊號雙重作用。這應該是vhdl語言為了讓if與process結合得到強大表達力的設計吧!
VHDL語法點滴
1.cnt others 0 這個是給cnt賦零的意思,還可以這樣用 比如說cnt是std logic vector 7 downto 0 那麼cnt 1 1 others 0 就表示給cnt的第1位賦1,其他位的全部都賦0,結果cnt 00000010 2.f1 fi din conv std l...
git 經驗點滴
git clone b 分支名 git位址 資料夾 如果不指定資料夾,會使用專案名稱作為新建資料夾名稱 cd 資料夾 之後,git checkout 分支名 可以切換分支 a.拉取規則 git pull 從伺服器端拉取最新改動,沒有衝突的檔案直接覆蓋,有衝突的檔案會提示有衝突。b.拉取之前要做什麼 ...
verilog設計經驗點滴
組合邏輯 1,敏感變數的描述完備性 verilog 中,用always塊設計組合邏輯電路時,在賦值表示式右端參與賦值的所有訊號都必須在always 敏感電平列表 中列出,always中if語句的判斷表示式必須在敏感電平列表中列出。如果在賦值表示式右端引用了敏感電平列表中沒有列出的訊號,在 綜合時將會...