会VHDL语言的进

2025-03-12 00:43:56
推荐回答(1个)
回答1:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; --使用标准库及库中包
entity miao is --定义实体 名字叫miao
port(enl,res,clk,madd,mdec:in std_logic; --定义 5个输入端口
a,b:out std_logic_vector(3 downto 0); --定义两个4位输出端口
ca:out std_logic); -- 定义一个一位输出端口
end miao;
architecture SEC of miao is --定义实体miao的一个结构体 SEC
begin
process(enl,clk,res) --定义一个进程 只要enl clk res三个输入端口的值有变化 则执行该进程
variable m0,m1:std_logic_vector(3 downto 0); --定义两个4位变量 作为中间变量 在程序最后将这两个变量值赋给a.b两个端口
--其中m0表示个位 m1表示十位
begin
if res='1' then m0:="0000"; --如果res置1 即复位高电平有效 则将所有输出端口置0
m1:="0000";
ca<='0';
elsif clk'event and clk='1' then --如果res不置1 则在clk的上升沿 执行下面的语句 每个上升沿都执行
ca<='0';
if madd='1' or enl='1' then --如果madd置1 或者enl置1 程序选择的是累加方式
if m0="1000" and m1="0101" then ca<='1'; --如果已经到59个脉冲 则ca置1 表示已经到1分钟
end if;
if m0<"1001" then m0:=m0+1; --如果m0没有到1001(十进制9)那么m0就累加
else m0:="0000"; --如果到9了 则向十位m1进一
m1:=m1+1;
if m1>"0101" then m0:="0000"; --如果m1超过0101(5) 则所有置0
m1:="0000";
ca<='0';
end if;
end if;
elsif mdec='1' then --如果madd或者enl置0 mdec置1 则选择递减方式
if m0="0000" and m1="0000" then m0:="1001"; --如果选择递减方式则一旦为0 将十位置5 个位置9
m1:="0101";

elsif m0>"0000" then m0:=m0-1; --如果个位不是0 则依次剪1
else m0:="1001"; --如果个位剪刀0 则变成9 向高位借一 m1剪1
m1:=m1-1;
end if;
end if;
end if;
a<=m0; --将m0 m1赋给 a,b
b<=m1;
end process;
end SEC;