找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4168|回复: 2
收起左侧

CPLD乒乓球模拟—EDA课程设计报告下载

[复制链接]
ID:202486 发表于 2017-5-19 11:57 | 显示全部楼层 |阅读模式

前言

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

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


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)

回复

使用道具 举报

ID:202486 发表于 2017-5-19 12:03 | 显示全部楼层
新人求围观
回复

使用道具 举报

ID:212718 发表于 2017-6-19 20:46 | 显示全部楼层
请问去哪下载余下代码?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表