2016-01-04 1131 views
-1

首先,對我的英語技能感到抱歉。我得到這個錯誤vlog-13069

我學習Verilog和我有這樣的代碼

module paralelo_serie (data_in,clk, D_serie, nSyn, Done); 
input wire [12:0] data_in; 
input clk; 
output reg D_serie, nSyn, Done; 
genvar i; 

84 if (data_in == 0) Done= 1; 
else.... 

當我嘗試編譯這段代碼,我收到此錯誤信息:

Error: (vlog-13069) C:/Users/Pedro/Documents/master/asignaturas/primer cuatrimestre/Metodologia de diseño y herramientas cad/proyecto digital/proyecto digital.v(84): near "=": syntax error, unexpected '='.

Error: C:/Users/Pedro/Documents/master/asignaturas/primer cuatrimestre/Metodologia de diseño y herramientas cad/proyecto digital/proyecto digital.v(84): (vlog-13205) Syntax error found in the scope following 'Done'. Is there a missing '::'?

我是一個初學者在這種語言,我不知道發生了什麼事。我在代碼中得到了這個錯誤幾次,但我有時可以通過將reg更改爲wire和其他時間更改阻塞賦值來解決此問題,以避免阻塞...我真的不知道如何修復,真的我得到沮喪......請大家幫忙,你是我最後的希望......

對不起,我忘了,我用的ModelSim 10.4學生版

+0

'84'是一個錯字嗎? – toolic

+0

你想在什麼時候執行'if(data_in == 0)'語句? –

回答

0

AS toolic已經提到84看起來它只是一個偶然的剪切和粘貼,從你的代碼。

如果語句,除非它們用於生成語句,否則需要包含在一個進程中(有些人稱之爲塊)。這可以是initialalways

對於組合邏輯:

always @* begin 
    if (data_in == 0) begin 
    Done = 'b1; 
    end 
    else begin 
    Done = 'b0; 
    //... 
    end 
end 

在else分支不限定完成將導致閂鎖被創建。

在學習過程中,我會建議使用begin end語句和縮進代碼,因爲這有助於澄清代碼的結構並使錯別字更容易被發現。

如果Done留下的線,你可以只使用了:

assign Done = (data_in == 0) ; 

在另一方面,如果你想Done被同步驅動:

always @(posedge clk) begin 
    if (data_in == 0) begin 
    Done <= 'b1; 
    end 
    else begin 
    //... 
    end 
end 

注意改變非阻止(<=)分配以正確模擬觸發器行爲。由於Done是一個完整的觸發器(有狀態的),因此如果沒有在else分支中指定鎖存器,則不需要合成工具添加鎖存器,它將保持其值。