硬件实现自动售货机可以生成比特流,但板子上不出结果
时间:10-02
整理:3721RD
点击:
如题,个人感觉可能是状态机写得不好,贴出来想请大神们指导一下,嘻嘻:
- module vendor(moda,changeten,changefive,changeone,outp,clk,sort,coin10,coin5,coin1,cancel,confirm);
- input clk,coin10,coin5,coin1,cancel,confirm;
- input [1:0] sort;
- output reg moda;
- output reg changeten;
- output reg changefive;
- output reg [2:0] changeone;
- output reg [1:0] outp;
- reg [4:0] coins_sum;
- reg [4:0] coins_sum10;
- reg [4:0] coins_sum5;
- reg [4:0] coins_sum1;
- reg current_state;
- reg next_state;
- parameter idle=0;
- parameter juice=1;
-
- always@(negedge coin10 or posedge moda)
- begin
- if(moda)
- coins_sum10=5'b00000;
- else if(!coin10)
- coins_sum10 = coins_sum10+5'b01010;
- else ;
- end
- always@(negedge coin5 or posedge moda)
- begin
- if(moda)
- coins_sum5=5'b00000;
- else if(!coin5)
- coins_sum5 = coins_sum5+5'b00101;
- else ;
- end
- always@(negedge coin1 or posedge moda)
- begin
- if(moda)
- coins_sum1=5'b00000;
- else if(!coin1)
- coins_sum1 = coins_sum1+5'b00001;
- else ;
- end
- always@(negedge confirm or posedge moda)
- begin
- if(moda)
- coins_sum=5'b00000;
- else
- coins_sum=coins_sum1+coins_sum5+coins_sum10;
- end
- always@(posedge clk or posedge cancel)
- begin
- if(cancel)
- current_state = idle;
- else
- current_state = next_state;
- end
- always@(confirm or cancel or current_state)
- begin
- case(current_state)
- idle:begin
- if(sort==2'b01 | sort==2'b10 | sort==2'b11)
- begin
- if(confirm==1)
- next_state = juice;
- else if(cancel==1)
- next_state = idle;
- else
- next_state = current_state;
- end
- else
- next_state = current_state;
- end
- juice:begin
- if(sort==2'b01)
- begin
- if((coins_sum>5'b01010) | (coins_sum==5'b01010))
- begin
- if(confirm==0)
- next_state=idle;
- else if(cancel==1)
- next_state=idle;
- else
- next_state = current_state;
- end
- else
- next_state = current_state;
- end
- else if(sort==2'b10)
- begin
- if((coins_sum>5'b01110) | (coins_sum==5'b01110))
- begin
- if(confirm==0)
- next_state=idle;
- else if(cancel==1)
- next_state=idle;
- else
- next_state = current_state;
- end
- else
- next_state = current_state;
- end
- else
- begin
- if((coins_sum>5'b10100) | (coins_sum==5'b10100))
- begin
- if(confirm==0)
- next_state=idle;
- else if(cancel==1)
- next_state=idle;
- else
- next_state = current_state;
- end
- else
- next_state = current_state;
- end
- end
- endcase
- end
-
-
- always@(confirm or cancel or current_state)
- begin
- case(current_state)
- idle:
- begin
- moda=1;
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- juice:
- begin
- moda=0;
- if(sort==2'b01)
- begin
- if((coins_sum>5'b01010) | (coins_sum==5'b01010))
- begin
- if(confirm==0)
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b01;
- end
- else if(cancel==1)
- begin
- changeten=1;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- else if(sort==2'b10)
- begin
- if((coins_sum>5'b01110) | (coins_sum==5'b01110))
- begin
- if(confirm==0)
- begin
- if(coins_sum>5'b01111)
- begin
- changeten=0;
- changefive=1;
- changeone=3'b001;
- outp=2'b10;
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b001;
- outp=2'b10;
- end
- end
- else if(cancel==1)
- begin
- changeten=1;
- changefive=0;
- changeone=3'b100;
- outp=2'b00;
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- else
- begin
- if((coins_sum>5'b10100) | (coins_sum==5'b10100))
- begin
- if(confirm==0)
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b11;
- end
- else if(cancel==1)
- begin
- changeten=1;
- changefive=0;
- changeone=3'b101;
- outp=2'b00;
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- else
- begin
- changeten=0;
- changefive=0;
- changeone=3'b000;
- outp=2'b00;
- end
- end
- end
- endcase
- end
- endmodule
具体要求是这样的:
机器有一个投币孔,每次只能投入一枚硬币,但可以连续投入多枚硬币。机器能识别的硬币金额为1元,5角和1角。
顾客可选择的饮料价格有1元,1元4 角,2元三种,每次只能售出1瓶饮料,购买饮料时先选择饮料种类再投币,当投入的硬币总金额达到或超过饮料价格后,机器发出指示信号并拒收继续投入的硬币,此时如果未选择取消,机器将送出饮料和找零硬币。
1.状态机第三段不应该为时序逻辑吗?
2.有没有做仿真?
谢谢前辈解答!我做了仿真。现在感觉想在MODELSIM上仿真成功很容易,但想在板子上出结果,要考虑的东西就多了分,可综合什么的。我原本是想在三段式之外再写一些计算总金额的,但用了传说中的“门控时钟”,而且写成了MEALY型状态机,现在要全部重新写啦,哈哈。
我是初学小白,现在发过两个求助帖,都有您的解答,真是万分感谢!哈哈~给敬个礼继续努力!
不客气,一起学习!
栏目分类
射频专业培训教程推荐