鱼C论坛

 找回密码
 立即注册
查看: 43|回复: 1

[FPGA求助]状态机(quartus II生成)的always0和!always0是什么条件

[复制链接]
发表于 前天 20:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 泼墨染笛香 于 2025-1-8 20:57 编辑

问题1:生成的状态机表格中always0和!always0是什么条件?
    前几个源状态的跳转条件都是两个输入变量pi_money_half和pi_money_one的组合。
    那么源状态TWO跳转的条件always0和!always0也应该是它俩的组合吧?分别对应什么?
情况3.1整个.png

问题2:为什么下面两组代码生成的结果不一样?其中pi_money = {pi_money_one, pi_money_half};

3.1

3.1


3.2

3.2


代码见下方(可在quartus II中编译后查看"Analysis & Synthesis"-"Netlist Viewers"-"State Machine Viewer")
`timescale        1ns/1ns
module        complex_fsm
(
        input        wire        sys_clk                        ,        //系统时钟50MHz
        input        wire        sys_rst_n                ,        //全局复位
        input        wire        pi_money_one        ,        //投币1元
        input        wire        pi_money_half                //投币0.5元
);

//只有五种状态,使用独热码
parameter        IDLE         = 5'b00001;
parameter        HALF         = 5'b00010;
parameter        ONE                 = 5'b00100;
parameter        ONE_HALF = 5'b01000;
parameter        TWO                 = 5'b10000;

reg                [4:0]        state;
wire        [1:0]        pi_money;

assign pi_money = {pi_money_one, pi_money_half};

always@(posedge sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
                state <= IDLE;        //任何情况下只要按复位就回到初始状态
        else        case(state)
                                IDLE        :if(pi_money == 2'b01)
                                                        state <= HALF;
                                                else        if(pi_money == 2'b10)
                                                        state <= ONE;
                                                else
                                                        state <= IDLE;
       
                                HALF        :if(pi_money == 2'b01)
                                                        state <= ONE;
                                                else        if(pi_money == 2'b10)
                                                        state <= ONE_HALF;
                                                else
                                                        state <= HALF;
       
                                ONE                :if(pi_money == 2'b01)
                                                        state <= ONE_HALF;
                                                else        if(pi_money == 2'b10)
                                                        state <= TWO;
                                                else
                                                        state <= ONE;
       
                                ONE_HALF:if(pi_money == 2'b01)
                                                        state <= TWO;
                                                else        if(pi_money == 2'b10)
                                                        state <= IDLE;
                                                else
                                                        state <= ONE_HALF;
                                //情况1 合理
                                // TWO                :if((pi_money == 2'b01))
                                                        // state <= IDLE;        //01
                                                // else
                                                        // state <= TWO;                //x0 11
                                //情况2 合理
                                // TWO                :if((pi_money == 2'b10))
                                                        // state <= IDLE;        //10
                                                // else
                                                        // state <= TWO;                //x0 11
                                //情况3.1 不懂
                                TWO                :if((pi_money == 2'b01) || (pi_money == 2'b10))
                                                        state <= IDLE;        //always0。不该是10 01?
                                                else
                                                        state <= TWO;                //!always0。不该是00 11?
                                //情况3.2。3.2和3.1不等价?生成状态机表格与3.1不同。不懂。
                                // TWO                :if((pi_money == 2'b01) || (pi_money == 2'b10))
                                                        // state <= IDLE;        //01 10
                                                // else        if((pi_money == 2'b00) || (pi_money == 2'b11))
                                                        // state <= TWO;                //00 11
                                default : state <= IDLE;//跳转到编码的状态之外也回到初始状态
                        endcase

endmodule
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 前天 20:56 | 显示全部楼层
问题1:生成的状态机表格中always0和!always0是什么条件?


在Quartus II生成的状态机中,`always0`表示在该条件下不会发生状态转移,基本上是一个永远为假的条件。`!always0`则表示该转移条件始终为真,也就是说,只要到达该状态就必然发生状态转移。

对于源状态`TWO`的跳转条件,如果你看到`always0`,表示不可能单独依靠`pi_money_half`或`pi_money_one`的特定组合达成转移。相反,`!always0`表示不管条件如何,都会在该状态间进行转移。在表格中,这通常意味着所有可能的输入组合都会使状态机在从`TWO`转移,可以是由于输出条件已经满足,或者时钟信号触发了状态自动更新。

问题2:为什么下面两组代码生成的结果不一样?


从你的代码示例中看到,此处可能是关于`state`寄存器的声明和使用。如果生成结果不同,可能的原因在于:

1. **状态变量数据类型**:不同的数据类型(如`reg`和`wire`)在编译时可能产生不同的综合结果。

2. **状态值的定义方式**:在不同版本或不同写法下,状态值可能被解释为不同的结果。确保所有状态被正确初始化和更新。

3. **输入信号的处理**:观察`pi_money`的组合是否被正确逻辑处理,例如在`assign`语句中生成的`pi_money`变量是否能在不同状态下被正确解码。

请检查代码编写是否一致,尤其是在状态定义、状态转换条件和输入处理逻辑上保持一致性,以确保生成的硬件逻辑不会出现意料之外的差异。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表