用VHDL语言编(共八个)七段数码管的随机显示程序 100
八个起段数码管有三个片选选择使用哪个七段数码管,还有八个接口是控制七段数码管那一小段亮有懂的帮帮忙,我急!谢谢好人真心非常感谢你这个程序他要实现这样一个功能,就是设置一个...
八个起段数码管有三个片选 选择使用哪个七段数码管,还有八个接口是控制七段数码管那一小段亮 有懂的帮帮忙 , 我急 !谢谢好人
真心非常感谢你 这个程序他要实现这样一个功能,就是设置一个键,当他不按时循环显示0--f 按下后显示1,3,5,7,9,11,13,15,2,4,6,8,10,12,14 ,再按一下时从新显示0---F,加个控制键的,因为还要下载到FPGA实验箱验证,所以对灯的闪烁时间是否要要求没? 我对编程不通,而且第一次接触这种语言 ,谢谢您 ,一定要帮帮我。我邮箱 dhy_angel@yahoo.cn .那个八个八段数码管 都要使用 但是动态的 最后用MX7000系列的验证。 展开
真心非常感谢你 这个程序他要实现这样一个功能,就是设置一个键,当他不按时循环显示0--f 按下后显示1,3,5,7,9,11,13,15,2,4,6,8,10,12,14 ,再按一下时从新显示0---F,加个控制键的,因为还要下载到FPGA实验箱验证,所以对灯的闪烁时间是否要要求没? 我对编程不通,而且第一次接触这种语言 ,谢谢您 ,一定要帮帮我。我邮箱 dhy_angel@yahoo.cn .那个八个八段数码管 都要使用 但是动态的 最后用MX7000系列的验证。 展开
1个回答
展开全部
我这里有一个自己弄的现成的程序。可以给你看看。
首先是你要有数码管译码器,以下这个是共阴数码管的译码电路的VHDL。segin是输入的你要显示的二进制数据,比如1001代表的就是9。seg就是输出的点亮七段数码管的信号。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity seg is
port(
segin :in std_logic_vector(3 downto 0);
seg :out std_logic_vector(7 downto 0)
);
end entity seg;
architecture a of seg is
begin
process(segin)
begin
case segin is
when "0000" => seg <= "01111110";
when "0001" => seg <= "00001100";
when "0010" => seg <= "10110110";
when "0011" => seg <= "10011110";
when "0100" => seg <= "11001100";
when "0101" => seg <= "11011010";
when "0110" => seg <= "11111010";
when "0111" => seg <= "00001110";
when "1000" => seg <= "11111110";
when "1001" => seg <= "11011110";
when others => seg <= "01111110";
end case;
end process;
end a;
如果有三位要显示的话,那么只要三个数据分别输入三个译码电路,然后输出的就是你三位分别需要的驱动信号了。接下来就是你如何将这三个LED分别选通,由于三根数码管是串联的,所以如果不加片选信号,三根应该显示同一个数字。我们只要在一个时间段里面显示一位,即片选一位,然后将这一位所对应的数字输出,另外两个不亮。接着立马更换显示第二位,然后是第三位,只要频率够快就可以了。下面给出片选信号输出的VHDL。
其中Clk为时钟信号,每次时钟上升沿做一次选通变换,seg1,2,3分别为三位输入的数码管驱动信号,seg为输出的数码管输出信号,en为三位的选通输出信号,0电平点亮。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xt is
port(
clk :in std_logic;
seg1 :in std_logic_vector(7 downto 0);
seg2 :in std_logic_vector(7 downto 0);
seg3 :in std_logic_vector(7 downto 0);
seg :out std_logic_vector(7 downto 0);
en :out std_logic_vector(2 downto 0)
);
end entity xt;
architecture a of xt is
signal counter: integer range 0 to 3;
begin
p1: process
begin
wait until clk='1';
if counter=2 then
counter<=0;
else
counter<=counter+1;
end if;
end process;
p2:process(counter)
begin
case counter is
when 0 => seg <= seg1;en<="011";
when 1 => seg <= seg2;en<="101";
when others => seg <= seg3;en<="110";
end case;
end process;
end a;
如果还有疑问的可以再提。
我了解了,我可以帮你做好发到你邮箱
首先是你要有数码管译码器,以下这个是共阴数码管的译码电路的VHDL。segin是输入的你要显示的二进制数据,比如1001代表的就是9。seg就是输出的点亮七段数码管的信号。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity seg is
port(
segin :in std_logic_vector(3 downto 0);
seg :out std_logic_vector(7 downto 0)
);
end entity seg;
architecture a of seg is
begin
process(segin)
begin
case segin is
when "0000" => seg <= "01111110";
when "0001" => seg <= "00001100";
when "0010" => seg <= "10110110";
when "0011" => seg <= "10011110";
when "0100" => seg <= "11001100";
when "0101" => seg <= "11011010";
when "0110" => seg <= "11111010";
when "0111" => seg <= "00001110";
when "1000" => seg <= "11111110";
when "1001" => seg <= "11011110";
when others => seg <= "01111110";
end case;
end process;
end a;
如果有三位要显示的话,那么只要三个数据分别输入三个译码电路,然后输出的就是你三位分别需要的驱动信号了。接下来就是你如何将这三个LED分别选通,由于三根数码管是串联的,所以如果不加片选信号,三根应该显示同一个数字。我们只要在一个时间段里面显示一位,即片选一位,然后将这一位所对应的数字输出,另外两个不亮。接着立马更换显示第二位,然后是第三位,只要频率够快就可以了。下面给出片选信号输出的VHDL。
其中Clk为时钟信号,每次时钟上升沿做一次选通变换,seg1,2,3分别为三位输入的数码管驱动信号,seg为输出的数码管输出信号,en为三位的选通输出信号,0电平点亮。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xt is
port(
clk :in std_logic;
seg1 :in std_logic_vector(7 downto 0);
seg2 :in std_logic_vector(7 downto 0);
seg3 :in std_logic_vector(7 downto 0);
seg :out std_logic_vector(7 downto 0);
en :out std_logic_vector(2 downto 0)
);
end entity xt;
architecture a of xt is
signal counter: integer range 0 to 3;
begin
p1: process
begin
wait until clk='1';
if counter=2 then
counter<=0;
else
counter<=counter+1;
end if;
end process;
p2:process(counter)
begin
case counter is
when 0 => seg <= seg1;en<="011";
when 1 => seg <= seg2;en<="101";
when others => seg <= seg3;en<="110";
end case;
end process;
end a;
如果还有疑问的可以再提。
我了解了,我可以帮你做好发到你邮箱
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询