本文主要講述下9999計數器+動態數碼掃描顯示程序的設計,語言均爲VHDL編寫
首先在我博客EDA筆記系列中,前面我已經講解了0-9999加法計數器的設計,現在將其加上動態數碼管掃描,那麼我們就再添加兩個部分:控制模塊與動態顯示。
控制模塊CTRLS代碼如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--控制模塊
entity CTRLS is
port (clk: in std_logic;
sel: out std_logic_vector(2 downto 0));
end CTRLS;
architecture bhv of CTRLS is
signal cnt: std_logic_vector(2 downto 0);
begin
--產生000-111週期性變化的控制信號
process(clk) is
begin
if clk'event and clk ='1' then
if cnt = "111" then
cnt<="000";
else
cnt<=cnt+'1';
end if;
end if;
end process;
sel<=cnt;
end bhv;
動態顯示代碼display如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--動態顯示模塊
entity display is
port (sel: in std_logic_vector(2 downto 0);
datain: in std_logic_vector(15 downto 0);
com: out std_logic_vector(7 downto 0);
seg: out std_logic_vector(7 downto 0));
end display;
architecture bhv of display is
signal data: std_logic_vector(3 downto 0);
begin
P1: process(sel) is
begin
case sel is
--位選
when "000" =>com<="11111110";
when "001" =>com<="11111101";
when "010" =>com<="11111011";
when "011" =>com<="11110111";
when "100" =>com<="11101111";
when "101" =>com<="11011111";
when "110" =>com<="10111111";
when "111" =>com<="01111111";
when others =>com<="11111111";
end case;
end process P1;
P2: process(sel)
begin
case sel is
when "000" =>data<=datain(3 downto 0);
when "001" =>data<=datain(7 downto 4);
when "010" =>data<=datain(11 downto 8);
when "011" =>data<=datain(15 downto 12);
when others =>data<= "0000";
end case;
case data is
--段選
when "0000" =>seg<="00111111";
when "0001" =>seg<="00000110";
when "0010" =>seg<="01011011";
when "0011" =>seg<="01001111";
when "0100" =>seg<="01100110";
when "0101" =>seg<="01101101";
when "0110" =>seg<="01111101";
when "0111" =>seg<="00000111";
when "1000" =>seg<="01111111";
when "1001" =>seg<="01101111";
when others =>seg<="00000000";
end case;
end process P2;
end bhv;
然後還是按照之前EDA筆記(2)中所講的混合輸入方式,編譯導出符號元件,構建頂層原理圖如下:
接着編譯驗證頂層原理圖是否成功,新建仿真文件,導入起始量,觀察仿真結果是否符合設計要求。
這裏需要解釋以下幾點:
1.一次計數結果的變化要對應一次掃描,即掃描時鐘變化8次,結果才變化一次,則計數時鐘信號CLK1的週期該設定爲等於或大於動態掃描顯示時鐘CLK2週期的8倍,如圖仿真設置是CLK1週期是40ns,CLK2週期是5ns。
2.COM相當於位碼選擇,即從11111110-01111111,從第一個動態數碼管到最後一個動態數碼管,對應於動態顯示控制產生模塊的輸出000-111。
3.CLK1每來一個上升沿計數加一,計數器輸出是從0開始然後每來一個上升沿加1,對應於動態數碼管的顯示,十六進制從3FH-6FH(即顯示從0-9)。
從以上示意圖不難看出規律,以此類推,9999十進制計數範圍功能仿真結果成立
4.不難看出在com的後四段對應的seg值一直爲3F,即爲0,這是因爲在程序中只使用了前四個數碼管,後四個沒有用到,皆讓其默認爲0。