久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3999|回復: 0
打印 上一主題 下一主題
收起左側

EDA quartusII的數字式搶答器vhdl源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:423224 發表于 2019-12-12 08:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  • 設計一個數字式競賽搶答器,可以判斷第一輪搶答者,并具備計分功能。
  • 搶答器可以容納4組參賽者同時搶答,每組設置1個按鈕供搶答者使用。設置搶答器使能信號,當此信號有效時,若參賽者按下搶答開關,則搶答器能判斷出第一搶答者并指示該組搶答成功,其他組參賽者的搶答者的搶答開關不起作用。若提前搶答,則對相應的參賽者發出報警。
  • 系統具有清零功能。當清零復位信號有效時,搶答器對前一輪搶答的第一搶答者判斷結果進行清零,恢復為初始狀態。
  • 數字式競賽搶答器還具有計分功能。如果搶答成功的參賽者滿足得分條件,則增加相應的分數,答錯不扣分。
(二)系統設計方案
根據系統設計要求可知,系統由4個主要的電路模塊組成,分別是第一判斷電路、計分電路、20s倒計時電路和顯示電路。
其中,第一判斷電路主要完成最快搶答者的判斷功能;計分電路存儲每組競賽者的分數;顯示電路則顯示搶答器的狀態和各組的分數。因此,數字式競賽搶答器的輸入信號包括復位信號CLR、搶答器使能信號EN_KEY_IN、4組參賽者的搶答按鈕A_1/B_2/C_3/D_4以及加分信號ADD_1,加5分使能信號ADD_5_EN;輸出信號包括4組參賽者搶答狀態的顯示LEDx(x表示參賽者編號)及其對應的得分SCOREX、搶答器搶答成功的組別顯示,最先搶答組顯示FIRST[3..0],提前搶答組顯示FALSE[3..0],輪流輸出各組號以及分數OUT_1,OUT_2,OUT_3等。系統框圖如圖所示:

1.              搶答器的工作流程如下:
如果參賽者在搶答器使能信號EN有效前按下搶答按鈕,報警信號FALSE[3..0]的對應位輸出高電平,以示警告;當EN信號有效時,搶答器開始工作,將報警信號FALSE清零,A、B、C、D,4個搶答者誰先按下搶答按鈕,則搶答成功,對應的顯示燈LEDx亮起,并通過顯示電路模塊顯示其參賽編FIRST[3..0];搶答成功的選手進入答題階段,如正確回答問題,則加分信號ADD有效,計分模塊給相應的參賽組加分,每個參賽組得分的個位、十位、百位分別通過信號OUT_BCD1[3..0]、OUT_BCD2[3..0]、OUT_BCD3[3..0]、顯示。
如果復位信號CLR有效,使得搶答器在下一輪搶答前,其搶答成功的組別判斷恢復為始狀態,以便重新開始新一輪搶答。復位信號不改變競賽者的現有得分。
2.流程圖:
(三)主要模塊設計1.0                            第一判斷電路
第一判斷電路模塊具有第一搶答信號的鑒別和鎖存功能,其電路框圖如圖所示。
其中,CLR為復位信號,當該信號高電平有效時,電路無論處于何種狀態都恢復為初始狀態即所有的輸出信號都為0;EN為搶答使能信號,該信號高電平有效;A、B、C、D為搶答按鈕,高電平有效。
當使能信號EN為低電平時,如果有參賽者按下搶答按鈕,則提前搶答報警信號FALSE[3.0]的對應位輸出高電平,以示警告;當使能信號EN為高電平時,首先將提前搶答報警信號FALSE [3.0]復位清零,然后根據選手按下搶答按鈕A、B、C、D的先后順廳選擇最先搶答的信號,其對應的搶答狀態顯示信號LEDA~LEDD輸出高電平,搶答成功組別編號由信號Q[3..0]輸出,并鎖存搶答器此時的 狀態,直到清零信號有效為止。在每一輪新的搶答之前,都要使用復位清零信號CLR,清除上一輪搶答對判斷電路留下的使用痕跡,使電路恢復初始狀態。

1.1             第一判斷電路波形仿真圖

2.0                            計分電路
計分電路在參賽者搶答成功后,根據其比賽情況進行比較分數的調整,其電路框圖如右圖所示。該模塊輸入信號為加分信號ADD_1和組別選擇信號CHOS[3.0]。
其中加分信號ADD_1高電平有效,有效時對組別選擇信號CHOS[3..0]選擇的參數組進行加分;組別選擇輸入信號CHOS[3..0]即第一判斷電路模塊的輸出信號Q [3.0]。輸出信號分別對應4組競賽者的得分,以百分制表示。每組分數在比賽開始時預設為100分,每答對1題(即加分選擇信號對相應參賽組有效)加1分,答錯不扣分。得分的各位、十位、百位表示為寬為4的邏輯矢量,使之方便與顯示電路級聯,從而輸出比賽得分。
當加5分使能信號ADD_5_EN為高電平時ADD每按一次加5分

2.1                            計分電路波形仿真圖

3.0                            倒計時電路
倒計時電路用來記錄正常搶答開始后的時間,定時為20秒,在20秒內搶答有效,否則該題作廢。其電路圖如右圖:

其中,CLK_1Hz是時鐘信號,頻率為1Hz,用來計時,間隔為1秒;EN_IN是使能信號,高電平有效開始倒計時,ENDTIME輸出信號,用來提示時間到,連接LED燈,當時間為0時輸出高電平,led燈點亮。SEC_SHI[3..0]、SEC_GE[3..0]分別是倒計時的十位和各位,連接帶譯碼器的數碼管,用來顯示倒計時的時間。

3.1                            倒計時電路波形仿真圖

4.0                            顯示電路
顯示電路用來輪流顯示各組的得分情況。由于實驗箱數碼管有限,所以采用了數碼管分時復用的方法來顯示各組的得分情況。其電路框圖如右圖:

顯示電路中A2[3..0]、A1[3..0]、A0[3..0];B2[3..0]、B1[3..0]、B0[3..0];C2[3..0]、C1[3..0]、C0[3..0]。是各組分數的百位、十位、以及各位。OUT_BCD1[3..0]、OUT_BCD2[3..0]、OUT_BCD3[3..0]用來輸出至帶有譯碼器的數碼管,用于分時顯示各組號以及對應的分數。CLK_1Hz是輸入的時鐘信號,頻率為1Hz,用來間隔1秒輪流顯示。
其分時顯示流程如下:
4.1                            顯示電路波形仿真

4.2顯示電路分時顯示各組分數流程圖:

(四)系統整體原理圖
上述VHDL源程序構成了一個具有搶答、計分、倒計時警報功能的數字系統,通過仿真生成的RTL電路如圖所示:

圖中,輸出FALSE[3..0]、GE[3..0] 、SHI[3..0]、BAI[3..0] 、FIRST[3..0]、SMG_GE[3..0] 、SMG_SHI[3..0]還需要通過LED共陰極譯碼器譯碼顯示為十進制數,譯碼顯示電路部分在此略過。值得注意的是第一搶答判斷電路模塊的輸出信號Q[3..0],它既是整個數字式搶答器輸出的一部分,顯示搶答成功的選手編號,又作為計分模塊的輸入信號,以它為依據對相應的選手進行加分操作。

(五)系統波形仿真
第一搶答判斷模塊的仿真波形如下圖所示。從圖中可以看出,當清零復位信號CLR高電平有效時,電路狀態立刻被恢復為全0的初始狀態。在搶答使能信號無效時搶答,輸出警告信號,提前搶答者對應的組號會用數碼管輸出,以示警告。
當搶答使能信號高電平有效時,最先搶答的選手對應的顯示燈LEDx亮起,Q[3..0]輸出搶答成功的選手編號。仿真結果與系統設計要求的功能相吻合。
輸入信號CHOS[3.0]以十進制的形式表示,1,2,3,4,8分別代表選擇AB、C、D4組選手在加分信號ADD_1的上升沿對選中的參賽者進行加分,從高至低依次為百位、十位、個位。
1






(七)模式選擇
根據實際情況,應選擇:模式5.
選擇理由:模式5帶有譯碼器芯片,可以減少譯碼電路。帶有對應的led燈以及數碼管,便于顯示對應的組號。同時模式5有8個鍵控高低電平發生器,可以滿足搶答器電路的需求。
(八)引腳綁定
(九)試驗箱測試圖
【1】開始搶答。
【2】3號組搶答成功。
【3】進行加分,加5分。
【4】清零,準備下一次搶答。

(十)總結:
于個人,通過這次設計,我進一步加深了對電子設計的了解。并進一步熟練了對QuartusII軟件的操作,基本掌握了VHDL這門硬件編程語言。EDA也不像學習理論般那么空洞,有了更加貼切的了解及運用。做設計時,先查閱相關知識,把原理吃透,確定一個大的設計方向,在按照這個方向分模塊的把要實現的功能用流程圖的形式展示。最后參照每個模塊把輸入和輸出引腳設定,運用我們所學的VHDL語言進行編程?傊,通過這次的設計,進一步了解了EDA技術,收獲很大,對軟件編程、排錯調試、相關儀器設備的使用技能等方面得到較全面的鍛煉和提高

  1. 程序:
  2. --頂層模塊的VHDL   
  3. LIBRARY IEEE;
  4. USE IEEE.STD_LOGIC_1164.ALL;
  5. ENTITY TOP_ENTITY IS
  6.         PORT
  7.         (
  8.                 CLK_IN_1Hz:IN STD_LOGIC;
  9.                 CLR:IN STD_LOGIC;                                                                        --清零信號   
  10.                 EN_KEY_IN:IN STD_LOGIC;                                                                --搶答開始信號      高電平有效      
  11.                 A_1,B_2,C_3,D_4:IN STD_LOGIC;
  12.                 ADD_1:IN STD_LOGIC;                                                                        --加分信號   
  13.                 LEDA,LEDB,LEDC,LEDD,LED_ENDTIME:OUT STD_LOGIC;
  14.                 SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  15.                 SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  16.                 FIRST:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  17.                 FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  18.                 OUT_1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                                --顯示個位    十位     百位                                 
  19.                 OUT_2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  20.                 OUT_3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
  21.         );
  22. END ENTITY TOP_ENTITY;
  23. ARCHITECTURE RTL OF TOP_ENTITY IS
  24. COMPONENT OPT IS
  25.         PORT (
  26.                         CLR:IN STD_LOGIC;                                                                --復位信號   
  27.                         EN :IN STD_LOGIC;                                                                --搶答使能信號      
  28.                         A,B,C,D:IN STD_LOGIC;                                                        --搶答按鈕   
  29.                         LEDA:OUT STD_LOGIC;
  30.                         LEDB:OUT STD_LOGIC;
  31.                         LEDC:OUT STD_LOGIC;
  32.                         LEDD:OUT STD_LOGIC;
  33.                         FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --提前搶答警報   
  34.                         Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)                                --搶答成功組顯示      
  35.                   );
  36. END COMPONENT OPT;
  37. COMPONENT COUNTER IS
  38.         PORT
  39.         (
  40.                 ADD_1:IN STD_LOGIC;                                                                        --加分信號  
  41.                 CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);                                --參賽組選擇信號   
  42.                 A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --各組計分信號   
  43.                 B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  44.                 C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  45.                 D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)        
  46.         );
  47. END COMPONENT COUNTER;
  48. COMPONENT OUTPUT IS                                                                                        --提前搶答警告   
  49.         PORT
  50.         (
  51.                 DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  52.                 DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
  53.         );
  54. END COMPONENT OUTPUT;
  55. COMPONENT endtime_20 IS
  56.         PORT
  57.         (
  58.                 CLK_1Hz :IN STD_LOGIC;                                                                --時鐘信號         
  59.                 EN_in  :IN STD_LOGIC;                                                                --使能          計時開始  
  60.                 SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --秒各位        BCD    4位2進制輸出      
  61.                 SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                --秒百位        BCD    4位2進制輸出  
  62.                 ENDTIME:OUT STD_LOGIC                                                                 --時間到警報   接蜂鳴器   
  63.         );
  64. END COMPONENT endtime_20;
  65. COMPONENT DISPLAY IS
  66.         PORT
  67.         (
  68.                 CLK_1Hz:IN STD_LOGIC;
  69.                 A2,A1,A0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);                        --各組計分信號   
  70.                 B2,B1,B0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  71.                 C2,C1,C0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  72.                 D2,D1,D0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);               
  73.                 OUT_BCD1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --輸出個十百位      
  74.                 OUT_BCD2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  75.                 OUT_BCD3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
  76.         );
  77. END COMPONENT DISPLAY;
  78. SIGNAL Q:STD_LOGIC_VECTOR(3 DOWNTO 0);
  79. SIGNAL AA2,AA1,AA0:STD_LOGIC_VECTOR(3 DOWNTO 0);
  80. SIGNAL BB2,BB1,BB0:STD_LOGIC_VECTOR(3 DOWNTO 0);
  81. SIGNAL CC2,CC1,CC0:STD_LOGIC_VECTOR(3 DOWNTO 0);
  82. SIGNAL DD2,DD1,DD0:STD_LOGIC_VECTOR(3 DOWNTO 0);
  83. BEGIN
  84.         U1:OPT                 PORT MAP(CLR,EN_KEY_IN,A_1,B_2,C_3,D_4,LEDA,LEDB,LEDC,LEDD,FALSE,Q);
  85.         U2:COUNTER         PORT MAP(ADD_1,Q,AA2,AA1,AA0,BB2,BB1,BB0,CC2,CC1,CC0,DD2,DD1,DD0);
  86.         U3:OUTPUT   PORT MAP(Q,FIRST);
  87.         U4:DISPLAY PORT MAP(CLK_IN_1Hz,AA2,AA1,AA0,BB2,BB1,BB0,CC2,CC1,CC0,DD2,DD1,DD0,OUT_1,OUT_2,OUT_3);
  88.         U5:endtime_20 PORT MAP(CLK_IN_1Hz,EN_KEY_IN,SEC_SHI,SEC_GE,LED_ENDTIME);
  89. END ARCHITECTURE RTL;
  90. --第一搶答判斷  電路   的VHDL程序   
  91. LIBRARY IEEE;
  92. USE IEEE.STD_LOGIC_1164.ALL;
  93. ENTITY OPT IS
  94.         PORT (
  95.                         CLR:IN STD_LOGIC;                                                                --復位信號   
  96.                         EN :IN STD_LOGIC;                                                                --搶答使能信號      
  97.                         A,B,C,D:IN STD_LOGIC;                                                        --搶答按鈕   
  98.                         LEDA:OUT STD_LOGIC:='0';                                                --搶答成功   對應組的led燈點亮      
  99.                         LEDB:OUT STD_LOGIC:='0';
  100.                         LEDC:OUT STD_LOGIC:='0';
  101.                         LEDD:OUT STD_LOGIC:='0';
  102.                         FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --提前搶答警報   
  103.                         Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)                                --搶答成功組顯示      
  104.                   );
  105. END ENTITY OPT;
  106. ARCHITECTURE RTL OF OPT IS
  107.         SIGNAL TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);                        
  108.         SIGNAL TAG:STD_LOGIC;                                                               
  109. BEGIN
  110.         TMP<=A&B&C&D;
  111.         PROCESS(CLR,EN,A,B,C,D,TMP,TAG)
  112.         BEGIN                                                                                                        --設置鎖存標志位     
  113.                 IF CLR='1' THEN
  114.                         Q<="0000";
  115.                         LEDA<='0';
  116.                         LEDB<='0';
  117.                         LEDC<='0';
  118.                         LEDD<='0';
  119.                         FALSE<="0000";
  120.                         TAG<='0';
  121.                 ELSIF EN='0'        THEN
  122.                         IF TAG='0'        THEN
  123.                                 IF A='1'        THEN
  124.                                         FALSE(0)<='1';
  125.                                 END IF;
  126.                                 IF B='1'        THEN
  127.                                         FALSE(1)<='1';
  128.                                 END IF;
  129.                                 IF C='1'        THEN
  130.                                         FALSE(2)<='1';
  131.                                 END IF;        
  132.                                 IF D='1'        THEN
  133.                                         FALSE(3)<='1';
  134.                                 END IF;
  135.                         END IF;        
  136.                 ELSE
  137.                         FALSE<="0000";
  138.                         IF TAG='0'        THEN
  139.                                 IF        TMP="1000"        THEN
  140.                                         LEDA<='1';               
  141.                                         LEDB<='0';               
  142.                                         LEDC<='0';                                
  143.                                         LEDD<='0';        
  144.                                         Q<="0001";
  145.                                         TAG<='1';
  146.                                 ELSIF TMP="0100"THEN        
  147.                                         LEDA<='0';               
  148.                                         LEDB<='1';               
  149.                                         LEDC<='0';                                
  150.                                         LEDD<='0';        
  151.                                         Q<="0010";
  152.                                         TAG<='1';
  153.                                 ELSIF TMP="0010"THEN        
  154.                                         LEDA<='0';               
  155.                                         LEDB<='0';               
  156.                                         LEDC<='1';                                
  157.                                         LEDD<='0';        
  158.                                         Q<="0011";
  159.                                         TAG<='1';
  160.                                 ELSIF TMP="0001"THEN        
  161.                                         LEDA<='0';               
  162.                                         LEDB<='0';               
  163.                                         LEDC<='0';                                
  164.                                         LEDD<='1';        
  165.                                         Q<="0100";
  166.                                         TAG<='1';
  167.                                 ELSE
  168.                                         LEDA<='Z';
  169.                                         LEDB<='Z';
  170.                                         LEDC<='Z';
  171.                                         LEDD<='Z';
  172.                                         Q<="ZZZZ";
  173.                                 END IF;
  174.                         END IF;
  175.                 END IF;
  176.         END PROCESS;
  177. END RTL;
  178.                                        
  179. --計分電路的VHDL程序  ADD_1                                ADD_5        
  180. LIBRARY IEEE;
  181. USE IEEE.STD_LOGIC_1164.ALL;
  182. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  183. USE IEEE.STD_LOGIC_ARITH.ALL;
  184. ENTITY ADD_1_5 IS
  185.         PORT
  186.         (
  187.                 ADD_5_EN,ADD:IN STD_LOGIC;                                                                                        --加分信號  
  188.                 CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);                                                                        --參賽組選擇信號   
  189.                 A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";                                                --各組計分信號   
  190.                 B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  191.                 C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  192.                 D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"        
  193.         );
  194. END ENTITY ADD_1_5;
  195. ARCHITECTURE RTL OF ADD_1_5 IS
  196. BEGIN
  197.         PROCESS(ADD,ADD_5_EN,CHOS)
  198.         VARIABLE POINTS_A2,POINTS_A1,POINTS_A0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  199.         VARIABLE POINTS_B2,POINTS_B1,POINTS_B0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  200.         VARIABLE POINTS_C2,POINTS_C1,POINTS_C0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  201.         VARIABLE POINTS_D2,POINTS_D1,POINTS_D0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
  202.         BEGIN
  203.                 IF ADD_5_EN='1'                THEN
  204.                 IF ADD='1'        AND ADD'EVENT        THEN
  205.                         CASE CHOS IS               
  206.                         WHEN "0001" =>                FOR I IN 0 TO 4 LOOP        
  207.                                                                         IF POINTS_A0="1001"        THEN
  208.                                                                                 POINTS_A0:="0000";     
  209.                                                                                 IF POINTS_A1="1001"         THEN
  210.                                                                                         POINTS_A1:="0000";
  211.                                                                                         IF POINTS_A2="1001"        THEN                                --十位分9      
  212.                                                                                                 POINTS_A2:="0000";                                        --十位清零      
  213.                                                                                         ELSE
  214.                                                                                                 POINTS_A2:=POINTS_A2+'1';
  215.                                                                                         END IF;
  216.                                                                                 ELSE
  217.                                                                                         POINTS_A1:=POINTS_A1+'1';
  218.                                                                                 END IF;
  219.                                                                         ELSE
  220.                                                                                 POINTS_A0:=POINTS_A0+'1';
  221.                                                                         END IF;        
  222.                                                                 END LOOP;
  223.                         WHEN "0010" =>                FOR I IN 0 TO 4 LOOP        
  224.                                                                         IF POINTS_B0="1001"        THEN
  225.                                                                                 POINTS_B0:="0000";     
  226.                                                                                 IF POINTS_B1="1001"         THEN
  227.                                                                                         POINTS_B1:="0000";
  228.                                                                                         IF POINTS_B2="1001"        THEN                                --十位分9      
  229.                                                                                                 POINTS_B2:="0000";                                        --十位清零      
  230.                                                                                         ELSE
  231.                                                                                                 POINTS_B2:=POINTS_B2+'1';
  232.                                                                                         END IF;
  233.                                                                                 ELSE
  234.                                                                                         POINTS_B1:=POINTS_B1+'1';
  235.                                                                                 END IF;
  236.                                                                         ELSE
  237.                                                                                 POINTS_B0:=POINTS_B0+'1';
  238.                                                                         END IF;        
  239.                                                                 END LOOP;
  240.                         WHEN "0011" =>                FOR I IN 0 TO 4 LOOP        
  241.                                                                         IF POINTS_C0="1001"        THEN
  242.                                                                                 POINTS_C0:="0000";     
  243.                                                                                 IF POINTS_C1="1001"         THEN
  244.                                                                                         POINTS_C1:="0000";
  245.                                                                                         IF POINTS_C2="1001"        THEN                                --十位分9      
  246.                                                                                                 POINTS_C2:="0000";                                        --十位清零      
  247.                                                                                         ELSE
  248.                                                                                                 POINTS_C2:=POINTS_C2+'1';
  249.                                                                                         END IF;
  250.                                                                                 ELSE
  251.                                                                                         POINTS_C1:=POINTS_C1+'1';
  252.                                                                                 END IF;
  253.                                                                         ELSE
  254.                                                                                 POINTS_C0:=POINTS_C0+'1';
  255.                                                                         END IF;        
  256.                                                                 END LOOP;
  257.                         WHEN "0100" =>                FOR I IN 0 TO 4 LOOP        
  258.                                                                         IF POINTS_D0="1001"        THEN
  259.                                                                                 POINTS_D0:="0000";     
  260.                                                                                 IF POINTS_D1="1001"         THEN
  261.                                                                                         POINTS_D1:="0000";
  262.                                                                                         IF POINTS_D2="1001"        THEN                                --十位分9      
  263.                                                                                                 POINTS_D2:="0000";                                        --十位清零      
  264.                                                                                         ELSE
  265.                                                                                                 POINTS_D2:=POINTS_D2+'1';
  266.                                                                                         END IF;
  267.                                                                                 ELSE
  268.                                                                                         POINTS_D1:=POINTS_D1+'1';
  269.                                                                                 END IF;
  270.                                                                         ELSE
  271.                                                                                 POINTS_D0:=POINTS_D0+'1';
  272.                                                                         END IF;        
  273.                                                                 END LOOP;
  274.                         WHEN OTHERS =>  NULL;
  275.                         END CASE;
  276.                 END IF;
  277.         ELSE
  278.                         IF ADD='1'        AND ADD'EVENT        THEN
  279.                         CASE CHOS IS               
  280.                         WHEN "0001" =>                IF POINTS_A0="1001"        THEN
  281.                                                                                 POINTS_A0:="0000";     
  282.                                                                                 IF POINTS_A1="1001"         THEN
  283.                                                                                         POINTS_A1:="0000";
  284.                                                                                         IF POINTS_A2="1001"        THEN                                --十位分9      
  285.                                                                                                 POINTS_A2:="0000";                                        --十位清零      
  286.                                                                                         ELSE
  287.                                                                                                 POINTS_A2:=POINTS_A2+'1';
  288.                                                                                         END IF;
  289.                                                                                 ELSE
  290.                                                                                         POINTS_A1:=POINTS_A1+'1';
  291.                                                                                 END IF;
  292.                                                                         ELSE
  293.                                                                                 POINTS_A0:=POINTS_A0+'1';
  294.                                                                 END IF;        
  295.                         WHEN "0010" =>                IF POINTS_B0="1001"        THEN
  296.                                                                                 POINTS_B0:="0000";     
  297.                                                                                 IF POINTS_B1="1001"         THEN
  298.                                                                                         POINTS_B1:="0000";
  299.                                                                                         IF POINTS_B2="1001"        THEN                                --十位分9      
  300.                                                                                                 POINTS_B2:="0000";                                        --十位清零      
  301.                                                                                         ELSE
  302.                                                                                                 POINTS_B2:=POINTS_B2+'1';
  303.                                                                                         END IF;
  304.                                                                                 ELSE
  305.                                                                                         POINTS_B1:=POINTS_B1+'1';
  306.                                                                                 END IF;
  307.                                                                         ELSE
  308.                                                                                 POINTS_B0:=POINTS_B0+'1';
  309.                                                                         END IF;        
  310.                         WHEN "0011" =>                IF POINTS_C0="1001"        THEN
  311.                                                                                 POINTS_C0:="0000";     
  312.                                                                                 IF POINTS_C1="1001"         THEN
  313.                                                                                         POINTS_C1:="0000";
  314.                                                                                         IF POINTS_C2="1001"        THEN                                --十位分9      
  315.                                                                                                 POINTS_C2:="0000";                                        --十位清零      
  316.                                                                                         ELSE
  317.                                                                                                 POINTS_C2:=POINTS_C2+'1';
  318.                                                                                         END IF;
  319.                                                                                 ELSE
  320.                                                                                         POINTS_C1:=POINTS_C1+'1';
  321.                                                                                 END IF;
  322.                                                                         ELSE
  323.                                                                                 POINTS_C0:=POINTS_C0+'1';
  324.                                                                 END IF;        
  325.                         WHEN "0100" =>                IF POINTS_D0="1001"        THEN
  326.                                                                                 POINTS_D0:="0000";     
  327.                                                                                 IF POINTS_D1="1001"         THEN
  328.                                                                                         POINTS_D1:="0000";
  329.                                                                                         IF POINTS_D2="1001"        THEN                                --十位分9      
  330.                                                                                                 POINTS_D2:="0000";                                        --十位清零      
  331.                                                                                         ELSE
  332.                                                                                                 POINTS_D2:=POINTS_D2+'1';
  333.                                                                                         END IF;
  334.                                                                                 ELSE
  335.                                                                                         POINTS_D1:=POINTS_D1+'1';
  336.                                                                                 END IF;
  337.                                                                         ELSE
  338.                                                                                 POINTS_D0:=POINTS_D0+'1';
  339.                                                                 END IF;        
  340.                         WHEN OTHERS =>  NULL;
  341.                         END CASE;
  342.                 END IF;
  343.         END IF;
  344.         A2<=POINTS_A2;A1<=POINTS_A1;A0<=POINTS_A0;
  345.         B2<=POINTS_B2;B1<=POINTS_B1;B0<=POINTS_B0;
  346.         C2<=POINTS_C2;C1<=POINTS_C1;C0<=POINTS_C0;
  347.         D2<=POINTS_D2;D1<=POINTS_D1;D0<=POINTS_D0;
  348.         END PROCESS;
  349. END RTL;
  350. --顯示提前搶答組電路的VHDL程序     
  351. LIBRARY IEEE;
  352. USE IEEE.STD_LOGIC_1164.ALL;
  353. ENTITY OUTPUT IS
  354.         PORT
  355.         (
  356.                 DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);                --輸入提前搶答的組號     
  357.                 DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)                --輸出提前搶答的組號      
  358.         );
  359. END ENTITY OUTPUT;
  360. ARCHITECTURE RTL OF OUTPUT IS
  361. BEGIN
  362.         PROCESS(DIN)
  363.         BEGIN
  364.                 CASE DIN IS
  365.                         WHEN"0001"=>DOUT<="0001";
  366.                         WHEN"0010"=>DOUT<="0010";
  367.                         WHEN"0011"=>DOUT<="0011";
  368.                         WHEN"0100"=>DOUT<="0100";
  369.                         WHEN OTHERS=>DOUT<="0000";
  370.                 END CASE;
  371.         END PROCESS;
  372. END RTL;
  373. --動態各組分數顯示    輪流顯示   
  374. LIBRARY IEEE;
  375. USE IEEE.STD_LOGIC_1164.ALL;
  376. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  377. ENTITY DISPLAY IS
  378.         PORT
  379.         (
  380.                 CLK_1Hz:IN STD_LOGIC;               
  381.                 A2,A1,A0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);                        --各組計分信號   
  382.                 B2,B1,B0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  383.                 C2,C1,C0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  384.                 D2,D1,D0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
  385.                
  386.                 OUT_BCD1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --輸出個十百位      
  387.                 OUT_BCD2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  388.                 OUT_BCD3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)        
  389.         );
  390. END ENTITY DISPLAY;
  391. ARCHITECTURE BEHAVE OF DISPLAY IS
  392. SIGNAL FILG:STD_LOGIC_VECTOR(2 DOWNTO 0):="000";
  393. BEGIN
  394.         PROCESS(CLK_1Hz,FILG)
  395.                 BEGIN
  396.                         IF CLK_1Hz'EVENT AND CLK_1Hz='1'        THEN
  397.                                 FILG<=FILG+'1';
  398.                         END IF;
  399.                         
  400.                         CASE FILG IS                                                                        --動態循環顯示     
  401.                         WHEN "000" =>        OUT_BCD1<="0001";                                --第一輪顯示組號                                                                                 
  402.                         WHEN "001" =>        OUT_BCD1<=A0;                                        --第二輪顯示分數      
  403.                                                         OUT_BCD2<=A1;
  404.                                                         OUT_BCD3<=A2;                                            
  405.                                 
  406.                         WHEN "010" =>        OUT_BCD1<="0010";
  407.                         WHEN "011" =>        OUT_BCD1<=B0;
  408.                                                         OUT_BCD2<=B1;
  409.                                                         OUT_BCD3<=B2;
  410.                         
  411.                         WHEN "100" =>        OUT_BCD1<="0011";
  412.                         WHEN "101" =>        OUT_BCD1<=C0;
  413.                                                         OUT_BCD2<=C1;
  414.                                                         OUT_BCD3<=C2;
  415.                         
  416.                         WHEN "110" =>        OUT_BCD1<="0100";        
  417.                         WHEN "111" =>        OUT_BCD1<=D0;
  418.                                                         OUT_BCD2<=D1;
  419.                                                         OUT_BCD3<=D2;                                
  420.                         END CASE;        
  421.         END PROCESS;
  422. END ARCHITECTURE BEHAVE;
  423.                
  424. --20秒倒計時    顯示   
  425. LIBRARY IEEE;
  426. USE IEEE.STD_LOGIC_1164.ALL;
  427. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  428. USE IEEE.STD_LOGIC_ARITH.ALL;
  429. ENTITY endtime_20 IS
  430.         PORT
  431.         (
  432.                 CLK_1Hz :IN STD_LOGIC;                                                                --時鐘信號         
  433.                 EN_IN  :IN STD_LOGIC;                                                                --使能          計時開始  
  434.                 SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                        --秒各位        BCD    4位2進制輸出      
  435.                 SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);                  --秒百位        BCD    4位2進制輸出  
  436.                 ENDTIME:OUT STD_LOGIC                                                                  --時間到警報   接蜂鳴器   
  437.         );
  438. END ENTITY endtime_20 ;
  439. ARCHITECTURE BEHAVE OF endtime_20 IS
  440.         SIGNAL CONTER_20:STD_LOGIC_VECTOR(4 DOWNTO 0):="00000";
  441. BEGIN
  442.         PROCESS(CLK_1Hz,EN_IN)
  443.                 BEGIN        
  444.                         IF EN_IN='1' THEN
  445.                                 IF CLK_1Hz='1' AND CLK_1Hz'EVENT         THEN
  446.                                         CASE CONTER_20        IS
  447.                                         WHEN "00000" =>SEC_SHI<="0010";  --20
  448.                                                                    SEC_GE<="0000";
  449.                                                                    CONTER_20<=CONTER_20+'1';
  450.                                                                
  451.                                                                    ENDTIME<='0';
  452.                                         WHEN "00001" =>SEC_GE<="1001";--19
  453.                                                                    SEC_SHI<="0001";
  454.                                                                    CONTER_20<=CONTER_20+'1';
  455.                                                                
  456.                                         WHEN "00010" =>SEC_GE<="1000";--18
  457.                                                                    SEC_SHI<="0001";
  458.                                                                    CONTER_20<=CONTER_20+'1';
  459.                                                                
  460.                                         WHEN "00011" =>SEC_GE<="0111";--17
  461.                                                                    SEC_SHI<="0001";
  462.                                                                    CONTER_20<=CONTER_20+'1';
  463.                                                                
  464.                                         WHEN "00100" =>SEC_GE<="0110";--16
  465.                                                                    SEC_SHI<="0001";
  466.                                                                    CONTER_20<=CONTER_20+'1';
  467.                                                                
  468.                                         WHEN "00101" =>SEC_GE<="0101";--15
  469.                                                                    SEC_SHI<="0001";
  470.                                                                    CONTER_20<=CONTER_20+'1';
  471.                                                                
  472.                                         WHEN "00110" =>SEC_GE<="0100";--14
  473.                                                                    SEC_SHI<="0001";
  474.                                                                    CONTER_20<=CONTER_20+'1';
  475. ……………………
  476. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
END_DESITN_SECOND.rar (3.36 MB, 下載次數: 54)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久网一区二区三区 | 久久机热 | 日本精品一区 | 在线观看成人小视频 | 精品国产一区二区三区久久久久久 | 91av导航 | 国产精品免费大片 | 亚洲综合色站 | 精品毛片视频 | 在线观看黄色电影 | 国产精品一级 | 国产免费a视频 | 男人天堂网址 | 国产毛片av| 精品久久中文 | www..com18午夜观看 | 国产熟熟| 欧美久久久 | 81精品国产乱码久久久久久 | 国产视频一区在线 | 日韩电影中文字幕在线观看 | 亚洲一区二区三区免费在线 | 黑人一级黄色大片 | 福利片在线| 手机看片169 | 国产精品久久久久久久久久久久久久 | 成人高清在线 | 2018国产精品 | 综合久久国产 | 欧美日韩在线电影 | www.中文字幕| 国产精品久久久久久久7电影 | 精品亚洲永久免费精品 | 亚洲国产精品视频 | 国产一级片av | 久久九九免费 | 亚洲一区在线日韩在线深爱 | 91免费观看视频 | 蜜桃精品在线 | 希岛爱理在线 | 久久高清国产 |