library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity cal is
port(clk:in std_logic; --输入时钟信号
num:in std_logic_vector(9 downto 0);--数字按键
plus:in std_logic;--加法按键
subt:in std_logic;--减法按键
mult:in std_logic;--乘法按键
mdiv:in std_logic;--除法按键
equal:in std_logic;--等号键
c:in std_logic; --清零键,异步置位键
onum1,onum2,onum3:out std_logic_vector(0 to 6)); --3个七段译码显示管
end cal;
architecture a of cal is
signal flag:std_logic; --表示是否有是第一个数的输入标识flag
signal fl:std_logic; --表示是否开始第二个数的标识fl
signal acc:std_logic_vector(7 downto 0):=x"00"; --用于存放第一个数的累加器
signal reg:std_logic_vector(7 downto 0):=x"00"; --用于存放第二个以及以后的数字的寄存器
signal keep:std_logic_vector(7 downto 0);--用于放显示数字的暂存器
signal ans:std_logic_vector(7 downto 0); --用于放各步计算结果的寄存器,不包括除法结果
signal dans:std_logic_vector(3 downto 0);
--用于存放除法结果的寄存器
signal dan:std_logic_vector(3 downto 0);
signal numbuff:std_logic_vector(3 downto 0);--数字缓存
signal vf:std_logic;--表示是否是最后结果的标识
signal strdiv:std_logic;--除法计算开始的信号
signal numclk:std_logic;--将数字想哦那个缓存numbuff放入累加器acc或寄存器reg的信号
signal clear:std_logic; --清零reg中数字的信号
signal inplus:std_logic;
signal insubt:std_logic;
signal inmult:std_logic;
signal inmdiv:std_logic;
signal inequal:std_logic;--同步加减乘除等于信号
signal cou:std_logic_vector(1 downto 0);--用来记忆是第几次计算的信号
component numdecoder is --引用数字按键的译码电路
port(reset:in std_logic;
inclk:in std_logic;
innum:in std_logic_vector(9 downto 0);
outnum:buffer std_logic_vector(3 downto 0);
outflag:out std_logic);
end component;
component display is--引用数字的显示电路
port(c,clk:in std_logic;
keep:in std_logic_vector(7 downto 0);
onum1,onum2,onum3:out std_logic_vector(0 to 6));
end component;
component div is --引用除法器
port(a:in std_logic_vector(7 downto 0);
b:in std_logic_vector(3 downto 0);
clk:in std_logic;
str:in std_logic;
s:out std_logic_vector(3 downto 0);
y:out std_logic_vector(3 downto 0));
end component;
begin
innum1:numdecoder port map (c,clk,num,numbuff,numclk);--按键后产生相对应的数字
pacecal:process(c,clk)--产生同步运算符号
begin
if c='1' then
inplus