FPGA綜合與VHDL語法

2021-07-03 02:30:44 字數 1516 閱讀 8245

下面的內容是在富欣實習時總結下來的。

綜合相關:

1.劉工說,d觸發器最好不要一直重新整理,需要用到使能訊號,若使能訊號是長時間持續的,則需要取其的上公升沿和下降沿。

2.以前寫**時,為了防止生成鎖存器,會像下面這樣寫:

elsif clk'event and clk='1' then

if en='1' then

q <= d;

else

q <= q;

endif;

endif;

但其實else後面的是可以去掉的,時序電路中,d觸發器有ce(clk enable)這個埠,當en不滿足時,ce可以不使能,那麼觸發器的輸出就不會改變。若是在組合電路中,else後面的則是不能省略的。

由於目前的綜合器比較強,我們根本不知道會綜合出什麼電路。可能**的質量比較不好,但它會綜合出質量比較好的電路。也有可能我們寫**時考慮到了很多的小細節,比如d觸發器最好不要一直重新整理之類的,但最後綜合出來的電路並不符和我們的預想。以上的建議作為一種參考。

vhdl語法相關:

1.procedure若有輸入和輸出引數,那麼寫法如下:

procedure local_bus_read_ppcid(ppc: in std_logic_vector(2 downto 0);signal data_out: out std_logic_vector(15 downto 0)) is

begin

vib_sim_status <= local_bus_read;

ppc_id <= ppc;

lbd <= (others => 'z');

wait for 270 ns;

data_out <= lbd;

end local_bus_read_ppcid;

輸出的訊號需要加上signal,之前由於漏了這個就一直錯。

2.綜合時出現以下錯誤

found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"

說明我用了"+"號,但並沒有use ieee.std_logic_unsigned.all,這裡用unsigned或signed都可以,這個庫可使得"+"號兩邊的資料型別可以不同

3.不管用variable還是signal,只要表達的意思一樣,綜合出來的電路是一樣的,不用在意signal或variable在物理上的意義,這些變數只是建模的工具,重點是要將模型的意思表達清楚。還有一點,就是variable在modelsim**新增訊號時,是沒有的,看不到的。

4.之前在**的時候,我知道inout訊號在in和out切換時,需要拉成高阻,這點沒錯,但**還是出錯,後來發現只要在testbench裡將inout訊號初始化為z即可,我是忘了初始化

5.注釋生成文件:doxygen

VHDL語法回顧

打算設計乙個簡單的微程式控制cpu模型,下面是vhdl語法回顧。vhdl是由模組組成,嵌在module endmodule之間,其他語句均由 結束 module add a,b,c,sum,count 模組埠定義 input 2 0 a,b input cin output 2 0 sum outp...

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...

FPGA中常見語法綜合後的電路

與高階程式語言不同,hdl語言與硬體電路密切相關。在編寫 的過程時,不能將高階語言的思想帶入到hdl語言書寫上面來,而是需要時刻明白自己所寫的 對應的硬體是什麼。為此,下面將總結在verilog語言中常用語法對應的硬體結構。d觸發器 always posedge clk begin q d end其...