宝宝friend 2014-04-07 03:47
浏览 1006

VHDL程序,出错代号10821

这是我自己编写的一个关于自动售货机的程序,网上说我的时钟有问题,但是我试了很多次没改成功,求各位高手帮帮我。
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY Vending_machine IS
port( clk1,clk:in std_logic;
coin_10,coin_5,coin_1:in std_logic;
a,b,g,buy,coin,confirm,cancel:in std_logic;
out_goods,give_charge:out std_logic;
sum_in,sum_out: buffer std_logic_vector(3 downto 0);
Z:out std_logic_vector(7 downto 0));
END Vending_machine;
ARCHITECTURE behav OF Vending_machine IS
signal slip:std_logic_vector(2 downto 0);
signal state:std_logic_vector(2 downto 0);
begin
process(clk,coin,confirm,cancel,state,coin_10,coin_5,coin_1)
VARIABLE I:integer RANGE 0 TO 5;
VARIABLE sum:std_logic_vector(3 downto 0);
begin
I:=0;
state <=a&b&g;
IF clk1'event and clk1 = '1' THEN
IF state = "000" THEN
IF rising_edge(clk) THEN
slip <= slip + 1;
END IF;
CASE slip IS
when "000" => Z <= "00000001";
when "001" => Z <= "00000011";
when "010" => Z <= "00000111";
when "011" => Z <= "00001111";
when "100" => Z <= "00011111";
when "101" => Z <= "00111111";
when "110" => Z <= "01111111";
when "111" => Z <= "11111111";
END CASE;
ELSIF state = "001" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 4) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 3;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 3;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSIF state = "010" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 4) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 3;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 3;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSIF state = "011" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 2) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 1;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 1;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSIF state = "100" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 5) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 4;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 4;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSIF state = "101" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 5) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 4;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 4;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSIF state = "110" AND confirm = '1' THEN
IF coin = '1' THEN
IF rising_edge(coin_1) THEN
WHILE(I < 4) LOOP
sum_in <= sum;
I:= I + 1;
sum:= sum + 1;
END LOOP;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
END IF;
END IF;
END IF;
ELSIF coin = '0' AND coin_10 = '1' THEN
sum := sum + 10;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum_in - 3;
sum_out <= sum;
END IF;
END IF;
ELSE
IF coin = '0' AND coin_5 = '1' THEN
sum := sum + 5;
sum_in <= sum;
IF cancel = '1' THEN
give_charge <= '1';
sum_out <= sum_in;
ELSE
IF buy = '1' THEN
out_goods <= '1';
give_charge <= '1';
sum := sum - 3;
sum_out <= sum;
END IF;
END IF;
END IF;
END IF;
ELSE
IF rising_edge(clk) THEN
slip <= slip + 1;
END IF;
CASE slip IS
when "000" => Z <= "00000001";
when "001" => Z <= "00000011";
when "010" => Z <= "00000111";
when "011" => Z <= "00001111";
when "100" => Z <= "00011111";
when "101" => Z <= "00111111";
when "110" => Z <= "01111111";
when "111" => Z <= "11111111";
END CASE;
END IF;
END IF;
END process;
END behav;

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 求TYPCE母转母转接头24PIN线路板图
    • ¥100 国外网络搭建,有偿交流
    • ¥15 高价求中通快递查询接口
    • ¥15 解决一个加好友限制问题 或者有好的方案
    • ¥15 急matlab编程仿真二阶震荡系统
    • ¥20 TEC-9的数据通路实验
    • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
    • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
    • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
    • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型