&引用;无效的模块实例化";Mealy序列检测器中的错误-Verilog

&引用;无效的模块实例化";Mealy序列检测器中的错误-Verilog,verilog,Verilog,我已经为检测特定序列的Mealy状态机定义了一个模块。我没有像通常那样对状态进行编码,这是一个更好的选择,因为我想用另一种方式进行编码(我在一本书中看到了一个类似的例子,但代码是用VHDL编写的) 我对这个错误消息一无所知。有人能解释一下错误信息并建议如何更正吗?您的always块中缺少begin和end关键字。代码认为您正在尝试实例化模块,而不是进行信号分配。在always块(Q1分配)下只捕获第一行。其他人不会。试试这个: always @(posedge Clk) begin Q1 &

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


我对这个错误消息一无所知。有人能解释一下错误信息并建议如何更正吗?

您的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
始终@(posedge Clk)
开始

Q1始终块中缺少开始和结束关键字。代码认为您正在尝试实例化模块,而不是进行信号分配。在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
始终@(posedge Clk)
开始

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
始终@(posedge Clk)开始

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
始终@(posedge Clk)开始

Q1巧合的是,这是我CPE166高级逻辑设计课程的当前作业。赋值的主要思想是正确地合成寄存器。类似这样的情况(虽然我们的任务要复杂得多,有多个可能的输入、更长的序列、复位、可编程序列和需要去抖动的按钮):

模块序列检测器(
输入线x_in,clk,
输出线y_输出
);
reg[3:0]序列,序列nxt;
参数正确顺序=4'b1001;
始终@(posedge clk)

巧合的是,这是我的CPE166高级逻辑设计课程的当前作业。赋值的主要思想是正确地合成寄存器。类似这样的情况(虽然我们的任务要复杂得多,有多个可能的输入、更长的序列、复位、可编程序列和需要去抖动的按钮):

模块序列检测器(
输入线x_in,clk,
输出线y_输出
);
reg[3:0]序列,序列nxt;
参数正确顺序=4'b1001;
始终@(posedge clk)

seq Err,这些分号不是必需的吗?我在没有它们的情况下编译,得到了一个语法错误。我使用的是Verilog 1995语法,也许正如您在更新的语法中所说的那样?我发布的代码仍然存在编译错误。分号用于结束语句。呃,这些分号不是必需的吗?我在没有它们的情况下编译,得到了一个语法错误。我使用的是Verilog 1995语法,也许正如您在更新的语法中所说的那样?我发布的代码仍然存在编译错误。分号用来结束语句。啊!我不知道。代码现在编译得很好。非常感谢。关于旁注,我完全同意你的观点(我可能会在你的句子中添加几个额外的reallys),但我是Verilog新手,只想直接从状态方程中编写代码,并验证我通过通常的方法和此方法得到的输出是否相同。正如我的回答所解释的,此代码不是合法的Verilog语法。你的编译器应该会产生错误。啊!我不知道。代码现在编译得很好。非常感谢。关于旁注,我完全同意你的观点(我可能会在你的句子中添加几个额外的reallys),但我是Verilog新手,只想直接从状态方程中编写代码,并验证我通过通常的方法和此方法得到的输出是否相同。正如我的回答所解释的,此代码不是合法的Verilog语法。编译器应该生成错误。
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
// ---------------------------
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