VHDL經驗點滴

2021-04-12 12:17:10 字數 2826 閱讀 3974

一些學到的或自己總結的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語句的判斷表示式必須在敏感電平列表中列出。如果在賦值表示式右端引用了敏感電平列表中沒有列出的訊號,在 綜合時將會...