EDA筆記(3)--計數器動態掃描

本文主要講述下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。
在這裏插入圖片描述

到這裏本文講解完畢,如有錯誤請批評指正!

碼字不易,你的支持是我創作的最大動力,給個點贊關注下吧碼字不易,你的支持是我創作的最大動力,給個點贊關注下吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章