📄 sh_more.vhd.bak
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SH_MORE IS
PORT(
CLK:IN STD_LOGIC; --输入端口
RST:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
COMM:IN STD_LOGIC;
ERROR1,ERROR2:OUT STD_LOGIC; --输出端口
COMMODITY1,COMMODITY2:OUT STD_LOGIC;
GIVE_CHANGE1,GIVE_CHANGE2:OUT STD_LOGIC
);
END;
ARCHITECTURE BHV OF SH_MORE IS
TYPE FSM_ST IS (S0,S1,S2,S3); --定义状态数据类型
SIGNAL STATE:FSM_ST; --定义状态数据信号
BEGIN
PROCESS(CLK,RST)
BEGIN
IF RST='1' THEN STATE<=S0; --置位信号
ELSIF CLK'EVENT AND CLK='1' THEN --上升沿
IF COMM='1' THEN --选中商品1
CASE STATE IS
WHEN S0=>
CASE DIN IS
WHEN "00"=>STATE<=S0; --初始化
COMMODITY1<='0';
GIVE_CHANGE1<='0';
ERROR1<='0';
COMMODITY2<='0';
GIVE_CHANGE2<='0';
ERROR2<='0';
WHEN "01"=>STATE<=S1;
COMMODITY1<='0';
GIVE_CHANGE1<='0';
ERROR1<='0';
COMMODITY2<='0';
GIVE_CHANGE2<='0';
ERROR2<='0';
WHEN "10"=>STATE<=S2;
COMMODITY1<='0';
GIVE_CHANGE1<='0';
ERROR1<='0';
COMMODITY2<='0';
GIVE_CHANGE2<='0';
ERROR2<='0';
WHEN "11"=>ERROR1<='1';STATE<=S0;
--设定值为3元,输入5元是报错并初始化
WHEN OTHERS=>
ERROR1<='1';STATE<=S0;
--STD_LOGIC数据类型其它情况时报错并初始化
END CASE;
WHEN S1=>
CASE DIN IS
WHEN "00"=>STATE<=S1; --状态初始化
WHEN "01"=>STATE<=S2;
WHEN "10"=>COMMODITY1<='1';
GIVE_CHANGE1<='0';
STATE<=S0;
--输入3元后输出商品1并初始化
WHEN "11"=>ERROR1<='1';STATE<=S0;
--输入1元和2元后再输入5元是报错并初始化
WHEN OTHERS=>
ERROR1<='1';STATE<=S0;
--同上面的WHEN OTHERS语句功能
END CASE;
WHEN S2=>
CASE DIN IS
WHEN "00"=>STATE<=S2;
WHEN "01"=>COMMODITY1<='1';
GIVE_CHANGE1<='0';
STATE<=S0;
--输入3元后输出商品1并初始化
WHEN "10"=>COMMODITY1<='1';
GIVE_CHANGE1<='1';
STATE<=S0;
--输入4元后输出商品1并找钱,初始化
WHEN "11"=>ERROR1<='1';STATE<=S0;
--输入2元后再输入5元报错并初始化
WHEN OTHERS=>
ERROR1<='1';STATE<=S0;
--同上面的WHEN OTHERS语句功能
END CASE;
WHEN S3=>
CASE DIN IS
WHEN "00"=>COMMODITY1<='1';
GIVE_CHANGE1<='0';
STATE<=S0;
--输入3元后送出商品1并初始化
WHEN "01"=>ERROR1<='1';STATE<=S0;
--输入不符合规则,报错并初始化,下同
WHEN "10"=>ERROR1<='1';STATE<=S0;
WHEN "11"=>ERROR1<='1';STATE<=S0;
WHEN OTHERS=>
ERROR1<='1';STATE<=S0;
--同上面的WHEN OTHERS语句功能
END CASE;
WHEN OTHERS=>ERROR1<='1';STATE<=S0;
--出现其它状态类型后报错并初始化
END CASE;
ELSIF COMM='0' THEN
--选中商品2,以下个语句功能与商品1对应相同
CASE STATE IS
WHEN S0=>
CASE DIN IS
WHEN "00"=>STATE<=S0;COMMODITY2<='0';GIVE_CHANGE2<='0';ERROR2<='0';
COMMODITY1<='0';GIVE_CHANGE1<='0';ERROR1<='0';
WHEN "01"=>STATE<=S1;COMMODITY2<='0';GIVE_CHANGE2<='0';ERROR2<='0';
COMMODITY1<='0';GIVE_CHANGE1<='0';ERROR1<='0';
WHEN "10"=>STATE<=S2;COMMODITY2<='0';GIVE_CHANGE2<='0';ERROR2<='0';
COMMODITY1<='0';GIVE_CHANGE1<='0';ERROR1<='0';
WHEN "11"=>COMMODITY2<='1';GIVE_CHANGE2<='1';STATE<=S0;
WHEN OTHERS=>ERROR2<='1';STATE<=S0;
END CASE;
WHEN S1=>
CASE DIN IS
WHEN "00"=>STATE<=S1;
WHEN "01"=>STATE<=S2;
WHEN "10"=>STATE<=S3;
WHEN "11"=>ERROR2<='1';STATE<=S0;
WHEN OTHERS=>ERROR2<='1';STATE<=S0;
END CASE;
WHEN S2=>
CASE DIN IS
WHEN "00"=>STATE<=S2;
WHEN "01"=>STATE<=S3;
WHEN "10"=>COMMODITY2<='1';STATE<=S0;
WHEN "11"=>ERROR2<='1';STATE<=S0;
WHEN OTHERS=>ERROR2<='1';STATE<=S0;
END CASE;
WHEN S3=>
CASE DIN IS
WHEN "00"=>STATE<=S3;
WHEN "01"=>COMMODITY2<='1';STATE<=S0;
WHEN "10"=>COMMODITY2<='1';GIVE_CHANGE2<='1';STATE<=S0;
WHEN "11"=>ERROR2<='1';STATE<=S0;
WHEN OTHERS=>ERROR2<='1';STATE<=S0;
END CASE;
WHEN OTHERS=>ERROR2<='1';STATE<=S0;
END CASE;
ELSE
NULL;
END IF;
END IF;
END PROCESS;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -