0

我为检测特定序列的 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

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

4

3 回答 3

3

您在 always 块中缺少开始和结束关键字。该代码认为您正在尝试实例化模块而不是进行信号分配。只有第一行将被捕获在 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

附带说明一下,这段代码真的很丑。有一个更好的方法吗??

于 2013-10-30T12:31:48.050 回答
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,当它为真时,会使 y_out 变高。

综合逻辑

于 2013-10-30T22:04:27.540 回答
1

您有多个语法错误。

你需要一个begin/end在你的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

即使修复了这个问题,您的代码中仍然有杂散的分号:

Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
// ---------------------------
于 2013-10-30T12:33:08.067 回答