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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

CPLD乒乓球模擬—EDA課程設計報告下載

[復制鏈接]
跳轉到指定樓層
樓主

前言

EDA是電子設計自動化(Electronic Design Automation)的縮寫,在20世紀90年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發展而來的。EDA技術就是以計算機為工具,設計者在EDA軟件平臺上,用硬件描述語言VHDL完成設計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優化、布局、布線和仿真,

    直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術在進入21世紀后,得到了更大的發展,突出表現在以下幾個方面:

(1)使電子設計成果以自主知識產權(IP)的方式得以明確表達和確認成為可能。
(2)在仿真驗證和設計兩方面都支持標準硬件描述語言的功能強大的EDA軟件不斷推出。
(3)電子技術全方位進入EDA時代。除了日益成熟的數字技術外,傳統的電路系統設計建模理念發生了重大的變化:軟件無線電技術的崛起,模擬電路系統硬件描述語言的表達和設計的標準化,系統可編程模擬器件的出現,軟硬件技術,軟硬件功能及其結構的進一步融合等。

一、課程設計目的

本課程設計是在《CPLD技術及應用》課程的基礎上,通過軟件編程及仿真調試的實踐,進一步掌握使用Verilog HDL語言描述數字電路的原理和應用方法,是畢業設計前的一次重要實踐,為今后從事EDA設計相關工作崗位打下良好的基礎。

二、設計題目及要求

2.1 設計題目:

乒乓球游戲機數字電路系統設計

2.2 功能實現:

運用狀態機技術完成一個乒乓球游戲機的數字電路系統設計,將游戲雙方的得分通過兩個數碼管進行顯示。

乒乓球游戲規則:

(1)乒乓球游戲雙方各使用1個按鍵為“球拍”,開發板的8個LED用于指示乒乓球移動軌跡,點亮的那個LED為當前乒乓球所在位置。

(2)發球方按下按鍵表示發球,LED燈按一定的時間間隔,依次向對方移動。當LED亮到離對方最近的一個,之后的時間間隔內,對方按下按鍵表示成功接球,接球后LED向對方移動;否則,表示對方輸球。

(3)接球時,LED沒有亮到最近的一個時就按下按鍵,視為犯規,對方加1分。

(4)用兩個數碼管分別表示雙方得分,最先到9分者勝出。

2.3 設計要求:

理解和熟練使用Quartus II軟件、狀態機、頂層文件和例化語句,用Quartus II完成編程和調試,下載到開發板中實現設定的功能,并完成課程設計報告。

1.LED移動間隔為1s。

2.數碼管DP1和DP2用于顯示雙方比分。


三、設計原理說明

3.1 顯示模塊

使用數碼管驅動芯片CH452來驅動各數碼管顯示,兩個數碼管顯示乒乓球游戲雙方的比分。

3.2 乒乓游戲模塊

乒乓球游戲雙方各使用1個按鍵為“球拍”,開發板的8個LED用于指示乒乓球移動軌跡,點亮的那個LED為當前乒乓球所在位置。發球方按下按鍵表示發球,LED燈按一定的時間間隔,依次向對方移動。當LED亮到離對方最近的一個,之后的時間間隔內,對方按下按鍵表示成功接球,接球后LED向對方移動;否則,表示對方輸球。

3.3 按鍵模塊

用兩個按鍵分別表示乒乓球游戲雙方的“球拍”,用一個按鍵作為系統的復位信號。

3.4 設計方案

整個設計方案可以分成時鐘分頻、乒乓球游戲機、顯示數據轉換、數碼管顯示控制和頂層模塊等5大模塊。

時鐘分頻:產生100Khz的輸出時鐘,為其他4個模塊提供時鐘。

乒乓球游戲機:完成乒乓球游戲設計,并將雙方得分輸出給顯示數據轉換模塊。

顯示數據轉換:接收來自乒乓球游戲機模塊和時間數據讀取模塊的得分和時間數據,轉換成數碼管顯示地址和數據。

數碼管顯示控制:接收顯示數據轉換模塊的數據,并送到各數碼管顯示。

頂層模塊:連接各個模塊。

四、軟件設計

(含狀態轉換圖、帶注釋的程序清單)





1.乒乓球游戲機狀態轉換:

S0:復位狀態,判斷發球權。如果左右鍵同時為0或1→S0,如果左鍵為1→S1,如果右鍵為1→S4。

S1:左方發球或成功接球;

              S2:球從左方向右方右移;移動過程中,如果右方接球就給左方加一分,并將球權給左方;

              S3:判斷右方是否在規定時間內內接球;

              S4:右方發球或成功接球;

              S5:球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方;

              S6:判斷左方是否在規定時間內接球;

2.各模塊程序設計

(1)時鐘分頻模塊

  1.   module clk_div(clk_in, clk_out);

  2.               input clk_in;

  3.               output clk_out;

  4.             

  5.               reg [25:0] cnter;

  6.               reg clk_out;



  7.               parameter m=500;

  8.             

  9.     always @(posedge clk_in)

  10.        begin

  11.            if(cnter == m)

  12.                                              begin

  13.                                              clk_out<=1;

  14.                                              cnter<=0;

  15.                                              end

  16.                                else

  17.                                              begin

  18.                                              clk_out<=0;

  19.                                              cnter<=cnter+1;            

  20.                                              end                           

  21.       end

  22. endmodule
復制代碼


//產生一個時鐘信號,作為其他語句模塊的時鐘輸入。

  • 乒乓球游戲機模塊

  1. [color=rgb(0, 0, 0)]module pingpang(clk,rst,cycle,keyL,keyR,leds,score);

  2. //rst異步復位, keyL和keyR是比賽雙方按鍵

  3. //leds是一排8個發光二極管代表乒乓球運動軌跡

  4. //score是得分的分數

  5. input clk,rst,cycle;

  6. input keyL,keyR;

  7. output leds;

  8. output [7:0] score;



  9. reg [7:0] leds;

  10. reg [3:0] scoreL,scoreR;

  11. reg [2:0] state;

  12. reg clk_out;

  13. reg [16:0] cnter;



  14. wire [3:0] D_ADDR;

  15. wire [7:0] D_DATA;

  16. wire [7:0] score = {scoreL,scoreR};



  17. parameter m=100_000;



  18. parameter s0=3'b000,//復位狀態,也是判斷發球權的狀態;

  19.                              

  20.                               s1=3'b001,//左方發球或成功接球;

  21.                               s2=3'b010,//球從左方向右方右移,若此時右方接球就給左方加一分,并將球權給左方;

  22.                               s3=3'b011,//判斷右方是否在規定時間內內接球

  23.                              

  24.                               s4=3'b100,//右方發球或成功接球;

  25.                               s5=3'b101,//球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方;



  26.                               s6=3'b110;//判斷左方是否在規定時間內接球;







  27. //游戲邏輯控制



  28. always @(posedge clk or negedge rst)

  29.             

  30.               begin

  31.                            

  32.                             if(!rst)

  33.                                           begin

  34.                                           clk_out<=0;

  35.                                           cnter<=0;

  36.                                           end

  37.                             else

  38.                                           begin

  39.                                           if(cnter == m)

  40.                                                         begin

  41.                                                         clk_out<=1;

  42.                                                         cnter<=0;

  43.                                                         end

  44.                                           else

  45.                                                         begin

  46.                                                         clk_out<=0;

  47.                                                         cnter<=cnter+1;            

  48.                                                         end                           

  49.                                           end

  50.               end

  51. //產生一個時鐘脈沖clk_out給下面的語句塊作為時鐘輸入使用。



  52. always @(posedge clk_out or negedge rst )            



  53.               begin



  54.                             if(!rst)

  55.                                           begin

  56.                                           state<=s0;

  57.                                           leds<=8'b00000000;

  58.                                           scoreL<=4'b0000;

  59.                                           scoreR<=4'b0000;

  60.                                           end//當rst為0時,使各個變量成為原始狀態。

  61.                             else

  62.                

  63.                             begin



  64.                             case(state)

  65.                                          

  66.                                           s0: begin

  67.                                                                       leds<=8'b00000000;//使LED燈處于全滅狀態。

  68.                                                                       scoreL<=4'b0000;

  69.                                                                       scoreR<=4'b0000;//給左右雙方的分數復位;

  70.                                                               if(keyL)

  71.                                                                                     begin

  72.                                                                                     state<=s1;//如果左方獲得發球權,則跳轉到s1狀態。

  73.                                                                                     end

  74.                                                                         else if(keyR)

  75.                                                                                     state<=s4;//如果右方獲得發球權,則跳轉到s4狀態。

  76.                                                                                                                                 

  77.                                                         end

  78.                                           s1: begin

  79.                                                                       if(keyL)

  80.                                                                                     begin

  81.                                                                                     if(leds==8'b00000000)

  82.                                                                                                   leds<=8'b10000000;//如果左方發球或成功接球,點亮的燈出現在最左邊。            

  83.                                                                       state<=s2;//跳轉到s2狀態。

  84.                                                                                     end

  85.                                                                       else if(keyR)

  86.                                                                                                   begin

  87.                                                                                                                state<=s1;//在這個過程中,如果右方擊球,則LED燈閃爍,表示發生錯誤,狀態一直重復在s1。

  88.                                                                               end            

  89.                                                                      

  90.                                                                      

  91.                                                         end

  92.                                           s2: begin

  93.                                                                       if(leds==8'b00000001)//判斷LED燈是否向右移動到最后一個燈亮。

  94.                                                                                     begin

  95.                                                                                                   leds<=leds>>1;//使LED燈向右移動一位。

  96.                                                                                                   state<=s3;//進入判斷右方接球的狀態。

  97.                                                                                     end

  98.                                                                       else

  99.                                                                                     begin

  100.                                                                                                   leds<=leds>>1;//使LED燈向右移動一位。

  101.                                                                                                   state<=s2;//重復s2狀態。

  102.                                                                                                   if(keyR)

  103.                                                                                            begin

  104.                                                                                                          scoreL<=scoreL+1;

  105.                             state<=s1;



  106.                                                                                                          leds<=8'b00000000;//如果右方在燈向右移動的過程中擊球,表示右方犯規,左方加一分,球權給左方,并使LED燈復位。

  107.                                                                                            end

  108.                                                                                        end

  109.                                                                      

  110.                                                               end

  111.                                           s3: begin

  112.                                                                       if(keyR)

  113.                                                                                     begin

  114.                                                                                                   state<=s4;//右方接球成功,并進入右方發球的s4狀態;

  115.                                                                                                   leds<=8'b00000000;//使LED燈復位。

  116.                                                                                     end

  117.                                                                       else

  118.                                                                                     begin

  119.                                                                                                   scoreL<=scoreL+1;

  120.                                                                                                   state<=s1;//右方接球不成功,則左方加一分,并進入左方發球的s1狀態;

  121.                                                                                                   leds<=8'b00000000;//使LED燈復位。

  122.                                                                                     end

  123.                                                         end

  124.                                           s4: begin

  125.                                                                       if(keyR)

  126.                                                                                     begin

  127.                                                                                     if(leds==8'b00000000)

  128.                                                                                                   leds<=8'b00000001;//如果右方發球或成功接球,點亮的燈出現在最右邊。

  129.                                                                             state<=s5;//跳轉到s5狀態

  130.                                                                                     end

  131.                                                                       else if(keyL)

  132.                                                                                                   begin

  133.                                                                                                                state<=s4;//在這個過程中,如果左方擊球,則LED燈閃爍,表示發生錯誤,狀態一直重復在s4。

  134.                                                                               end            

  135.                                                                      

  136.                                                                      

  137.                                                         end

  138.                                           s5: begin

  139.                                                                       if(leds==8'b10000000)//判斷LED燈是否向左移動到最后一個燈亮。

  140.                                                                                     begin

  141.                                                                                                   leds<=leds<<1;//使LED燈向左移動一位。

  142.                                                                                                   state<=s6;//進入判斷左方接球的狀態;

  143.                                                                                     end

  144.                                                                       else

  145.                                                                                     begin

  146.                                                                                                   leds<=leds<<1;//使LED燈向左移動一位

  147.                                                                                                   state<=s5;//重復s5狀態。

  148.                                                                                                   if(keyL)

  149.                                                                                           begin

  150.                                                                                                        scoreR<=scoreR+1;

  151.                                                                                                        state<=s4;

  152.                                                                                                        leds<=8'b00000000;//如果左方在燈向左移動的過程中擊球,表示左方犯規,右方加一分,球權給右方,并使LED燈復位。

  153.                                                                                            end

  154.                                                                                         end

  155.                                                                      

  156.                                                                end

  157.                                           s6: begin

  158.                                                                       if(keyL)

  159.                                                                                     begin

  160.                                                                                                   state<=s1;//左方接球成功,并進入左方發球的s1狀態;

  161.                                                                                                   leds<=8'b00000000;//使LED燈復位。

  162.                                                                                     end

  163.                                                                       else

  164.                                                                                     begin

  165.                                                                                                   scoreR<=scoreR+1;

  166.                                                                                                   state<=s4;//左方接球不成功,則右方加一分,并進入右方發球的s4狀態;

  167.                                                                                                   leds<=8'b00000000;//使LED燈復位。

  168.                                                                                     end

  169.                                                         end            

  170.                                           default: state<=s0;

  171.                             endcase

  172.               end

  173. end

  174.                            

  175. endmodule            

  176. (3)顯示數據轉換模塊

  177. module tube_data(clk,rst,cycle,score,D_ADDR,D_DATA);

  178.             

  179.               input clk,rst,cycle;

  180.               input [7:0] score;

  181.               output [3:0] D_ADDR;

  182.               output [7:0] D_DATA;

  183.             

  184.               reg [14:0] cnter;

  185.               reg [2:0]  state;



  186.               reg [3:0] D_ADDR;

  187.               reg [7:0] D_DATA;

  188.             

  189.               parameter m=250;



  190.               always @(posedge clk or negedge rst)

  191.                             begin

  192.                                           if(!rst)

  193.                                                         begin

  194.                                                         cnter<=0;

  195.                                                         state<=0;//當rst為0時,給各變量賦初值。

  196.                                                         end

  197.                                           else

  198.                                                         begin

  199.                                                                       if(cnter==m)

  200.                                                                                     cnter<=0;//每當cnter加到與m相等,使cnter變回0

  201.                                                                       else

  202.                                                                                     cnter<=cnter+1;            

  203.                                                                       case(cnter)

  204.                                                                                     0 : state<=0;//當cnter為0時,使state為0。

  205.                                                                                     m/2 : state<=1;//當cnter為125時,使state為1。

  206.            
  207. <font color="rgb(0, 0, 0)">…………限于本文篇幅 余下代碼請從51黑下載附件…………</font>
復制代碼



(4)數碼管顯示控制模塊

  1. module ch452 (scl, sda,clk,rst,cycle,DIG_ADDR, DIG_DATA);

  2.             

  3.               input clk,rst;

  4.               input [3:0] DIG_ADDR;

  5.               input [7:0] DIG_DATA;

  6.               output scl,sda,cycle;

  7.             

  8.               reg scl, sda,cycle;

  9.               reg [5:0] cnt_cycle;

  10.               reg [5:0] CST;

  11.               reg [5:0] NST;

  12.               reg [5:0] i;



  13.               reg [3:0] D_ADDR;

  14.               reg [7:0] D_DATA;

  15.             

  16.             

  17.               parameter DA0 =1'b0;

  18.               parameter DA1 =1'b1;

  19.               parameter ADDR =1'b1;            

  20.               parameter s0=0,s1=1,s2=2,s3=3;            

  21.                            

  22.                            

  23. always @( posedge clk or negedge rst)

  24.                             begin

  25.                                           if(!rst)

  26.                                                         begin

  27.                                                         CST <= s0;

  28.                                                         cycle<=0;

  29.                                                         i<=0;

  30.                                                         end

  31.                                           else

  32.                                                         begin

  33.                                                                       CST <= NST;

  34.                                                                      

  35.                                                                       if(i==38)

  36.                                                                                     begin

  37.                                                                                     i<=0;

  38.                                                                                     cycle <= 1;

  39.                                                                                     end

  40.                                                                       else

  41.                                                                                     begin

  42.                                                                                     i<=i+1;

  43.                                                                                     cycle <= 0;

  44.                                                                                     end

  45.                                                         end                                                      

  46.                             end



  47. always @ (posedge cycle or negedge rst)

  48.                             begin

  49.                             if(!rst)  begin

  50.                                           cnt_cycle<=0;

  51.                                           D_ADDR<=4'b0000;

  52.                                           D_DATA<=8'b00000000;//當rst為0時,為數碼管賦初值。

  53.                             end

  54.                             else   begin

  55.                                           cnt_cycle<=cnt_cycle+1;

  56.                                           if(cnt_cycle==0)  begin

  57.                                           D_ADDR<=4'b0100;

  58.                                           D_DATA<=8'b00000001;//數碼管第一次驅動,在第4'b0100個數碼管輸出數值8'b00000001

  59.                             end

  60.                             else if(cnt_cycle==1)   begin

  61.                                           D_ADDR<=4'b0101;

  62.                                           D_DATA<=8'b10000000;//數碼管第二次驅動,在第4'b0101個數碼管輸出數值8'b10000000

  63.                             end

  64.                             else   begin

  65.                                           D_ADDR<=DIG_ADDR;

  66.                                           D_DATA<=DIG_DATA;//數碼管第三次驅動,在自己想要的數碼管位置輸出自己想要的值

  67.                             end

  68.                             end                                                      

  69.                             end            

  70.                                          

  71.               always @ (CST or D_ADDR or D_DATA or i)

  72.                             case (CST)

  73.                             s0 : begin scl = 1; sda = 1; NST <= s1; end//數碼管準備啟動

  74.                             s1 : begin scl = 1; sda = 0; NST <= s2; end//數碼管開始啟動

  75.                             s2 : begin scl = 0; sda = 0; NST <= s3; end//數碼管啟動完成                           

  76.                             s3 : begin

  77.                                           if(i%2==1)  scl=0;   

  78.                                           else  scl=1;

  79.                                           case ((i-1)/2)            

  80.                                           1:sda=DA0;

  81.                                           2:sda=DA1;

  82.                                           3:sda=ADDR;//輸出固定值011。

  83.                                           4:sda=D_ADDR[3];

  84.                                           5:sda=D_ADDR[2];

  85.                                           6:sda=D_ADDR[1];

  86.                                           7:sda=D_ADDR[0];//輸出數碼管位置。

  87.                                           8:sda=0;

  88.                                           9:sda=1;//輸出固定值01。

  89.                                           10:sda=D_DATA[7];

  90.                                           11:sda=D_DATA[6];

  91.                                           12:sda=D_DATA[5];

  92.                                           13:sda=D_DATA[4];

  93.                                           14:sda=D_DATA[3];

  94.                                           15:sda=D_DATA[2];

  95.                                           16:sda=D_DATA[1];

  96.                                           17:sda=D_DATA[0];//輸出數碼管顯示的數字。

  97.                                           18:sda=1;

  98.                                           default:sda=0;

  99.                                           endcase

  100.                                           if(i==38)   NST = s0;

  101.                                           else           NST = s3;

  102.                                           end

  103.                                default : begin scl = 1; sda = 1; NST <= s0;end

  104.                             endcase

  105. endmodule

  106. (5)頂層模塊

  107. module top(clk,rst,keyL,keyR,leds,scl_ch452,sda_ch452);



  108.                  input keyL,keyR,clk,rst;

  109.       output[7:0] leds;

  110.       output scl_ch452,sda_ch452;



  111. …………限于本文篇幅 余下代碼請從51黑下載附件…………

  112. endmodule
復制代碼


  • 管腳分配說明

設計端口

芯片引腳

開發板模塊

clk

PIN_22

時鐘

rst

PIN_88

SW3,異步復位

keyL

PIN_91

SW1,左方按鍵

keyR

PIN_90

SW2,右方按鍵

scl_rtc

PIN_60

實時時鐘串行時鐘信號

sda_rtc

PIN_64

實時時鐘串行數據信號

scl_ch452

PIN_70

CH452 串行時鐘信號

sda_ch452

PIN_69

CH452 的串行數據信號

leds[0]

PIN_72

LED1

leds[1]

PIN_73

LED2

leds[2]

PIN_74

LED3

leds[3]

PIN_75

LED4

leds[4]

PIN_76

LED5

leds[5]

PIN_77

LED6

leds[6]

PIN_79

LED7

leds[7]

PIN_80

LED8


  • 時間進度安排

序號

設計階段工作內容

時間分配

1

理解題目,理清思路,學習 CH452 和 DS1340 的數據手冊,畫出設計框圖和乒乓球的狀態轉換圖。

1天

2

編寫和調試乒乓球游戲機分數顯示相關模塊,能實現乒乓球雙方得分數據的顯示。

1天

3

編寫和調試乒乓球游戲機球拍控制和乒乓球移動相關模塊

4天

4

完善和優化整個系統,編寫設計報告

2天

5

設計答辯

1天


五、設計總結


設計成績:教師簽名:




完整論文下載(word格式 可編輯):

EDA課設報告——乒乓球模擬.doc (206.93 KB, 下載次數: 34)





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

使用道具 舉報

沙發
ID:202486 發表于 2017-5-19 12:03 | 只看該作者
新人求圍觀
回復

使用道具 舉報

板凳
ID:212718 發表于 2017-6-19 20:46 | 只看該作者
請問去哪下載余下代碼?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干av | 在线观看黄视频 | 欧美电影大全 | 视频羞羞| 亚洲精品电影在线观看 | 秋霞a级毛片在线看 | 中文字幕视频在线免费 | 亚洲综合一区二区三区 | 欧美日韩精品专区 | 黄网免费看 | 国产精品免费在线 | 在线视频一区二区三区 | 精品视频网 | 久久久91精品国产一区二区精品 | 国产日韩久久 | 成人午夜网站 | 久久久久香蕉视频 | 美女久久久久久久久 | 激情综合五月 | 91视频在线观看 | 久久精品亚洲一区二区三区浴池 | 日本免费网 | 精品欧美| 欧美日韩精品区 | 蜜桃av鲁一鲁一鲁一鲁 | 精品不卡 | 亚洲色图在线观看 | 99这里只有精品 | 成人在线电影网站 | 亚洲视频在线一区 | 久久精品二区 | 国产一区二区三区免费视频 | 伊人一区| 国内精品久久久久 | 一级欧美| 国产成人免费视频网站视频社区 | 一呦二呦三呦国产精品 | 国产精品视频一区二区三区 | www久| 色网在线播放 | 成人在线观看免费 |