使用 Verilog 创建 4 状态 Mealy 有限状态机 [帮助]

Posted

技术标签:

【中文标题】使用 Verilog 创建 4 状态 Mealy 有限状态机 [帮助]【英文标题】:Creating a 4 State Mealy Finite State Machine using Verilog [HELP] 【发布时间】:2022-01-16 16:19:08 【问题描述】:

我正在尝试弄清楚如何让它运行而不会出现任何错误。

module main;
(
    input wire clk, reset;
    input wire x, y;
    output reg n, c;
    s0 = 0,
    s1 = 1,
    s2 = 2,
    s3 = 3;
    
    state_reg; 
    state_next; 
);
always(posedge clk, posedge reset)
begin
    if (reset) begin
        state_reg = s0;
    end
    else begin
        state_reg = state_next;
    end
end 

always (x, y, state_reg) begin 
    state_next = state_reg; 
    n = 0;
    c = 0;
    case (state_reg)
        s0 : begin
            if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 0;
                state_next = s1; 
            end
        end
        s1 : begin
              if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 0;
                state_next = s2; 
            end
        end
        s2 : begin
              if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 1;
                state_next = s3; 
            end
        end
        s3 : begin
             if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 1;
                state_next = s3; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 1;
                state_next = s3; 
            end
        end
    endcase
endmodule

我觉得代码应该足以显示我正在尝试做的事情,但如果没有,我还附上了逻辑示意图版本的图像(我不确定如何附上 .cct 文件由于我是新手,所以在这个网站上的示意图)。对不起,伙计们,这是我第一次使用 Verilog,所以我真的很陌生,但我必须为一个零指导的荣誉项目写这篇文章。所以输出应该是如果我输入 x 或 y 0 或 1,它应该根据条件(s0、s1、s2、s3)等切换到不同的状态。如果我点击重置,它应该回到 s0 ,如果我点击 clk 或时钟变量,它应该使用输入 x 和 y 来决定下一个状态应该是什么。

编辑:这是我遇到的错误。

jdoodle.v:2: syntax error
jdoodle.v:3: error: invalid module item.
jdoodle.v:6: syntax error
jdoodle.v:6: error: Invalid module instantiation
jdoodle.v:11: error: Invalid module instantiation
jdoodle.v:12: error: Invalid module instantiation
jdoodle.v:13: error: invalid module item.
jdoodle.v:14: syntax error
jdoodle.v:17: Syntax in assignment statement l-value.
jdoodle.v:18: syntax error
jdoodle.v:20: error: invalid module item.
jdoodle.v:21: syntax error
jdoodle.v:25: error: invalid module item.
jdoodle.v:26: syntax error
jdoodle.v:26: error: Invalid module instantiation
jdoodle.v:27: error: Invalid module instantiation
jdoodle.v:31: syntax error
jdoodle.v:31: error: Invalid module instantiation
jdoodle.v:32: error: Invalid module instantiation
jdoodle.v:33: error: Invalid module instantiation
jdoodle.v:36: syntax error
jdoodle.v:36: error: Invalid module instantiation
jdoodle.v:37: error: Invalid module instantiation
jdoodle.v:38: error: Invalid module instantiation
jdoodle.v:41: syntax error
jdoodle.v:41: error: Invalid module instantiation
jdoodle.v:42: error: Invalid module instantiation
jdoodle.v:43: error: Invalid module instantiation
jdoodle.v:46: syntax error
jdoodle.v:46: error: Invalid module instantiation
jdoodle.v:47: error: Invalid module instantiation
jdoodle.v:48: error: Invalid module instantiation
jdoodle.v:53: syntax error
jdoodle.v:53: error: Invalid module instantiation
jdoodle.v:54: error: Invalid module instantiation
jdoodle.v:55: error: Invalid module instantiation
jdoodle.v:58: syntax error
jdoodle.v:58: error: Invalid module instantiation
jdoodle.v:59: error: Invalid module instantiation
jdoodle.v:60: error: Invalid module instantiation
jdoodle.v:63: syntax error
jdoodle.v:63: error: Invalid module instantiation
jdoodle.v:64: error: Invalid module instantiation
jdoodle.v:65: error: Invalid module instantiation
jdoodle.v:68: syntax error
jdoodle.v:68: error: Invalid module instantiation
jdoodle.v:69: error: Invalid module instantiation
jdoodle.v:70: error: Invalid module instantiation
jdoodle.v:75: syntax error
jdoodle.v:75: error: Invalid module instantiation
jdoodle.v:76: error: Invalid module instantiation
jdoodle.v:77: error: Invalid module instantiation
jdoodle.v:80: syntax error
jdoodle.v:80: error: Invalid module instantiation
jdoodle.v:81: error: Invalid module instantiation
jdoodle.v:82: error: Invalid module instantiation
jdoodle.v:85: syntax error
jdoodle.v:85: error: Invalid module instantiation
jdoodle.v:86: error: Invalid module instantiation
jdoodle.v:87: error: Invalid module instantiation
jdoodle.v:90: syntax error
jdoodle.v:90: error: Invalid module instantiation
jdoodle.v:91: error: Invalid module instantiation
jdoodle.v:92: error: Invalid module instantiation
jdoodle.v:97: syntax error
jdoodle.v:97: error: Invalid module instantiation
jdoodle.v:98: error: Invalid module instantiation
jdoodle.v:99: error: Invalid module instantiation
jdoodle.v:102: syntax error
jdoodle.v:102: error: Invalid module instantiation
jdoodle.v:103: error: Invalid module instantiation
jdoodle.v:104: error: Invalid module instantiation
jdoodle.v:107: syntax error
jdoodle.v:107: error: Invalid module instantiation
jdoodle.v:108: error: Invalid module instantiation
jdoodle.v:109: error: Invalid module instantiation
jdoodle.v:112: syntax error
jdoodle.v:112: error: Invalid module instantiation
jdoodle.v:113: error: Invalid module instantiation
jdoodle.v:114: error: Invalid module instantiation

【问题讨论】:

您面临什么样的错误?它是编译还是功能?请提供错误信息。 你为什么用 VHDL 标签来标记你的 Verilog 问题? 我用更多信息更新了帖子。让我知道这是否足够。真的很抱歉,我真的不习惯这种编码语言,所以请您给我一些耐心。 最好将您的问题一次限制为一个错误。这为未来的编码人员提供了更好的资源 - 如果他们有相同的错误,他们可以使用问题和答案。 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

有几个语法错误导致此模块无法编译。

模块名称“main”后面的分号是语法错误。 IO列表中的分号(模块名后面有错误,需要逗号。 您要声明一个状态变量是 IO 列表区域(就在单词 module 之后。这是一个错误。将声明放在 IO 列表之后。 搜索“verilog 状态机”以了解如何以及在何处声明状态变量。 您需要非阻塞赋值 ( 您的 always 块缺少时序控制运算符 @。 您在模块末尾缺少“end”关键字。 状态机没有 :default 状态,这可能会导致一些奇怪的行为。

我进行了这些更改(没有添加 :default 状态,因为它会修改您的设计意图)。 这是您现在使用 edaplayground.com 上的 Mentor Questa 编译的代码 您没有发布测试平台,无法知道它的行为是否符合您的要求。 搜索“基本 Verilog 测试平台”以开始测试平台设计。

module main
(
    input wire clk, 
    input wire reset,
    input wire x,
    input wire y,
    output reg n,
    output reg c
);
  
localparam   
    s0 = 2'b00,
    s1 = 2'b01,
    s2 = 2'b10,
    s3 = 2'b11;
    
reg [1:0] state_reg,state_next; 
  
always @(posedge clk, posedge reset)
begin
    if (reset) begin
        state_reg <= s0;
    end
    else begin
        state_reg <= state_next;
    end
end 

always @(x, y, state_reg) begin 
    state_next = state_reg; 
    n = 0;
    c = 0;
    case (state_reg)
        s0 : begin
            if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 0;
                state_next = s1; 
            end
        end
        s1 : begin
              if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 0;
                state_next = s2; 
            end
        end
        s2 : begin
              if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 1;
                state_next = s3; 
            end
        end
        s3 : begin
             if (x == 0 && y == 0) begin
                n = 0;
                c = 0;
                state_next = s0;
            end
            else if (x == 0 && y == 1) begin
                n = 0;
                c = 0;
                state_next = s0; 
            end
            else if (x== 1 && y == 0) begin
                n = 0;
                c = 1;
                state_next = s3; 
            end
             else if (x== 1 && y == 1) begin
                n = 1;
                c = 1;
                state_next = s3; 
            end
        end
    endcase
  
end
  
endmodule

【讨论】:

好吧,在接受 Mikef 的建议后,我能够正确运行和编译我的代码,并且我能够制作一个与代码配合得很好的测试台。没有错误。唯一真正的问题是我不确定如何在 Quartus State Machine Viewer 之外测试我的输出。 当有人回答您的问题时该怎么办。 ***.com/help/someone-answers

以上是关于使用 Verilog 创建 4 状态 Mealy 有限状态机 [帮助]的主要内容,如果未能解决你的问题,请参考以下文章

三段式有限状态机Verilog代码

Verilog笔记.3.有限状态机

有限状态机

Moore型状态机和Mealy型状态机

fpga状态机详解

[从零开始学习FPGA编程-36]:进阶篇 - 基本时序电路-有限状态机简述(数字电路描述)=》Moore 型Mealy 型