id="c_n9"width="1920"height="990"style="position: fixed; top: 0px; left: 0px; z-index: -1; opacity: 0.5;">

VHDL实现数码管的动态扫描(可以连接其他的模块)

VHDL实现数码管的动态扫描(可以连接其他的模块)

简述一下写的原因

对于我为什么要写这个模块,其实主要的原因就是这个东西在EDA的作业中会很重要。而且在我上次写的那个动态扫描,虽然可以实现数码管的动态扫描,但是那个终究只是我实现计数器的,而在我要做其他的模块的时候,使用那种方法来实现数码管的扫描,个人感觉比较吃力,也难的实现,所以我就所幸重新写了一个来重新实现数码管的动态扫描,然后就是顺便分享一下。仅此而已。

原理

虽然在前面已经说过了,但是我还是想简单的说一下**(因为个人有了一丝丝新的见解)**。 动态扫描,简而言之就是通过数码管在不同的时间下,来通过不同的段选信号以及位选信号来控制数码管的显示。然后如果加快一下频率的化,那么在你看来就是这些数字是一起显示的(因为人眼的余晖效应。不知道啥是余晖效应的读者可以点一下链接。

实现过程

如果你能过读懂我所描述的原理的化,那么你就能很轻松的读懂下面的代码

好了,不说了,代码呈上。代码上我就做一点简单的注释,不难的,很容易看懂的。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity show is
port(
time_g:in std_logic_vector(3 downto 0);--计数器的个位信号
time_s:in std_logic_vector(3 downto 0);--计数器的十位信号
clk:in std_logic;
sel:out std_logic_vector(7 downto 0);
smg:out std_logic_vector(6 downto 0)
);
end;
architecture one of show is
begin
process(clk)
variable cnt:integer range 0 to 1:=0;--定义变量来实现对数码管的控制,这里实现的是一个简单的两位的计数器,所以是0到1
begin
if clk'event and clk='1' then  
	if cnt=0 then 
	sel<="11111101";
	case time_s is
	when "0000"=>smg<="1111110";
	when "0001"=>smg<="0110000";
	when "0010"=>smg<="1101101";
	when "0011"=>smg<="1111001";
	when "0100"=>smg<="0110011";
    when "0101"=>smg<="1011011";
	when "0110"=>smg<="1011111";
	when "0111"=>smg<="1110000";
	when "1000"=>smg<="1111111";
	when "1001"=>smg<="1111011";
	when others=>smg<="0000000";
	end case;
	cnt:=cnt+1;
	elsif cnt=1 then 
	sel<="11111110";
	case time_g is
	when "0000"=>smg<="1111110";
	when "0001"=>smg<="0110000";
	when "0010"=>smg<="1101101";
	when "0011"=>smg<="1111001";
	when "0100"=>smg<="0110011";
    when "0101"=>smg<="1011011";
	when "0110"=>smg<="1011111";
	when "0111"=>smg<="1110000";
	when "1000"=>smg<="1111111";
	when "1001"=>smg<="1111011";
	when others=>smg<="0000000";
	end case;
	cnt:=0;
	end if;
end if;
end process;
end;

嗯,我还是简单的说一下吧。

首先你定义了一个cnt来控制数码管,然后当时钟上升沿到来的时候,cnt=0的就开始工作,而当下一次时钟信号到来的时候,cnt=1的部分开始工作,然后循环往复,当时钟频率够快,你感觉看到的就是一起显示在上面的。(什么嘛,这不就是原理嘛,没错就是)

后续

这个是实现EDA大作业的很重要的一部分,上面只是给出了一个简单的模板而已,自己可以按照需求进行添加。然后生成元器件进行连线即可。

posted @ 2022-01-29 10:53  hellozmc  阅读(399)  评论(0编辑  收藏  举报