2013-10-30 39 views
-1

我已經爲檢測特定序列的Mealy狀態機器定義了一個模塊。我還沒有將狀態編碼爲通常更好的選擇,因爲我想以另一種方式來做(我在書中看到了一個類似的例子,但代碼是在VHDL中)。Mealy序列檢測器中的「無效模塊實例化」錯誤 - Verilog

module seq_detector(y_out,Clk,x_in); 
    output y_out; 
    reg y_out; 
    input x_in, Clk; 
    reg Q1,Q2,Q3,Q4; 
    always @(posedge Clk) 
    Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in)); 
    Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in); 
    Q3 <= Q1&&Q2;&&(!Q3)&&(x_in); 
    Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in); 

    always @(x_in or Q1 or Q2 or Q3 or Q4) 
    y_out <= Q3||(Q2&&(!Q4)&&x_in); 
endmodule 

在編譯代碼時,出現以下錯誤。

mini_project.v:8: syntax error 
mini_project.v:8: error: Invalid module instantiation 
mini_project.v:9: error: Invalid module instantiation 
mini_project.v:10: error: Invalid module instantiation 

我不能弄出任何錯誤信息。有人可以解釋錯誤信息,並建議如何糾正它?

回答

2

你總是在塊中缺少開始和結束關鍵字。該代碼認爲你正試圖實例化一個模塊,而不是做信號分配。只有第一行將被記錄在always塊(第一季度作業)下。其他人不會。試試這個:

always @(posedge Clk) 
begin 
    Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in)); 
    Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in); 
    Q3 <= Q1&&Q2;&&(!Q3)&&(x_in); 
    Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in); 
end 

作爲一個方面說明,這段代碼真的真的很難看。有一個更好的方法嗎??

+0

啊!我不知道。代碼現在完美編譯。謝謝 ! 關於附註,我完全同意你的觀點(我可能會在你的句子中增加幾個額外的真值),但我是Verilog的新手,並且想直接從狀態方程編碼並驗證我得到的是相同的通常的方法和這一個輸出。 – progophilic

1

您有多個語法錯誤。

您的always區塊需要begin/end

always @(posedge Clk) begin 
    Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in)); 
    Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in); 
    Q3 <= Q1&&Q2;&&(!Q3)&&(x_in); 
    Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in); 
    end 

即使固定一點,你必須雜散分號都在你的代碼之後:

Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in)); 
// --------------------------- 
+0

錯誤,是不是那些必要的分號?我編譯沒有他們,並得到一個語法錯誤。我正在使用Verilog 1995語法,也許這是你在新語法中說的嗎? – progophilic

+0

我發佈的代碼仍然存在編譯錯誤。分號用於結束語句。 – toolic

+0

@DOS:順序邏輯應該使用noblocking。 – toolic

1

巧合的是,這是在我的CPE166先進的邏輯設計類的電流分配。分配中的主要想法是正確合成寄存器。像這樣(雖然我們的任務是複雜得多與多個可能輸入,較長的序列,復位,可編程的序列,和按鈕需要加以去抖):

module sequence_detector(
input wire x_in,clk, 
output wire y_out 
); 

reg [3:0] seq, seq_nxt; 

parameter correct_sequence = 4'b1001; 

always @(posedge clk) 
    seq <= seq_nxt; 

always @(*) 
    seq_nxt = {seq[2:0] , x_in}; 

assign y_out = (seq == correct_sequence); 
endmodule 

這將創建一個4位的移位寄存器,其將在每個正時鐘邊沿上移動。 x_in的最新值將進入一側,x_in的最早值將被移出。移位寄存器的當前值不斷與參數correct_sequence比較,當參數爲true時會使y_out變高。

Synthesized Logic

相關問題