-
求助FPGA状态机的条件always0和!always0是什么?(quartus II生成)
[i=s] 本帖最后由 泼墨染笛香 于 2025-1-8 20:58 编辑 [/i] [align=left][font=宋体][color=#000][font=宋体][size=12pt]问题[/size][/font][/color][/font][font=Times New Roman][color=#000][size=12pt]1[/size][/color][/font][font=宋体][color=#000][font=宋体][size=12pt]:生成的状态机表格中[/size][/font][/color][/font][font=Times New Roman][color=#000][size=12pt]always0[/size][/color][/font][font=宋体][color=#000][font=宋体][size=12pt]和[/size][/font][/color][/font][font=Times New Roman][color=#000][size=12pt]!always0[/size][/color][/font][font=宋体][color=#000][font=宋体][size=12pt]是什么条件[/size][/font][/color][/font][font=Times New Roman][color=#000][size=12pt]?[/size][/color][/font][/align][align=left][align=left][font=宋体] 前几个源状态的跳转条件都是两个输入变量[/font]pi_money_half[font=宋体]和[/font][font=Times New Roman]pi_money_one[/font][font=宋体]的组合。[/font][/align][align=left][font=宋体] 那么源状态[/font]TWO[font=宋体]跳转的条件[/font][font=Times New Roman]always0[/font][font=宋体]和[/font][font=Times New Roman]!always0[/font][font=宋体]也应该是它俩的组合吧?分别对应什么?[/font][/align][/align][align=left][attach]2351084[/attach][/align][align=left][font=宋体]问题[/font]2:[font=宋体]为什么下面两组代码生成的结果不一样?[/font][color=#191b1f][size=15px][font=宋体]其中[/font][/size][/color][color=#191b1f][font=-apple-system, BlinkMacSystemFont, "][size=15px]pi_money = {pi_money_one, pi_money_half};[/size][/font][/color][/align][align=left][attach]2351086[/attach][/align] [align=left][attach]2351088[/attach][/align] [align=left]代码见下方(quartus II中编译后查看"Analysis & Synthesis"-"Netlist Viewers"-"State Machine Viewer")[/align] `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
1753浏览量 1回复量 关注量