1. 程式人生 > >關於Verilog中不完整if產生鎖存器的問題

關於Verilog中不完整if產生鎖存器的問題

先上兩段程式碼: 第一段:

always @(posedge clk)
	if(enable)
		q <= data;
	//else
		//q <= 0;

第二段

always @(*)
	if(enable)
		q <= data;
	//else
		//q <= 0;

上面兩個片段都是不完整if語句,區別在於一個是時序邏輯,另一個是組合邏輯,那麼這兩段程式碼都會產生鎖存器嗎?

對於時序電路,會生成觸發器,觸發器是有使能端的,使能端時無效資料不變,這段程式碼符合觸發器的特性,跟鎖存器無關。

對於組合邏輯電路,為了使資料保持不變,就得用鎖存器來儲存。第二個程式碼在enable為低時,資料不變,因此要生成鎖存器。

所謂生成鎖存器其實是針對使用always語句描述一個組合邏輯而言,因為如果描述時序邏輯總是使用時鐘或者時鐘+復位作為敏感列表條件,所生成的電路總是組合邏輯+DFF;如果是描述組合邏輯,敏感列表中必然沒有時鐘復位,而是組合邏輯的輸入訊號。在FPGA設計,避免使用鎖存器,不利於時序分析和模擬。

還有一點,使用always描述組合邏輯時,好的習慣是使用always @(*)作為敏感列表, 並且需要檢查每個分支都有明確的賦值,從而避免生成鎖存器。

綜上,只有組合邏輯才可能生成鎖存器,時序邏輯不會生成鎖存器。