首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mealy序列检测器中出现"Invalid Module Instantiation“错误- Verilog

Mealy序列检测器中出现"Invalid Module Instantiation“错误- Verilog
EN

Stack Overflow用户
提问于 2013-10-30 20:16:48
回答 3查看 9.3K关注 0票数 0

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

代码语言:javascript
复制
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

在编译代码时,我得到以下错误。

代码语言:javascript
复制
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

我搞不懂这个错误信息的任何内容。有没有人能解释一下错误信息,并建议如何纠正?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-30 20:31:48

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

代码语言:javascript
复制
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

顺便说一下,这段代码真的很难看。有没有更好的方法呢?

票数 3
EN

Stack Overflow用户

发布于 2013-10-30 20:33:08

您有多个语法错误。

您的always块中需要一个begin/end

代码语言:javascript
复制
  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

即使在修复了这个问题之后,你的代码中仍然有很多乱七八糟的分号:

代码语言:javascript
复制
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
// ---------------------------
票数 1
EN

Stack Overflow用户

发布于 2013-10-31 06:04:28

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

代码语言:javascript
复制
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将变为高电平。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19682014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档