數(shù)碼管學(xué)號滾動顯示課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  設(shè)計(jì)類別: EDA-VHDL </p><p>  專業(yè)名稱: 通信工程 </p><p>  班級學(xué)號: ~~~~~~~~ </p><p>  學(xué)生姓名: ~

2、~~~~ </p><p>  基本題 : 數(shù)字時(shí)鐘設(shè)計(jì) </p><p>  綜合題 : 數(shù)碼管學(xué)號滾動顯示 </p><p><b>  同小組成員: </b></p><p>  學(xué)號: ~~~~~~~~~ </p><p>  姓名:

3、 ~~~~~~ </p><p><b>  一、數(shù)字時(shí)鐘</b></p><p><b>  1.實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  (1)掌握VHDL語言的語法規(guī)范,掌握時(shí)序電路描述方法</p><p>  (2)掌握多個(gè)數(shù)碼管動態(tài)掃描顯示的原理及設(shè)計(jì)方法</p&

4、gt;<p><b>  2.實(shí)驗(yàn)任務(wù)要求</b></p><p>  要求學(xué)生設(shè)計(jì)一個(gè)時(shí)鐘,并輸出到數(shù)碼管顯示時(shí),分,秒。</p><p>  3.設(shè)計(jì)思路及VHDL代碼</p><p>  首先要設(shè)置一個(gè)時(shí)鐘信號,根據(jù)時(shí)鐘信號的變化來進(jìn)行時(shí)鐘的變化,從秒的變化到時(shí)的變化條件是不同的。將時(shí)分秒各分為為十位和各位即六位數(shù)字顯示時(shí)間

5、來分析。</p><p><b>  原理圖如下:</b></p><p>  VHDL源程序如下:</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsign

6、ed.all;</p><p>  entity shizhong is</p><p>  port( clk:in std_logic;</p><p>  led1:out std_logic_vector(6 downto 0);</p><p>  led2:out std_logic_vector(6 downto 0);&

7、lt;/p><p>  led3:out std_logic_vector(6 downto 0);</p><p>  led4:out std_logic_vector(6 downto 0);</p><p>  led5:out std_logic_vector(6 downto 0);</p><p>  led6:out std_lo

8、gic_vector(6 downto 0));</p><p>  end shizhong;</p><p>  architecture main of shizhong is</p><p>  signal hou1:std_logic_vector(3 downto 0);</p><p>  signal hou2:std_lo

9、gic_vector(3 downto 0);</p><p>  signal min1:std_logic_vector(3 downto 0);</p><p>  signal min2:std_logic_vector(3 downto 0);</p><p>  signal sec1:std_logic_vector(3 downto 0);</

10、p><p>  signal sec2:std_logic_vector(3 downto 0);</p><p><b>  begin</b></p><p>  -------------------------------------------------------------</p><p>  h110:pr

11、ocess(clk,hou2,min1,min2,sec1,sec2)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then</p><p>  if (hou1="0010" and hou2="0011"

12、)and(min1="0101" and min2="1001") and (sec1="0101" and</p><p>  sec2="1001") then</p><p>  hou1<="0000";</p><p>  else if (ho

13、u2="1001"and(min1="0101" and min2="1001") and (sec1="0101" and sec2="1001"))</p><p><b>  then</b></p><p>  hou1<=hou1+1;</p>

14、;<p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process h110;</p><p>  ——————————時(shí)鐘的十位&

15、lt;/p><p>  ---------------------------------------------------------------</p><p>  h220:process(clk,min1,min2,sec1,sec2,hou1)</p><p><b>  begin</b></p><p>  

16、if clk'event and clk='1' then</p><p>  if (hou1="0010" and hou2="0011")and(min1="0101" and min2="1001") and (sec1="0101" and</p><p>

17、  sec2="1001") then</p><p>  hou2<="0000";</p><p>  else if hou2="1001"and(min1="0101" and min2="1001") and (sec1="0101" and sec2=&

18、quot;1001")</p><p><b>  then</b></p><p>  hou2<="0000";</p><p>  else if((min1="0101" and min2="1001") and (sec1="0101" a

19、nd sec2="1001")) then</p><p>  hou2<=hou2+1;--speak<=clk;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end

20、if;</b></p><p><b>  end if;</b></p><p>  end process h220;</p><p>  ——————————時(shí)鐘的個(gè)位</p><p>  ------------------------------------------------------

21、--------</p><p>  m110:process(clk,min2,sec1,sec2)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then</p><p>  if (min1="0101&quo

22、t; and min2="1001") and (sec1="0101" and sec2="1001") then</p><p>  min1<="0000";</p><p>  else if (min2="1001"and (sec1="0101" and

23、 sec2="1001"))then</p><p>  min1<=min1+1;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p

24、><p>  end process m110;</p><p>  ——————————分鐘的十位</p><p>  --------------------------------------------------------------</p><p>  m220:process(clk,sec1,sec2)</p>

25、<p><b>  begin</b></p><p>  if clk'event and clk='1' then</p><p>  if min2="1001"and (sec1="0101" and sec2="1001")then</p><

26、;p>  min2<="0000";</p><p>  else if (sec1="0101" and sec2="1001") then</p><p>  min2<=min2+1;</p><p><b>  end if;</b></p>&

27、lt;p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process m220;</p><p>  ——————————分鐘的個(gè)位</p><p>  ----------------------------------

28、----------------------------</p><p>  s110:process(clk)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then</p><p>  if (sec1="010

29、1" and sec2="1001")then</p><p>  sec1<="0000";</p><p>  else if sec2="1001"then</p><p>  sec1<=sec1+1;</p><p><b>  end if

30、;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process s110;</p><p>  ——————————秒鐘的十位</p><p>  ----------

31、----------------------------------------------------</p><p>  s220:process(clk)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then</p><p

32、>  if sec2="1001" then</p><p>  sec2<="0000";</p><p>  else sec2<=sec2+1;</p><p><b>  end if;</b></p><p><b>  end if;<

33、/b></p><p>  end process s220;</p><p>  ——————————秒鐘的個(gè)位</p><p>  ---------------------------------------------------------------</p><p>  disp:process(hou1,hou2,min1

34、,min2,sec1,sec2)</p><p><b>  begin</b></p><p>  case hou1 is</p><p>  when "0000"=>LED1<="0111111";</p><p>  when "0001"

35、=>LED1<="0000110";</p><p>  when "0010"=>LED1<="1011011";</p><p>  when others=>LED1<="1000000";</p><p><b>  end case

36、;</b></p><p>  case hou2 is</p><p>  when "0000"=>LED2<="0111111";</p><p>  when "0001"=>LED2<="0000110";</p><p&

37、gt;  when "0010"=>LED2<="1011011";</p><p>  when "0011"=>LED2<="1001111";</p><p>  when "0100"=>LED2<="1100110";<

38、/p><p>  when "0101"=>LED2<="1101101";</p><p>  when "0110"=>LED2<="1111101";</p><p>  when "0111"=>LED2<="0000

39、111";</p><p>  when "1000"=>LED2<="1111111";</p><p>  when "1001"=>LED2<="1101111";</p><p>  when others=>LED2<="

40、1000000";</p><p><b>  end case;</b></p><p>  case min1 is</p><p>  when "0000"=>LED3<="0111111";</p><p>  when "0001&quo

41、t;=>LED3<="0000110";</p><p>  when "0010"=>LED3<="1011011";</p><p>  when "0011"=>LED3<="1001111";</p><p>  when

42、"0100"=>LED3<="1100110";</p><p>  when "0101"=>LED3<="1101101";</p><p>  when others=>LED3<="1000000";</p><p><

43、;b>  end case;</b></p><p>  case min2 is</p><p>  when "0000"=>LED4<="0111111";</p><p>  when "0001"=>LED4<="0000110";&l

44、t;/p><p>  when "0010"=>LED4<="1011011";</p><p>  when "0011"=>LED4<="1001111";</p><p>  when "0100"=>LED4<="11

45、00110";</p><p>  when "0101"=>LED4<="1101101";</p><p>  when "0110"=>LED4<="1111101";</p><p>  when "0111"=>LED

46、4<="0000111";</p><p>  when "1000"=>LED4<="1111111";</p><p>  when "1001"=>LED4<="1101111";</p><p>  when others=>

47、;LED4<="1000000";</p><p><b>  end case;</b></p><p>  case sec1 is</p><p>  when "0000"=>LED5<="0111111";</p><p>  whe

48、n "0001"=>LED5<="0000110";</p><p>  when "0010"=>LED5<="1011011";</p><p>  when "0011"=>LED5<="1001111";</p>

49、<p>  when "0100"=>LED5<="1100110";</p><p>  when "0101"=>LED5<="1101101";</p><p>  when others=>LED5<="1000000";</p&g

50、t;<p><b>  end case;</b></p><p>  case sec2 is</p><p>  when "0000"=>LED6<="0111111";</p><p>  when "0001"=>LED6<="

51、0000110";</p><p>  when "0010"=>LED6<="1011011";</p><p>  when "0011"=>LED6<="1001111";</p><p>  when "0100"=>L

52、ED6<="1100110";</p><p>  when "0101"=>LED6<="1101101";</p><p>  when "0110"=>LED6<="1111101";</p><p>  when "01

53、11"=>LED6<="0000111";</p><p>  when "1000"=>LED6<="1111111";</p><p>  when "1001"=>LED6<="1101111";</p><p> 

54、 when others=>LED6<="1000000";</p><p><b>  end case;</b></p><p>  end process disp;</p><p>  -----------------------------------------------------------&

55、lt;/p><p><b>  end main;</b></p><p><b>  4.仿真波形及分析</b></p><p>  通過波形可以看出,秒,分,時(shí)各位之間可以很好地完成進(jìn)位功能,秒鐘達(dá)最大值59進(jìn)一并清零,分鐘達(dá)最大值59進(jìn)一并清零,時(shí)鐘打最大值23進(jìn)一并清零,數(shù)字時(shí)鐘功能可以實(shí)現(xiàn)。</p>&

56、lt;p><b>  5.實(shí)驗(yàn)總結(jié)與體會</b></p><p>  本實(shí)驗(yàn)為基礎(chǔ)題的第一題,整體功能與實(shí)際聯(lián)系較為緊密,因此各模塊的分析和設(shè)計(jì)方面難度減少了很多,通過這個(gè)課題的設(shè)計(jì),我們初步認(rèn)識了VHDL語言,以及quartus II 軟件的具體應(yīng)用方法,能夠很直觀地將電路模塊化分析并使用vhdl語言設(shè)計(jì)出來。</p><p>  二、數(shù)碼管學(xué)號滾動顯示<

57、;/p><p><b>  1.實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  (1)掌握VHDL語言的語法規(guī)范,掌握時(shí)序電路描述方法</p><p>  (2)掌握多個(gè)數(shù)碼管動態(tài)掃描顯示的原理及設(shè)計(jì)方法</p><p><b>  2.實(shí)驗(yàn)任務(wù)要求</b></p><p>  要求學(xué)生在

58、六個(gè)數(shù)碼管滾動顯示自己的學(xué)號(六位),每隔一定時(shí)間循環(huán)移位一次,學(xué)號為奇數(shù)則左移,學(xué)號為偶數(shù)則右移。間隔時(shí)間可由開關(guān)選擇1秒,2秒,3秒和4秒。</p><p>  3.設(shè)計(jì)思路及VHDL代碼</p><p>  本題要求六位學(xué)號可以滾動顯示,通過對其功能的理解,可以找出每個(gè)數(shù)字對應(yīng)的數(shù)碼管位置變化的規(guī)律。具體實(shí)現(xiàn)可以通過在每個(gè)脈沖上升沿觸發(fā)學(xué)號中六個(gè)數(shù)字001908依次在六個(gè)數(shù)碼管上輸出

59、,而在六個(gè)脈沖之后,六位學(xué)號還是依次輸出,但是顯示的數(shù)碼管不同,首個(gè)數(shù)字在第二位數(shù)碼管顯示,以此類推,最后一位在第一位數(shù)碼管顯示。六個(gè)脈沖構(gòu)成一個(gè)循環(huán),以同上的方法類推顯示即可實(shí)現(xiàn)學(xué)號的右移效果。顯示的間隔時(shí)間可以通過源程序內(nèi)改變運(yùn)行次數(shù)來控制。</p><p><b>  原理圖如下:</b></p><p><b>  模塊設(shè)計(jì):</b>&l

60、t;/p><p><b>  輸入&輸出</b></p><p>  輸入: clk ------時(shí)鐘信號</p><p>  column ------行列式鍵盤的4列</p><p>  輸出: led_out ------數(shù)碼管8段顯示,可顯示0~9,A~

61、F</p><p>  led_sel ------選擇6個(gè)數(shù)碼管,‘1’表示點(diǎn)亮對應(yīng)數(shù)碼管</p><p>  output ------分頻后的時(shí)鐘</p><p>  Interval ------隨學(xué)號移動而數(shù)值改變的寄存器</p><p><b>  分頻電路模塊</b&g

62、t;</p><p>  PROCESS(clk)--12分頻電路</p><p>  VARIABLE counter: std_logic_vector(2 downto 0);--計(jì)數(shù)寄存器,12分頻輸入時(shí)鐘為 1Hz</p><p>  BEGIN </p><p>  IF (clk'EVENT AND

63、 clk ='0') THEN --下降沿有效</p><p>  counter := counter + 1 ;</p><p>  IF (counter = 6) THEN </p><p>  clk_temp <= NOT clk_temp; --分頻后的時(shí)鐘變化 </p><p&g

64、t;  counter := "000";</p><p><b>  END IF;</b></p><p><b>  END IF;</b></p><p>  END PROCESS;</p><p>  PROCESS(clk)--讀取行列式鍵盤的鍵值</p>

65、;<p> ?。ㄟ@段程序是對時(shí)鐘clock進(jìn)行分頻,進(jìn)而得到新的時(shí)鐘clk_temp,并賦值給輸出output)</p><p><b>  移位控制模塊</b></p><p><b>  BEGIN</b></p><p>  IF(clk'EVENT AND clk = '0')

66、THEN</p><p>  CASE column IS</p><p>  WHEN "1110" =></p><p>  key_code <= "00";</p><p>  WHEN "1101" =></p><p>  key

67、_code <= "01";</p><p>  WHEN "1011" =></p><p>  key_code <= "10";</p><p>  WHEN "0111" =></p><p>  key_code <= &q

68、uot;11";</p><p>  WHEN OTHERS => </p><p>  key_code <= "00";</p><p><b>  END CASE;</b></p><p><b>  END IF;</b></p>&

69、lt;p>  END PROCESS;</p><p>  process (clk_temp)</p><p>  VARIABLE time_count : std_logic_vector(1 DOWNTO 0); </p><p><b>  begin</b></p><p>  if (clk_te

70、mp 'event and clk_temp = '0') then--下降沿有效</p><p>  time_count := time_count + 1;</p><p>  CASE key_code IS</p><p>  WHEN "00" =></p><p>

71、  shift <= shift- 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <="110";</p><p>  end if; </p><p>  WHEN "01" =>&

72、lt;/p><p>  if(time_count = "10") then </p><p>  time_count := "00" ;</p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") the

73、n</p><p>  shift <="110";</p><p><b>  end if; </b></p><p>  end if; </p><p>  WHEN "10" =></p><p>  if(time_count

74、 = "11") then </p><p>  time_count := "00";</p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <=&

75、quot;110";</p><p><b>  end if; </b></p><p>  end if; </p><p>  WHEN "11" =></p><p>  if(time_count = "00") then </p>

76、<p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <="110";</p><p><b>  end if; </b></p><p>

77、  end if; </p><p>  WHEN OTHERS =></p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <="110";</p>

78、;<p><b>  end if; </b></p><p><b>  END CASE;</b></p><p><b>  end if;</b></p><p>  end process; </p><p>  注: 該模塊利用 key_code的

79、四個(gè)數(shù)值來控制四個(gè)case,由于time_count 初始值是00,在進(jìn)入運(yùn)算時(shí)是01,根據(jù)case的不同,運(yùn)行次數(shù)不同,分別是一次,兩次,三次和四次,根據(jù)這個(gè)來控制移動的間隔時(shí)間。</p><p><b>  數(shù)碼管顯示模塊</b></p><p>  process (clk)------顯示學(xué)號001908</p><p>  VARIA

80、BLE led_sel_llb :std_logic_vector(3 DOWNTO 0); --信號量,6個(gè)數(shù)碼管顯示的選擇</p><p><b>  begin</b></p><p>  if (clk 'event and clk='0') then --時(shí)鐘下降沿有效</p><p>  if

81、 (led_sel_count = "0000") then--輪詢6個(gè)數(shù)碼管</p><p>  led_sel_count <= "0101";</p><p><b>  else </b></p><p>  led_sel_count <= led_sel_count - &

82、quot;0001";</p><p><b>  end if;</b></p><p>  --0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff</p><p>  -- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

83、空</p><p>  case led_sel_count is --選擇要要顯示的值</p><p>  when "0000" => led_out <= X"80"; --位置6,內(nèi)容8</p><p>  when "0001" => led_out <= X&quo

84、t;c0"; --位置5,內(nèi)容0</p><p>  when "0010" => led_out <= X"90"; --位置4,內(nèi)容9</p><p>  when "0011" => led_out <= X"f9"; --位置3,內(nèi)容1</p><

85、;p>  when "0100" => led_out <= X"c0"; --位置2,內(nèi)容0</p><p>  when "0101" => led_out <= X"c0"; --位置1,內(nèi)容0</p><p>  when others => led_out &

86、lt;= X"92"; --其他情況下,位置6,內(nèi)容5</p><p><b>  end case;</b></p><p>  led_sel_llb := led_sel_count + shift;</p><p>  if (led_sel_llb >= "0110") then<

87、/p><p>  led_sel_llb := led_sel_llb - "0110";</p><p><b>  end if;</b></p><p>  case led_sel_llb is --選擇要被點(diǎn)亮的數(shù)碼管</p><p>  when "0000" =>

88、 led_sel <= "000001"; --位置6</p><p>  when "0001" => led_sel <= "000010"; --位置5</p><p>  when "0010" => led_sel <= "000100"; --位置4

89、</p><p>  when "0011" => led_sel <= "001000"; --位置3</p><p>  when "0100" => led_sel <= "010000"; --位置2</p><p>  when "0101&q

90、uot; => led_sel <= "100000"; --位置1</p><p>  when others => led_sel <= "000001"; --其他情況下,位置6,內(nèi)容5</p><p><b>  end case;</b></p><p><b>

91、;  end if;</b></p><p>  end process; </p><p>  注: 該模塊中, led_sel用來表示選中的數(shù)碼管, led_out 表示輸出的數(shù)值。每一個(gè)clock過來,都會輸出一個(gè)數(shù),依次是0-0-1-9-0-8,而數(shù)字輸出在哪個(gè)數(shù)碼管是由相同時(shí)刻的led_sel決定的。由于時(shí)鐘頻率很高,雖然每個(gè)時(shí)鐘來臨時(shí)只有一個(gè)數(shù)碼管被點(diǎn)亮,但由

92、于視覺停留,所以可以達(dá)到每個(gè)數(shù)碼管都被點(diǎn)亮的效果。</p><p>  VHDL源程序如下:</p><p>  LIBRARY ieee ;</p><p>  USE ieee.std_logic_1164.all ;</p><p>  USE ieee.std_logic_unsigned.all ;</p><p

93、><b>  --顯示模塊</b></p><p>  ENTITY llb IS </p><p><b>  PORT ( </b></p><p>  clk : IN STD_LOGIC; </p><p>  led_out : OUT STD

94、_LOGIC_VECTOR(7 DOWNTO 0); --數(shù)碼管8段顯示,可顯示0~9,A~F</p><p>  led_sel : BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0); --選擇6個(gè)數(shù)碼管,‘1’表示點(diǎn)亮對應(yīng)數(shù)碼管</p><p>  output : OUT STD_LOGIC;</p><p>  inter

95、val : OUT STD_LOGIC_VECTOR(2 downto 0);</p><p>  column : IN STD_LOGIC_VECTOR(3 downto 0) --行列式鍵盤的4列</p><p><b>  ) ; </b></p><p><b>  END llb ;</

96、b></p><p>  ARCHITECTURE Behavior OF llb IS </p><p>  signal clk_temp : std_logic := '1'; --用作分頻后的電路時(shí)鐘</p><p>  signal led_sel_count : std_logi

97、c_vector(3 DOWNTO 0); --信號量,6個(gè)數(shù)碼管顯示的選擇</p><p>  signal div_cnt : std_logic_vector(1 downto 0); --行掃描驅(qū)動</p><p>  signal scan_key : std_logic_vector(3 DOWNTO 0);

98、 --掃描碼寄存器 </p><p>  signal key_code : std_logic_vector(1 DOWNTO 0); --存儲鍵值</p><p>  signal shift : std_logic_vector(2 DOWNTO 0):= "110"; --控制數(shù)碼管顯示的數(shù)據(jù)右移</p>

99、<p><b>  begin </b></p><p>  output <= clk_temp; </p><p>  interval <= shift;</p><p>  PROCESS(clk)--12分頻電路</p><p>  VARIABLE counter: std_logi

100、c_vector(2 downto 0);--計(jì)數(shù)寄存器,12分頻輸入時(shí)鐘為 1Hz</p><p>  BEGIN </p><p>  IF (clk'EVENT AND clk ='0') THEN --下降沿有效</p><p>  counter := counter + 1 ;</p><

101、;p>  IF (counter = 6) THEN </p><p>  clk_temp <= NOT clk_temp; --分頻后的時(shí)鐘變化 </p><p>  counter := "000";</p><p><b>  END IF;</b></p>&l

102、t;p><b>  END IF;</b></p><p>  END PROCESS;</p><p>  PROCESS(clk)--讀取行列式鍵盤的鍵值</p><p><b>  BEGIN</b></p><p>  IF(clk'EVENT AND clk = '0

103、')THEN</p><p>  CASE column IS</p><p>  WHEN "1110" =></p><p>  key_code <= "00"; </p><p>  WHEN "1101" =>&

104、lt;/p><p>  key_code <= "01"; </p><p>  WHEN "1011" =></p><p>  key_code <= "10";</p><p>  WHEN "0111" =></p>&l

105、t;p>  key_code <= "11";</p><p>  WHEN OTHERS => </p><p>  key_code <= "00";</p><p><b>  END CASE;</b></p><p><b>  END

106、IF;</b></p><p>  END PROCESS;</p><p>  process (clk_temp)</p><p>  VARIABLE time_count : std_logic_vector(1 DOWNTO 0); </p><p><b>  begin</b></p&

107、gt;<p>  if (clk_temp 'event and clk_temp = '0') then--下降沿有效</p><p>  time_count := time_count + 1;</p><p>  CASE key_code IS</p><p>  WHEN "00" =>

108、</p><p>  shift <= shift- 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <="110";</p><p>  end if; </p><p>  

109、WHEN "01" =></p><p>  if(time_count = "10") then </p><p>  time_count := "00" ;</p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(sh

110、ift = "000") then</p><p>  shift <="110";</p><p><b>  end if; </b></p><p>  end if; </p><p>  WHEN "10" =></p>

111、<p>  if(time_count = "11") then </p><p>  time_count := "00";</p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p>

112、;<p>  shift <="110";</p><p><b>  end if; </b></p><p>  end if; </p><p>  WHEN "11" =></p><p>  if(time_count = "

113、00") then </p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <="110";</p><p><b>  end if; </

114、b></p><p>  end if; </p><p>  WHEN OTHERS =></p><p>  shift <= shift - 1;--數(shù)據(jù)右移1位</p><p>  if(shift = "000") then</p><p>  shift <

115、="110";</p><p><b>  end if; </b></p><p><b>  END CASE;</b></p><p><b>  end if;</b></p><p>  end process; </p><

116、p>  PROCESS(clk)--行掃描驅(qū)動,產(chǎn)生行掃描的值</p><p>  BEGIN </p><p>  IF(clk'EVENT AND clk = '0')THEN</p><p>  div_cnt <= div_cnt + 1; </p><p><b>

117、;  END IF;</b></p><p>  END PROCESS;</p><p>  PROCESS(div_cnt)--產(chǎn)生行掃描的值用于一行一行的輪詢4行</p><p><b>  BEGIN</b></p><p>  CASE div_cnt IS</p><p>

118、  WHEN "00" => </p><p>  scan_key<="1110";</p><p>  WHEN "01" => </p><p>  scan_key<="1101";</p>

119、;<p>  WHEN "10" => </p><p>  scan_key<="1011";</p><p>  WHEN "11" => </p><p>  scan_key<="0111";</p><p>

120、  WHEN OTHERS => </p><p><b>  NULL;</b></p><p><b>  END CASE;</b></p><p>  END PROCESS;</p><p>  process (clk)--顯示學(xué)號001908</p><p&g

121、t;  VARIABLE led_sel_llb :std_logic_vector(3 DOWNTO 0); --信號量,6個(gè)數(shù)碼管顯示的選擇</p><p><b>  begin</b></p><p>  if (clk 'event and clk='0') then --時(shí)鐘下降沿有效</p><

122、p>  if (led_sel_count = "0000") then--輪詢6個(gè)數(shù)碼管</p><p>  led_sel_count <= "0101";</p><p><b>  else </b></p><p>  led_sel_count <= led_sel_

123、count - "0001";</p><p><b>  end if;</b></p><p>  --0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff</p><p>  -- 0, 1, 2, 3, 4, 5, 6, 7, 8

124、, 9, 空</p><p>  case led_sel_count is --選擇要要顯示的值</p><p>  when "0000" => led_out <= X"80"; --位置6,內(nèi)容8</p><p>  when "0001" => led_out &l

125、t;= X"c0"; --位置5,內(nèi)容0</p><p>  when "0010" => led_out <= X"90"; --位置4,內(nèi)容9</p><p>  when "0011" => led_out <= X"f9"; --位置3,內(nèi)容1</p

126、><p>  when "0100" => led_out <= X"c0"; --位置2,內(nèi)容0</p><p>  when "0101" => led_out <= X"c0"; --位置1,內(nèi)容0</p><p>  when others =>

127、led_out <= X"92"; --其他情況下,位置6,內(nèi)容5</p><p><b>  end case;</b></p><p>  led_sel_llb := led_sel_count + shift;</p><p>  if (led_sel_llb >= "0110")

128、then</p><p>  led_sel_llb := led_sel_llb - "0110";</p><p><b>  end if;</b></p><p>  case led_sel_llb is --選擇要被點(diǎn)亮的數(shù)碼管</p><p>  when "0000&qu

129、ot; => led_sel <= "000001"; --位置6</p><p>  when "0001" => led_sel <= "000010"; --位置5</p><p>  when "0010" => led_sel <= "000100&quo

130、t;; --位置4</p><p>  when "0011" => led_sel <= "001000"; --位置3</p><p>  when "0100" => led_sel <= "010000"; --位置2</p><p>  when &qu

131、ot;0101" => led_sel <= "100000"; --位置1</p><p>  when others => led_sel <= "000001"; --其他情況下,位置6,內(nèi)容5</p><p><b>  end case;</b></p><p>

132、;<b>  end if;</b></p><p>  end process; </p><p>  end Behavior;</p><p><b>  4.仿真波形及分析</b></p><p><b>  學(xué)號右移功能:</b></p>&l

133、t;p>  11000000表示學(xué)號0 11111001表示學(xué)號1 10010000表示學(xué)號9</p><p>  10000000表示學(xué)號8</p><p>  100000表示左第一位數(shù)碼管亮,010000表示第二位,以此類推。</p><p>  初始狀態(tài),數(shù)碼管顯示學(xué)號0 0 1 9 0 8</p><p>  右移一位

134、,8 0 0 1 9 0</p><p>  右移兩位,0 8 0 0 1 9</p><p>  右移三位,9 0 8 0 0 1</p><p>  右移四位,1 9 0 8 0 0</p><p>  右移五位,0 1 9 0 8 0</p><p><b>  以上為一次循環(huán)。</b>&l

135、t;/p><p><b>  循環(huán)間隔控制功能</b></p><p>  顯示間隔的控制由column決定,1110表示循環(huán)間隔為1秒,1101表示循環(huán)間隔為2秒,1011表示循環(huán)間隔為3秒,0111表示循環(huán)間隔為4秒。</p><p><b>  間隔一秒情況:</b></p><p><b&

136、gt;  間隔兩秒情況:</b></p><p><b>  間隔三秒情況:</b></p><p><b>  間隔四秒情況:</b></p><p><b>  5.實(shí)驗(yàn)總結(jié)與體會</b></p><p>  本題為提高題第四題,整體功能和各模塊的功能分析方面都

137、比基礎(chǔ)題要更為復(fù)雜,但由于與前一題同樣是使用數(shù)碼管掃描顯示的設(shè)計(jì)方法,使的一些模塊的設(shè)計(jì)方面可以很好地簡化,雖然其中也有很多錯(cuò)誤與缺陷, 在學(xué)號的右移時(shí)也有一些問題,調(diào)試時(shí)問題更是不斷,仿真波形也與課題要求有所差異,但最終還是達(dá)到了預(yù)期效果。</p><p>  通過實(shí)驗(yàn),我們加深了對VHDL語言的認(rèn)識和運(yùn)用,對EDA的硬件應(yīng)用方面也不僅僅是表面淺顯的了解。不但學(xué)會了設(shè)計(jì)程序的方法,更重要的是學(xué)會了將一個(gè)課題進(jìn)行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論