两位16进制加减可逆计数器
来源:互联网 发布:origin显示坐标轴数据 编辑:程序博客网 时间:2024/06/07 04:02
本例使用VHDL编写的两位十六进制(两个七段数码管显示,每个数码管范围是0~F)加减可逆计数器。其中所用实验箱是武汉大学的教学实验箱,其它实验箱请自行变通。
转载请注明出处,谢谢!以下是完整代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity counter6 is
port(clk0,clk1,clk2,din,en,rst,direc:in std_logic; --direc为方向控制,1加法计数,0减法计数
dout:out std_logic_vector(7 downto 0);
scan:out std_logic_vector(5 downto 0));
end counter6;
architecture Behavioral of counter6 is
signal c,f1,f2, f3,f4,f5,f6,fclk,fd,f:std_logic:='0';
signal data1,data2,dataout,fclk1:std_logic_vector(3 downto 0);
signal temp:std_logic;
begin
process(clk1)
begin
if clk1'event and clk1='1' then
fclk1<= fclk1+1;
end if;
end process;
fd<=fclk1(3);
process(fd)
begin
if fd'event and fd='1' then
if din = '0' then c<='1';
else c<='0';
end if;
end if;
end process;
process(clk0)
begin
if clk0'event and clk0='1' then
fclk<=( not fclk);
end if;
end process;
f1<=(c and en)or (fclk and not en );
process(f1) --低位计数
begin
if rst='1' then data1<="0000";
elsif f1'event and f1='1' then
if direc = '1' then -- 加法计数
if data1="1111" then
f2<='1';data1<="0000"; --产生的f2为进位信号
else data1<=data1+1;f2<='0';
end if;
else -- 减法计数
if data1="0000" then
f2<='1';data1<="1111"; --产生的f2是借位信号
else data1<=data1-1;f2<='0';
end if;
end if;
end if;
end process;
process(f2) --高位计数
begin
if rst='1' then data2<="0000";
elsif f2'event and f2='1' then
if direc = '1' then -- 加法计数
if data2="1111" then
data2<="0000"; --产生的f2为进位信号
else data2<=data2+1;
end if;
else -- 减法计数
if data2="0000" then
data2<="1111"; --产生的f2是借位信号
else data2<=data2-1;
end if;
end if;
end if;
end process;
process(clk2)
begin
if clk2'event and clk2='1' then
if temp = '1' then temp <='0';
else
temp<= '1';
end if;
end if;
end process;
process(temp)
begin
case temp is
when '0' => dataout<=data1;scan<="000001";
when '1' => dataout<=data2;scan<="000010";
when others =>null;
end case;
case dataout is
when "0000" => dout <="00111111" ; --0
when "0001" => dout <="00000110" ; --1
when "0010" => dout <="01011011" ; --2
when "0011" => dout <="01001111" ; --3
when "0100" => dout <="01100110" ; --4
when "0101" => dout <="01101101" ; --5
when "0110" => dout <="01111101" ; --6
when "0111" => dout <="00000111" ; --7
when "1000" => dout <="01111111" ; --8
when "1001" => dout <="01101111" ; --9
when "1010" => dout <="01110111" ; --a
when "1011" => dout <="01111100" ; --b
when "1100" => dout <="00111001" ; --c
when "1101" => dout <="01011110" ; --d
when "1110" => dout <="01111001" ; --e
when "1111" => dout <="01110001" ; --f
when others => dout<="00000000";
end case;
end process;
end Behavioral;
接下来是引脚分配图:
- 两位16进制加减可逆计数器
- VHDL:时序逻辑电路实验-两位16进制加减可逆计数器
- iOS UIStepper 加减计数器
- 四位可逆素数
- 四位可逆素数
- 位加减
- The Hard Week---嵌入式系统实验2---两位计数器
- 4-9-源码反码补码、进制转化、寄存器变量、动态库dll、位运算加减
- 基于react、react-redux的加减计数器
- 自定义控件——加减计数器
- 五位十进制计数器
- 4位计数器
- stm32f432位计数器计数
- 16位计数器之元件例化的学习
- 做format, 转16进制不够两位,高位不会补0 的解决方法
- EDA的Verilog语言编写16进制计数器
- js 两数 的 加减乘数 运算
- 字段最高位加减的简单例子
- ubuntu锁屏
- 如何清除图片下方出现几像素的空白间隙?
- hiho第六周——01背包(动态规划)
- ubuntu14.04 vim
- 标准Web系统的架构分层
- 两位16进制加减可逆计数器
- http传参json格式
- 电脑垃圾清理专家专业版 9.98 无限试用版与使用测评
- dhcp服务器详细配置
- Oracle11g安装完成后给用户解锁
- HTML5测试网站
- 我的arduino小车图片
- Android 屏幕旋转生命周期以及处理方法
- 使用Service Bus + SignalR 实现聊天室