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