前言 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分者勝出。
1.001.jpg (13.78 KB, 下載次數: 89)
下載附件
2017-5-19 17:49 上傳
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個模塊提供時鐘。 乒乓球游戲機:完成乒乓球游戲設計,并將雙方得分輸出給顯示數據轉換模塊。 顯示數據轉換:接收來自乒乓球游戲機模塊和時間數據讀取模塊的得分和時間數據,轉換成數碼管顯示地址和數據。 數碼管顯示控制:接收顯示數據轉換模塊的數據,并送到各數碼管顯示。 頂層模塊:連接各個模塊。 四、軟件設計 (含狀態轉換圖、帶注釋的程序清單)
0.png (43.16 KB, 下載次數: 85)
下載附件
2017-5-19 17:49 上傳
1.乒乓球游戲機狀態轉換: S0:復位狀態,判斷發球權。如果左右鍵同時為0或1→S0,如果左鍵為1→S1,如果右鍵為1→S4。 S1:左方發球或成功接球; S2:球從左方向右方右移;移動過程中,如果右方接球就給左方加一分,并將球權給左方; S3:判斷右方是否在規定時間內內接球; S4:右方發球或成功接球; S5:球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方; S6:判斷左方是否在規定時間內接球; 2.各模塊程序設計 (1)時鐘分頻模塊 - module clk_div(clk_in, clk_out);
- input clk_in;
- output clk_out;
-
- reg [25:0] cnter;
- reg clk_out;
-
- parameter m=500;
-
- always @(posedge clk_in)
- begin
- if(cnter == m)
- begin
- clk_out<=1;
- cnter<=0;
- end
- else
- begin
- clk_out<=0;
- cnter<=cnter+1;
- end
- end
- endmodule
復制代碼
//產生一個時鐘信號,作為其他語句模塊的時鐘輸入。
- [color=rgb(0, 0, 0)]module pingpang(clk,rst,cycle,keyL,keyR,leds,score);
- //rst異步復位, keyL和keyR是比賽雙方按鍵
- //leds是一排8個發光二極管代表乒乓球運動軌跡
- //score是得分的分數
- input clk,rst,cycle;
- input keyL,keyR;
- output leds;
- output [7:0] score;
-
- reg [7:0] leds;
- reg [3:0] scoreL,scoreR;
- reg [2:0] state;
- reg clk_out;
- reg [16:0] cnter;
-
- wire [3:0] D_ADDR;
- wire [7:0] D_DATA;
- wire [7:0] score = {scoreL,scoreR};
-
- parameter m=100_000;
-
- parameter s0=3'b000,//復位狀態,也是判斷發球權的狀態;
-
- s1=3'b001,//左方發球或成功接球;
- s2=3'b010,//球從左方向右方右移,若此時右方接球就給左方加一分,并將球權給左方;
- s3=3'b011,//判斷右方是否在規定時間內內接球
-
- s4=3'b100,//右方發球或成功接球;
- s5=3'b101,//球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方;
-
- s6=3'b110;//判斷左方是否在規定時間內接球;
-
-
-
- //游戲邏輯控制
-
- always @(posedge clk or negedge rst)
-
- begin
-
- if(!rst)
- begin
- clk_out<=0;
- cnter<=0;
- end
- else
- begin
- if(cnter == m)
- begin
- clk_out<=1;
- cnter<=0;
- end
- else
- begin
- clk_out<=0;
- cnter<=cnter+1;
- end
- end
- end
- //產生一個時鐘脈沖clk_out給下面的語句塊作為時鐘輸入使用。
-
- always @(posedge clk_out or negedge rst )
-
- begin
-
- if(!rst)
- begin
- state<=s0;
- leds<=8'b00000000;
- scoreL<=4'b0000;
- scoreR<=4'b0000;
- end//當rst為0時,使各個變量成為原始狀態。
- else
-
- begin
-
- case(state)
-
- s0: begin
- leds<=8'b00000000;//使LED燈處于全滅狀態。
- scoreL<=4'b0000;
- scoreR<=4'b0000;//給左右雙方的分數復位;
- if(keyL)
- begin
- state<=s1;//如果左方獲得發球權,則跳轉到s1狀態。
- end
- else if(keyR)
- state<=s4;//如果右方獲得發球權,則跳轉到s4狀態。
-
- end
- s1: begin
- if(keyL)
- begin
- if(leds==8'b00000000)
- leds<=8'b10000000;//如果左方發球或成功接球,點亮的燈出現在最左邊。
- state<=s2;//跳轉到s2狀態。
- end
- else if(keyR)
- begin
- state<=s1;//在這個過程中,如果右方擊球,則LED燈閃爍,表示發生錯誤,狀態一直重復在s1。
- end
-
-
- end
- s2: begin
- if(leds==8'b00000001)//判斷LED燈是否向右移動到最后一個燈亮。
- begin
- leds<=leds>>1;//使LED燈向右移動一位。
- state<=s3;//進入判斷右方接球的狀態。
- end
- else
- begin
- leds<=leds>>1;//使LED燈向右移動一位。
- state<=s2;//重復s2狀態。
- if(keyR)
- begin
- scoreL<=scoreL+1;
- state<=s1;
-
- leds<=8'b00000000;//如果右方在燈向右移動的過程中擊球,表示右方犯規,左方加一分,球權給左方,并使LED燈復位。
- end
- end
-
- end
- s3: begin
- if(keyR)
- begin
- state<=s4;//右方接球成功,并進入右方發球的s4狀態;
- leds<=8'b00000000;//使LED燈復位。
- end
- else
- begin
- scoreL<=scoreL+1;
- state<=s1;//右方接球不成功,則左方加一分,并進入左方發球的s1狀態;
- leds<=8'b00000000;//使LED燈復位。
- end
- end
- s4: begin
- if(keyR)
- begin
- if(leds==8'b00000000)
- leds<=8'b00000001;//如果右方發球或成功接球,點亮的燈出現在最右邊。
- state<=s5;//跳轉到s5狀態
- end
- else if(keyL)
- begin
- state<=s4;//在這個過程中,如果左方擊球,則LED燈閃爍,表示發生錯誤,狀態一直重復在s4。
- end
-
-
- end
- s5: begin
- if(leds==8'b10000000)//判斷LED燈是否向左移動到最后一個燈亮。
- begin
- leds<=leds<<1;//使LED燈向左移動一位。
- state<=s6;//進入判斷左方接球的狀態;
- end
- else
- begin
- leds<=leds<<1;//使LED燈向左移動一位
- state<=s5;//重復s5狀態。
- if(keyL)
- begin
- scoreR<=scoreR+1;
- state<=s4;
- leds<=8'b00000000;//如果左方在燈向左移動的過程中擊球,表示左方犯規,右方加一分,球權給右方,并使LED燈復位。
- end
- end
-
- end
- s6: begin
- if(keyL)
- begin
- state<=s1;//左方接球成功,并進入左方發球的s1狀態;
- leds<=8'b00000000;//使LED燈復位。
- end
- else
- begin
- scoreR<=scoreR+1;
- state<=s4;//左方接球不成功,則右方加一分,并進入右方發球的s4狀態;
- leds<=8'b00000000;//使LED燈復位。
- end
- end
- default: state<=s0;
- endcase
- end
- end
-
- endmodule
- (3)顯示數據轉換模塊
- module tube_data(clk,rst,cycle,score,D_ADDR,D_DATA);
-
- input clk,rst,cycle;
- input [7:0] score;
- output [3:0] D_ADDR;
- output [7:0] D_DATA;
-
- reg [14:0] cnter;
- reg [2:0] state;
-
- reg [3:0] D_ADDR;
- reg [7:0] D_DATA;
-
- parameter m=250;
-
- always @(posedge clk or negedge rst)
- begin
- if(!rst)
- begin
- cnter<=0;
- state<=0;//當rst為0時,給各變量賦初值。
- end
- else
- begin
- if(cnter==m)
- cnter<=0;//每當cnter加到與m相等,使cnter變回0
- else
- cnter<=cnter+1;
- case(cnter)
- 0 : state<=0;//當cnter為0時,使state為0。
- m/2 : state<=1;//當cnter為125時,使state為1。
-
- <font color="rgb(0, 0, 0)">…………限于本文篇幅 余下代碼請從51黑下載附件…………</font>
復制代碼
(4)數碼管顯示控制模塊 - module ch452 (scl, sda,clk,rst,cycle,DIG_ADDR, DIG_DATA);
-
- input clk,rst;
- input [3:0] DIG_ADDR;
- input [7:0] DIG_DATA;
- output scl,sda,cycle;
-
- reg scl, sda,cycle;
- reg [5:0] cnt_cycle;
- reg [5:0] CST;
- reg [5:0] NST;
- reg [5:0] i;
-
- reg [3:0] D_ADDR;
- reg [7:0] D_DATA;
-
-
- parameter DA0 =1'b0;
- parameter DA1 =1'b1;
- parameter ADDR =1'b1;
- parameter s0=0,s1=1,s2=2,s3=3;
-
-
- always @( posedge clk or negedge rst)
- begin
- if(!rst)
- begin
- CST <= s0;
- cycle<=0;
- i<=0;
- end
- else
- begin
- CST <= NST;
-
- if(i==38)
- begin
- i<=0;
- cycle <= 1;
- end
- else
- begin
- i<=i+1;
- cycle <= 0;
- end
- end
- end
-
- always @ (posedge cycle or negedge rst)
- begin
- if(!rst) begin
- cnt_cycle<=0;
- D_ADDR<=4'b0000;
- D_DATA<=8'b00000000;//當rst為0時,為數碼管賦初值。
- end
- else begin
- cnt_cycle<=cnt_cycle+1;
- if(cnt_cycle==0) begin
- D_ADDR<=4'b0100;
- D_DATA<=8'b00000001;//數碼管第一次驅動,在第4'b0100個數碼管輸出數值8'b00000001
- end
- else if(cnt_cycle==1) begin
- D_ADDR<=4'b0101;
- D_DATA<=8'b10000000;//數碼管第二次驅動,在第4'b0101個數碼管輸出數值8'b10000000
- end
- else begin
- D_ADDR<=DIG_ADDR;
- D_DATA<=DIG_DATA;//數碼管第三次驅動,在自己想要的數碼管位置輸出自己想要的值
- end
- end
- end
-
- always @ (CST or D_ADDR or D_DATA or i)
- case (CST)
- s0 : begin scl = 1; sda = 1; NST <= s1; end//數碼管準備啟動
- s1 : begin scl = 1; sda = 0; NST <= s2; end//數碼管開始啟動
- s2 : begin scl = 0; sda = 0; NST <= s3; end//數碼管啟動完成
- s3 : begin
- if(i%2==1) scl=0;
- else scl=1;
- case ((i-1)/2)
- 1:sda=DA0;
- 2:sda=DA1;
- 3:sda=ADDR;//輸出固定值011。
- 4:sda=D_ADDR[3];
- 5:sda=D_ADDR[2];
- 6:sda=D_ADDR[1];
- 7:sda=D_ADDR[0];//輸出數碼管位置。
- 8:sda=0;
- 9:sda=1;//輸出固定值01。
- 10:sda=D_DATA[7];
- 11:sda=D_DATA[6];
- 12:sda=D_DATA[5];
- 13:sda=D_DATA[4];
- 14:sda=D_DATA[3];
- 15:sda=D_DATA[2];
- 16:sda=D_DATA[1];
- 17:sda=D_DATA[0];//輸出數碼管顯示的數字。
- 18:sda=1;
- default:sda=0;
- endcase
- if(i==38) NST = s0;
- else NST = s3;
- end
- default : begin scl = 1; sda = 1; NST <= s0;end
- endcase
- endmodule
- (5)頂層模塊
- module top(clk,rst,keyL,keyR,leds,scl_ch452,sda_ch452);
-
- input keyL,keyR,clk,rst;
- output[7:0] leds;
- output scl_ch452,sda_ch452;
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- endmodule
復制代碼
| | | | 理解題目,理清思路,學習 CH452 和 DS1340 的數據手冊,畫出設計框圖和乒乓球的狀態轉換圖。 | | | 編寫和調試乒乓球游戲機分數顯示相關模塊,能實現乒乓球雙方得分數據的顯示。 | | | 編寫和調試乒乓球游戲機球拍控制和乒乓球移動相關模塊 | | | | | | | |
五、設計總結
設計成績:教師簽名:
完整論文下載(word格式 可編輯):
EDA課設報告——乒乓球模擬.doc
(206.93 KB, 下載次數: 34)
2017-5-19 11:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|