MADjerk 2020-07-12 19:20 采纳率: 75%
浏览 115
已结题

【verilog】为什么这个有限状态机仿真找零会出现错误?例如先投币5美分,再投币25美分,却没有返回找零,初次提问,请多关照!

图片说明
design source的一部分:
always@(posedge clk or posedge clr)
if(clr)
current_state<=IDLE;
else
current_state<=next_state;

always@(*)
if(clr)
next_state<=IDLE;
else
begin
case(current_state)
IDLE: if(want)
next_state<=S0;
else
next_state=IDLE;
S0: case({Quarter,Dime,Nickel})
3'b000: next_state<=S0;//不投币
3'b001: next_state<=S1;//投币5美分
3'b010: next_state<=S2;//投币10美分
3'b100: next_state<=IDLE;//投币25美分
default: next_state<=S0;
endcase
S1: case({Quarter,Dime,Nickel})
3'b000: next_state<=S1;
3'b001: next_state<=S2;
3'b010: next_state<=S3;
3'b100: next_state<=IDLE;
default: next_state<=S1;
endcase
S2: case({Quarter,Dime,Nickel})
3'b000: next_state<=S2;
3'b001: next_state<=S3;
3'b010: next_state<=S4;
3'b100: next_state<=IDLE;
default: next_state<=S2;
endcase
S3: case({Quarter,Dime,Nickel})
3'b000: next_state<=S3;
3'b001: next_state<=S4;
3'b010: next_state<=IDLE;
3'b100: next_state<=IDLE;
endcase
S4: case({Quarter,Dime,Nickel})
3'b000: next_state<=S4;
3'b001: next_state<=IDLE;
3'b010: next_state<=IDLE;
3'b100: next_state<=IDLE;
endcase
default: next_state<=IDLE;
endcase
end

always@(*)
if(clr)
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
else begin
case(current_state)
IDLE: begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
S0: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S1: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime}<=4'b1000;//第一次找零5美分
ReturnDime<=2'b01;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S2: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10010;//第一次找零10美分
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S3: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10110;//第一次找零10美分,第二次找零5美分
end
3'b010:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
S4: case({Quarter,Dime,Nickel})
3'b100:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b11010;//第一次找零10美分,第二次找零10美分
end
3'b010:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10001;//第一次找零5美分
end
3'b001:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b10000;
end
default:
begin
{Dispense,ReturnTwoDime,ReturnDime}<=5'b00000;
end
endcase
endcase
end
testbench的一部分:
``` parameter clk_period=10;
initial begin
clr<=1;
clk<=1;
Nickel<=0;
Dime<=0;
Quarter<=0;
want<=0;
#(clk_period/2) clr<=0;
#(clk_period/2) want<=1;
#200 want<=0;
end
always #(clk_period/2) clk<=~clk;
initial begin
#(clk_period) {Quarter,Dime,Nickel}<=3'b000;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b001;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//先投币5美分,再投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//先投币10美分,再投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b001;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//第一次投币10美分,第二次投币5美分,第三次投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b010;
#(clk_period) {Quarter,Dime,Nickel}<=3'b100;//前两次投币10美分,最后投币25美分
#(clk_period) {Quarter,Dime,Nickel}<=3'b000;
end

endmodule

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-07-13 17:16
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助