在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2021|回复: 4

[求助] 硬件实现自动售货机可以生成比特流,但板子上不出结果

[复制链接]
发表于 2015-8-18 15:29:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
如题,个人感觉可能是状态机写得不好,贴出来想请大神们指导一下,嘻嘻:



  1. module vendor(moda,changeten,changefive,changeone,outp,clk,sort,coin10,coin5,coin1,cancel,confirm);
  2.   input clk,coin10,coin5,coin1,cancel,confirm;
  3.   input [1:0] sort;
  4.   output reg moda;
  5.   output reg changeten;
  6.   output reg changefive;
  7.   output reg [2:0] changeone;
  8.   output reg [1:0] outp;
  9.   reg [4:0] coins_sum;
  10.   reg [4:0] coins_sum10;
  11.   reg [4:0] coins_sum5;
  12.   reg [4:0] coins_sum1;
  13.   reg current_state;
  14.   reg next_state;
  15.   parameter idle=0;
  16.   parameter juice=1;
  17.   
  18. always@(negedge coin10 or posedge moda)
  19. begin
  20.   if(moda)
  21.     coins_sum10=5'b00000;
  22.   else if(!coin10)
  23.     coins_sum10 = coins_sum10+5'b01010;
  24.   else ;
  25. end
  26. always@(negedge coin5 or posedge moda)
  27. begin
  28.   if(moda)
  29.   coins_sum5=5'b00000;
  30.   else if(!coin5)
  31.     coins_sum5 = coins_sum5+5'b00101;
  32.   else ;
  33. end
  34. always@(negedge coin1 or posedge moda)
  35. begin
  36.   if(moda)
  37.     coins_sum1=5'b00000;
  38.   else if(!coin1)
  39.     coins_sum1 = coins_sum1+5'b00001;
  40.   else ;
  41. end
  42. always@(negedge confirm or posedge moda)
  43. begin
  44.   if(moda)
  45.   coins_sum=5'b00000;
  46.   else
  47.   coins_sum=coins_sum1+coins_sum5+coins_sum10;
  48. end

  49. always@(posedge clk or posedge cancel)
  50. begin
  51.   if(cancel)
  52.     current_state = idle;
  53.   else
  54.     current_state = next_state;
  55. end


  56. always@(confirm or cancel or current_state)
  57. begin
  58.   case(current_state)
  59.     idle:begin
  60.       if(sort==2'b01 | sort==2'b10 | sort==2'b11)
  61.         begin
  62.           if(confirm==1)
  63.         next_state = juice;
  64.       else if(cancel==1)
  65.         next_state = idle;
  66.       else
  67.         next_state = current_state;
  68.       end
  69.     else
  70.       next_state = current_state;
  71.     end
  72.     juice:begin
  73.       if(sort==2'b01)
  74.         begin
  75.           if((coins_sum>5'b01010) | (coins_sum==5'b01010))
  76.             begin
  77.               if(confirm==0)
  78.                 next_state=idle;
  79.               else if(cancel==1)
  80.                 next_state=idle;
  81.               else
  82.                 next_state = current_state;
  83.               end
  84.             else
  85.             next_state = current_state;
  86.           end
  87.         else if(sort==2'b10)
  88.           begin
  89.           if((coins_sum>5'b01110) | (coins_sum==5'b01110))
  90.             begin
  91.               if(confirm==0)
  92.                 next_state=idle;
  93.               else if(cancel==1)
  94.                 next_state=idle;
  95.               else
  96.                 next_state = current_state;
  97.               end
  98.             else
  99.             next_state = current_state;
  100.           end
  101.         else
  102.           begin
  103.           if((coins_sum>5'b10100) | (coins_sum==5'b10100))
  104.             begin
  105.               if(confirm==0)
  106.                 next_state=idle;
  107.               else if(cancel==1)
  108.                 next_state=idle;
  109.               else
  110.                 next_state = current_state;
  111.               end
  112.             else
  113.             next_state = current_state;
  114.           end
  115.         end
  116.         endcase
  117.         end
  118.         
  119.         
  120. always@(confirm or cancel or current_state)
  121. begin
  122.   case(current_state)
  123.     idle:
  124.     begin
  125.       moda=1;
  126.       changeten=0;
  127.       changefive=0;
  128.       changeone=3'b000;
  129.       outp=2'b00;
  130.     end
  131.     juice:
  132.     begin
  133.       moda=0;
  134.       if(sort==2'b01)
  135.         begin
  136.           if((coins_sum>5'b01010) | (coins_sum==5'b01010))
  137.             begin
  138.               if(confirm==0)
  139.                 begin
  140.                 changeten=0;
  141.                 changefive=0;
  142.                 changeone=3'b000;
  143.                 outp=2'b01;
  144.               end
  145.               else if(cancel==1)
  146.                 begin
  147.                 changeten=1;
  148.                 changefive=0;
  149.                 changeone=3'b000;
  150.                 outp=2'b00;
  151.               end
  152.               else
  153.                 begin
  154.                 changeten=0;
  155.                 changefive=0;
  156.                 changeone=3'b000;
  157.                 outp=2'b00;
  158.               end
  159.             end
  160.           else
  161.             begin
  162.             changeten=0;
  163.             changefive=0;
  164.             changeone=3'b000;
  165.             outp=2'b00;
  166.           end
  167.           end
  168.         else if(sort==2'b10)
  169.           begin
  170.           if((coins_sum>5'b01110) | (coins_sum==5'b01110))
  171.             begin
  172.               if(confirm==0)
  173.                 begin
  174.                   if(coins_sum>5'b01111)
  175.                     begin
  176.                 changeten=0;
  177.                 changefive=1;
  178.                 changeone=3'b001;
  179.                 outp=2'b10;
  180.               end
  181.             else
  182.               begin
  183.                 changeten=0;
  184.                 changefive=0;
  185.                 changeone=3'b001;
  186.                 outp=2'b10;
  187.               end
  188.             end
  189.               else if(cancel==1)
  190.                 begin
  191.                 changeten=1;
  192.                 changefive=0;
  193.                 changeone=3'b100;
  194.                 outp=2'b00;
  195.               end
  196.               else
  197.                 begin
  198.                 changeten=0;
  199.                 changefive=0;
  200.                 changeone=3'b000;
  201.                 outp=2'b00;
  202.               end
  203.             end
  204.           else
  205.             begin
  206.             changeten=0;
  207.             changefive=0;
  208.             changeone=3'b000;
  209.             outp=2'b00;
  210.           end
  211.           end
  212.         else
  213.           begin
  214.           if((coins_sum>5'b10100) | (coins_sum==5'b10100))
  215.             begin
  216.               if(confirm==0)
  217.                 begin
  218.                 changeten=0;
  219.                 changefive=0;
  220.                 changeone=3'b000;
  221.                 outp=2'b11;
  222.               end
  223.               else if(cancel==1)
  224.                 begin
  225.                 changeten=1;
  226.                 changefive=0;
  227.                 changeone=3'b101;
  228.                 outp=2'b00;
  229.               end
  230.               else
  231.                 begin
  232.                 changeten=0;
  233.                 changefive=0;
  234.                 changeone=3'b000;
  235.                 outp=2'b00;
  236.               end
  237.             end
  238.           else
  239.             begin
  240.             changeten=0;
  241.             changefive=0;
  242.             changeone=3'b000;
  243.             outp=2'b00;
  244.           end
  245.           end
  246.         end
  247.         endcase
  248.     end
  249.     endmodule



复制代码
 楼主| 发表于 2015-8-18 15:32:07 | 显示全部楼层
具体要求是这样的:
机器有一个投币孔,每次只能投入一枚硬币,但可以连续投入多枚硬币。机器能识别的硬币金额为1元,5角和1角。
顾客可选择的饮料价格有1元,1元4 角,2元三种,每次只能售出1瓶饮料,购买饮料时先选择饮料种类再投币,当投入的硬币总金额达到或超过饮料价格后,机器发出指示信号并拒收继续投入的硬币,此时如果未选择取消,机器将送出饮料和找零硬币。
发表于 2015-8-18 19:30:30 | 显示全部楼层
1.状态机第三段不应该为时序逻辑吗?
2.有没有做仿真?
 楼主| 发表于 2015-8-21 10:46:35 | 显示全部楼层
回复 3# 越远


   谢谢前辈解答!我做了仿真。现在感觉想在MODELSIM上仿真成功很容易,但想在板子上出结果,要考虑的东西就多了分,可综合什么的。我原本是想在三段式之外再写一些计算总金额的,但用了传说中的“门控时钟”,而且写成了MEALY型状态机,现在要全部重新写啦,哈哈。
我是初学小白,现在发过两个求助帖,都有您的解答,真是万分感谢!!哈哈~给敬个礼继续努力!
发表于 2015-8-21 15:43:16 | 显示全部楼层
回复 4# WSND33

不客气,一起学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-4 04:36 , Processed in 0.033775 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表