標題: CPLD乒乓球模擬—EDA課程設計報告下載 [打印本頁]
作者: zhaolong 時間: 2017-5-19 11:57
標題: CPLD乒乓球模擬—EDA課程設計報告下載
前言
EDA是電子設計自動化(Electronic Design Automation)的縮寫,在20世紀90年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發(fā)展而來的。EDA技術就是以計算機為工具,設計者在EDA軟件平臺上,用硬件描述語言VHDL完成設計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局、布線和仿真,
直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術在進入21世紀后,得到了更大的發(fā)展,突出表現(xiàn)在以下幾個方面:
(1)使電子設計成果以自主知識產權(IP)的方式得以明確表達和確認成為可能。
(2)在仿真驗證和設計兩方面都支持標準硬件描述語言的功能強大的EDA軟件不斷推出。
(3)電子技術全方位進入EDA時代。除了日益成熟的數(shù)字技術外,傳統(tǒng)的電路系統(tǒng)設計建模理念發(fā)生了重大的變化:軟件無線電技術的崛起,模擬電路系統(tǒng)硬件描述語言的表達和設計的標準化,系統(tǒng)可編程模擬器件的出現(xiàn),軟硬件技術,軟硬件功能及其結構的進一步融合等。
一、課程設計目的
本課程設計是在《CPLD技術及應用》課程的基礎上,通過軟件編程及仿真調試的實踐,進一步掌握使用Verilog HDL語言描述數(shù)字電路的原理和應用方法,是畢業(yè)設計前的一次重要實踐,為今后從事EDA設計相關工作崗位打下良好的基礎。
二、設計題目及要求
2.1 設計題目:
乒乓球游戲機數(shù)字電路系統(tǒng)設計
2.2 功能實現(xiàn):
運用狀態(tài)機技術完成一個乒乓球游戲機的數(shù)字電路系統(tǒng)設計,將游戲雙方的得分通過兩個數(shù)碼管進行顯示。
乒乓球游戲規(guī)則:
(1)乒乓球游戲雙方各使用1個按鍵為“球拍”,開發(fā)板的8個LED用于指示乒乓球移動軌跡,點亮的那個LED為當前乒乓球所在位置。
(2)發(fā)球方按下按鍵表示發(fā)球,LED燈按一定的時間間隔,依次向對方移動。當LED亮到離對方最近的一個,之后的時間間隔內,對方按下按鍵表示成功接球,接球后LED向對方移動;否則,表示對方輸球。
(3)接球時,LED沒有亮到最近的一個時就按下按鍵,視為犯規(guī),對方加1分。
(4)用兩個數(shù)碼管分別表示雙方得分,最先到9分者勝出。
1.001.jpg (13.78 KB, 下載次數(shù): 89)
下載附件
2017-5-19 17:49 上傳
2.3 設計要求:
理解和熟練使用Quartus II軟件、狀態(tài)機、頂層文件和例化語句,用Quartus II完成編程和調試,下載到開發(fā)板中實現(xiàn)設定的功能,并完成課程設計報告。
1.LED移動間隔為1s。
2.數(shù)碼管DP1和DP2用于顯示雙方比分。
三、設計原理說明
3.1 顯示模塊
使用數(shù)碼管驅動芯片CH452來驅動各數(shù)碼管顯示,兩個數(shù)碼管顯示乒乓球游戲雙方的比分。
3.2 乒乓游戲模塊
乒乓球游戲雙方各使用1個按鍵為“球拍”,開發(fā)板的8個LED用于指示乒乓球移動軌跡,點亮的那個LED為當前乒乓球所在位置。發(fā)球方按下按鍵表示發(fā)球,LED燈按一定的時間間隔,依次向對方移動。當LED亮到離對方最近的一個,之后的時間間隔內,對方按下按鍵表示成功接球,接球后LED向對方移動;否則,表示對方輸球。
3.3 按鍵模塊
用兩個按鍵分別表示乒乓球游戲雙方的“球拍”,用一個按鍵作為系統(tǒng)的復位信號。
3.4 設計方案
整個設計方案可以分成時鐘分頻、乒乓球游戲機、顯示數(shù)據(jù)轉換、數(shù)碼管顯示控制和頂層模塊等5大模塊。
時鐘分頻:產生100Khz的輸出時鐘,為其他4個模塊提供時鐘。
乒乓球游戲機:完成乒乓球游戲設計,并將雙方得分輸出給顯示數(shù)據(jù)轉換模塊。
顯示數(shù)據(jù)轉換:接收來自乒乓球游戲機模塊和時間數(shù)據(jù)讀取模塊的得分和時間數(shù)據(jù),轉換成數(shù)碼管顯示地址和數(shù)據(jù)。
數(shù)碼管顯示控制:接收顯示數(shù)據(jù)轉換模塊的數(shù)據(jù),并送到各數(shù)碼管顯示。
頂層模塊:連接各個模塊。
四、軟件設計
(含狀態(tài)轉換圖、帶注釋的程序清單)
0.png (43.16 KB, 下載次數(shù): 85)
下載附件
2017-5-19 17:49 上傳
1.乒乓球游戲機狀態(tài)轉換:
S0:復位狀態(tài),判斷發(fā)球權。如果左右鍵同時為0或1→S0,如果左鍵為1→S1,如果右鍵為1→S4。
S1:左方發(fā)球或成功接球;
S2:球從左方向右方右移;移動過程中,如果右方接球就給左方加一分,并將球權給左方;
S3:判斷右方是否在規(guī)定時間內內接球;
S4:右方發(fā)球或成功接球;
S5:球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方;
S6:判斷左方是否在規(guī)定時間內接球;
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個發(fā)光二極管代表乒乓球運動軌跡
- //score是得分的分數(shù)
- 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,//復位狀態(tài),也是判斷發(fā)球權的狀態(tài);
-
- s1=3'b001,//左方發(fā)球或成功接球;
- s2=3'b010,//球從左方向右方右移,若此時右方接球就給左方加一分,并將球權給左方;
- s3=3'b011,//判斷右方是否在規(guī)定時間內內接球
-
- s4=3'b100,//右方發(fā)球或成功接球;
- s5=3'b101,//球從右方向左方左移;移動過 程中,如果左方接球就給右方加一分,并將球權給右方;
-
- s6=3'b110;//判斷左方是否在規(guī)定時間內接球;
-
-
-
- //游戲邏輯控制
-
- 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時,使各個變量成為原始狀態(tài)。
- else
-
- begin
-
- case(state)
-
- s0: begin
- leds<=8'b00000000;//使LED燈處于全滅狀態(tài)。
- scoreL<=4'b0000;
- scoreR<=4'b0000;//給左右雙方的分數(shù)復位;
- if(keyL)
- begin
- state<=s1;//如果左方獲得發(fā)球權,則跳轉到s1狀態(tài)。
- end
- else if(keyR)
- state<=s4;//如果右方獲得發(fā)球權,則跳轉到s4狀態(tài)。
-
- end
- s1: begin
- if(keyL)
- begin
- if(leds==8'b00000000)
- leds<=8'b10000000;//如果左方發(fā)球或成功接球,點亮的燈出現(xiàn)在最左邊。
- state<=s2;//跳轉到s2狀態(tài)。
- end
- else if(keyR)
- begin
- state<=s1;//在這個過程中,如果右方擊球,則LED燈閃爍,表示發(fā)生錯誤,狀態(tài)一直重復在s1。
- end
-
-
- end
- s2: begin
- if(leds==8'b00000001)//判斷LED燈是否向右移動到最后一個燈亮。
- begin
- leds<=leds>>1;//使LED燈向右移動一位。
- state<=s3;//進入判斷右方接球的狀態(tài)。
- end
- else
- begin
- leds<=leds>>1;//使LED燈向右移動一位。
- state<=s2;//重復s2狀態(tài)。
- if(keyR)
- begin
- scoreL<=scoreL+1;
- state<=s1;
-
- leds<=8'b00000000;//如果右方在燈向右移動的過程中擊球,表示右方犯規(guī),左方加一分,球權給左方,并使LED燈復位。
- end
- end
-
- end
- s3: begin
- if(keyR)
- begin
- state<=s4;//右方接球成功,并進入右方發(fā)球的s4狀態(tài);
- leds<=8'b00000000;//使LED燈復位。
- end
- else
- begin
- scoreL<=scoreL+1;
- state<=s1;//右方接球不成功,則左方加一分,并進入左方發(fā)球的s1狀態(tài);
- leds<=8'b00000000;//使LED燈復位。
- end
- end
- s4: begin
- if(keyR)
- begin
- if(leds==8'b00000000)
- leds<=8'b00000001;//如果右方發(fā)球或成功接球,點亮的燈出現(xiàn)在最右邊。
- state<=s5;//跳轉到s5狀態(tài)
- end
- else if(keyL)
- begin
- state<=s4;//在這個過程中,如果左方擊球,則LED燈閃爍,表示發(fā)生錯誤,狀態(tài)一直重復在s4。
- end
-
-
- end
- s5: begin
- if(leds==8'b10000000)//判斷LED燈是否向左移動到最后一個燈亮。
- begin
- leds<=leds<<1;//使LED燈向左移動一位。
- state<=s6;//進入判斷左方接球的狀態(tài);
- end
- else
- begin
- leds<=leds<<1;//使LED燈向左移動一位
- state<=s5;//重復s5狀態(tài)。
- if(keyL)
- begin
- scoreR<=scoreR+1;
- state<=s4;
- leds<=8'b00000000;//如果左方在燈向左移動的過程中擊球,表示左方犯規(guī),右方加一分,球權給右方,并使LED燈復位。
- end
- end
-
- end
- s6: begin
- if(keyL)
- begin
- state<=s1;//左方接球成功,并進入左方發(fā)球的s1狀態(tài);
- leds<=8'b00000000;//使LED燈復位。
- end
- else
- begin
- scoreR<=scoreR+1;
- state<=s4;//左方接球不成功,則右方加一分,并進入右方發(fā)球的s4狀態(tài);
- leds<=8'b00000000;//使LED燈復位。
- end
- end
- default: state<=s0;
- endcase
- end
- end
-
- endmodule
- (3)顯示數(shù)據(jù)轉換模塊
- 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)數(shù)碼管顯示控制模塊
- 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時,為數(shù)碼管賦初值。
- end
- else begin
- cnt_cycle<=cnt_cycle+1;
- if(cnt_cycle==0) begin
- D_ADDR<=4'b0100;
- D_DATA<=8'b00000001;//數(shù)碼管第一次驅動,在第4'b0100個數(shù)碼管輸出數(shù)值8'b00000001
- end
- else if(cnt_cycle==1) begin
- D_ADDR<=4'b0101;
- D_DATA<=8'b10000000;//數(shù)碼管第二次驅動,在第4'b0101個數(shù)碼管輸出數(shù)值8'b10000000
- end
- else begin
- D_ADDR<=DIG_ADDR;
- D_DATA<=DIG_DATA;//數(shù)碼管第三次驅動,在自己想要的數(shù)碼管位置輸出自己想要的值
- end
- end
- end
-
- always @ (CST or D_ADDR or D_DATA or i)
- case (CST)
- s0 : begin scl = 1; sda = 1; NST <= s1; end//數(shù)碼管準備啟動
- s1 : begin scl = 1; sda = 0; NST <= s2; end//數(shù)碼管開始啟動
- s2 : begin scl = 0; sda = 0; NST <= s3; end//數(shù)碼管啟動完成
- 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];//輸出數(shù)碼管位置。
- 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];//輸出數(shù)碼管顯示的數(shù)字。
- 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 的數(shù)據(jù)手冊,畫出設計框圖和乒乓球的狀態(tài)轉換圖。 | |
| 編寫和調試乒乓球游戲機分數(shù)顯示相關模塊,能實現(xiàn)乒乓球雙方得分數(shù)據(jù)的顯示。 | |
| 編寫和調試乒乓球游戲機球拍控制和乒乓球移動相關模塊 | |
| 完善和優(yōu)化整個系統(tǒng),編寫設計報告 | |
| | |
五、設計總結
設計成績:教師簽名:
完整論文下載(word格式 可編輯):
EDA課設報告——乒乓球模擬.doc
(206.93 KB, 下載次數(shù): 34)
2017-5-19 11:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: zhaolong 時間: 2017-5-19 12:03
新人求圍觀
作者: xiaotujiang 時間: 2017-6-19 20:46
請問去哪下載余下代碼?
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |