【问题标题】:"Invalid Module Instantiation" Error in Mealy sequence detector - VerilogMealy 序列检测器中的“无效模块实例化”错误 - Verilog
【发布时间】:2013-10-30 12:16:47
【问题描述】:

我为检测特定序列的 Mealy 状态机定义了一个模块。我没有像通常更好的选择那样对状态进行编码,因为我想以另一种方式进行编码(我在一本书中看到了一个类似的例子,但代码是用 VHDL 编写的)。

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

我无法弄清错误消息的任何内容。有人可以解释错误信息并建议如何更正吗?

【问题讨论】:

    标签: verilog


    【解决方案1】:

    您的 always 块中缺少 begin 和 end 关键字。该代码认为您正在尝试实例化模块而不是进行信号分配。只有第一行将被捕获在 always 块下(Q1 分配)。其他人不会。试试这个:

    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
    

    顺便说一句,这段代码真的很丑。有没有更好的方法来做到这一点??

    【讨论】:

    • 啊!我不知道。代码现在可以完美编译。谢谢 !关于旁注,我完全同意你的看法(我可能会在你的句子中添加一些额外的真的),但我是 Verilog 的新手,想直接从状态方程编码并验证我得到相同的输出通过通常的方法和这个。
    • 此代码不是合法的 Verilog 语法,正如我的回答所解释的那样。你的编译器应该会产生错误。
    【解决方案2】:

    您有多个语法错误。

    您的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));
    // ---------------------------
    

    【讨论】:

    • 呃,这些分号不是必须的吗?我在没有它们的情况下编译并得到了一个语法错误。我正在使用 Verilog 1995 语法,也许就像您在新语法中所说的那样?
    • 我发布的代码仍然存在编译错误。分号用于结束语句。
    【解决方案3】:

    巧合的是,这是我的 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 进行比较,当该参数为真时,y_out 会变高。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多