问题描述
我正在尝试构建一个由数据路径单元和控制单元组成的有限状态机自动售货机。所附链接是控制单元,由 EQ(Equal)、GT(Greater) 和乘积的输入组成。当product为“1”且EQ或GT为“1”时,输出为out=product。但是,在我的问题中,verilog 代码显示对 GT 正确,但对 EQ 不正确。好像是高电平输出不能响应EQ。
我设计的状态图。 State Diagram
我的 Verilog 代码。 Verilog code
结果。 Result Waveform
module dispense(
input [1:0] product,input GT,EQ,rst,clk,output [1:0] out,output reg done,output R
);
reg [1:0] ps,ns; //Present State and Next State
assign R=EQ||GT;
//State encoding
parameter [1:0] S0=2'b00,S1=2'b01,S2=2'b10;
//Verilog segment Next State logic and Output logic
always @*
begin
//out=0;
done=0;
case(ps)
S0: if(product>0) ns=S1; else ns=S0;
S1: if(R) ns=S2; else ns=S1;
S2: begin done=1; ns=S0; end
endcase
end
//out=product;
assign out = (done==1)?product:0;
//State Register
always@(posedge clk)
if (!rst) ps=S0;
else ps=ns;
endmodule
解决方法
答案很简单。将 ps
和 ns
添加到您的模拟图表中,您就会明白为什么。
在模拟开始时,您处于 S0
状态。当 product
大于 0
(第一个黄色标记)时,您将进入状态 S1
。然后您正在等待 EQ
或 GT
,但是 EQ
在一个时钟周期前下降,因此下一个 GT
到达。
在一个时钟周期后设置 EQ
和 GT
。