基于Basys 2的VGA视频游戏——Running man

基于Basys 2的VGA视频游戏

一、实验目的

  1. 掌握ISE软件及FPGA开发板的基本结构
  2. 熟练应用Verilog语言编程实现
  3. 掌握VGA的显示方法并将其应用到自己的游戏之中

二、模块结构

基于Basys 2的VGA视频游戏——Running man_第1张图片

三、游戏画面展示

四、实验源代码

游戏主逻辑:

module test(  
CLK,   
RED,  
GREEN,  
BLUE,  
HS,  
VS,
left,
right,
leda,
rest,
rand_num,
fenshu,
life,
nandu);  
  input CLK;   //时钟输入
  input left;  //向左移动输入
  input right; //向右移动输入
  input rest;  //重置
  input  [7:0] rand_num;
  input nandu; //调整难度
  output leda;//用于测试
  output [2:0] RED,GREEN;  
  output [1:0] BLUE;  
  output HS,VS; 
  output reg [7:0]fenshu;
  output reg [3:0]life;  

  parameter recal=10;
  parameter recah=120;
  parameter recbl=150;
  parameter recbh=20;
  parameter reccl=40;
  parameter recch=40;
  parameter recckl=20;
  parameter recckh=20;
  parameter recdl=20;
  parameter recdh=20;

  parameter recax1=200;
  parameter recax2=610;
  parameter recay1=60;
  parameter recay2=240;
  parameter recay3=420;
  parameter recay4=-120;


  parameter recbx1=240;
  parameter recbx2=350;
  parameter recbx3=460;
  parameter recby=40;

  parameter reccx=390;
  parameter reccy=440;
  parameter recckx=400;
  parameter reccky=440;

  parameter recdx1=260;
  parameter recdx2=380;
  parameter recdx3=500;
  parameter recdy=20;

parameter           char_line0=48'h000000000000;  //END数据
parameter           char_line1=48'h000000000000;
parameter           char_line2=48'h000000000000;
parameter           char_line3=48'h000000000000;
parameter           char_line4=48'h000000000000;
parameter           char_line5=48'h000000000000;
parameter           char_line6=48'h7ffcf83e7fc0;
parameter           char_line7=48'h180c38081870;
parameter           char_line8=48'h18043c081818;
parameter           char_line9=48'h18062c08180c;
parameter           char_line10=48'h18022c08180c;
parameter           char_line11=48'h18002e08180c;
parameter           char_line12=48'h181026081806;
parameter           char_line13=48'h181027081806;
parameter           char_line14=48'h183023081806;
parameter           char_line15=48'h1ff023081806;
parameter           char_line16=48'h183021881806;
parameter           char_line17=48'h181021c81806;
parameter           char_line18=48'h181020c81806;
parameter           char_line19=48'h180020e81806;
parameter           char_line20=48'h180020681806;
parameter           char_line21=48'h18002078180c;
parameter           char_line22=48'h18022038180c;
parameter           char_line23=48'h180220381808;
parameter           char_line24=48'h180420381818;
parameter           char_line25=48'h180c20181870;
parameter           char_line26=48'h7ffcf8187fc0;
parameter           char_line27=48'h000000000000;
parameter           char_line28=48'h000000000000;
parameter           char_line29=48'h000000000000;
parameter           char_line30=48'h000000000000;
parameter           char_line31=48'h000000000000;

  parameter            cmp1=8'b10000000;
  parameter            cmp2=8'b01010101;
  parameter            cmp3=8'b10101010;

reg[5:0] char_bit;
wire[9:0] y_dis;

  reg HS,VS;  
  reg [11:0] HS_CNT;// 行计数   
  reg [9:0] VS_CNT;//场计数   
  reg  [9:0]       cnt=0; //虚线下降计数
  reg  [9:0]       cntx=0;//最上方虚线计数
  reg  [9:0]       cnty=0;
  reg  [9:0]       cntz=0;
  reg  [9:0]       cnt1=0;//障碍1下降计数
  reg  [9:0]       cnt2=0;//障碍2下降计数
  reg  [9:0]       cnt3=0;//障碍3下降计数
  reg  [9:0]       cnt4=0;//生命1下降计数
  reg  [9:0]       cnt5=0;//生命2下降计数
  reg  [9:0]       cnt6=0;//生命3下降计数


  reg signed [11:0]       left1=0;
  reg signed [11:0]       right1=0;
  reg signed [11:0]       res=0;
  reg                   k1=1;//障碍1使能
  reg                    k2=0;//障碍2使能
  reg                    k3=0;//障碍3使能
  reg                   k4=0;//生命1使能
  reg                    k5=0;//生命2使能
  reg                    k6=0;//生命3使能
  reg                  pk=0;
  reg [9:0]            pk1=0;
  reg                  p;
  reg                  p1;
  reg                  p2;
  reg                  si1=0;
  reg                  si2=0;
  reg                  si3=0;
  reg [9:0]            x1;
  reg [9:0]            y1;
  reg [9:0]            x2;
  reg [9:0]            y2;
  reg                  led1=0;
  reg                  endg=0; //结束游戏
  reg [5:0]            life1=3;
  reg                  jiasu=0;
  reg [7:0]            lck;    //随机数锁存
  reg [7:0]            score=0;
  reg [5:0]            v1;
  reg [5:0]            v2;
  reg [7:0]            ColorOutput;

   wire         reset;
   wire         HBlank;
   wire         VBlank;
   wire         Blank;

 //----------------------产生HS、VS信号---------------//   
  always @(posedge CLK)  
  begin  
        life=life1;
      if(857<=HS_CNT&&HS_CNT<=977) HS<=0;//产生HS信号   
      else HS<=1;  
      if(HS_CNT==1039)  
            begin                  
              HS_CNT<=0;   
              if(VS_CNT==665)    VS_CNT<=0;//VS计数   
              else VS_CNT<=VS_CNT+1; 
            end              
       else HS_CNT<=HS_CNT+1;//HS计数   
       if(638<=VS_CNT&&VS_CNT<=644) VS<=0;//产生VS信号   
       else VS<=1;    


     end  



  assign HBlank = ((HS_CNT >= 0) & (HS_CNT < 800)) ? 1'b0 : 1'b1;

  assign VBlank = ((VS_CNT >= 0) & (VS_CNT < 600)) ? 1'b0 : 1'b1;

  assign Blank = (HBlank == 1'b1 | VBlank == 1'b1) ? 1'b1 : 1'b0;

  assign RED = (Blank == 1'b0) ? ColorOutput[7:5] : 
                3'b000;
  assign GREEN = (Blank == 1'b0) ? ColorOutput[4:2] : 
                  3'b000;
  assign BLUE = (Blank == 1'b0) ? ColorOutput[1:0] : 
                 2'b00;
  assign reset=rest;
  assign leda=led1;
  assign y_dis=VS_CNT;



//-------------左移、右移计数------------//
   always @(posedge left)
    begin
        if(left1-right1<9) left1=left1+1;
    end
    always @(posedge right)
    begin
        if(right1-left1<9)right1=right1+1;
    end
    always @(left1 or right1)
        res=left1-right1;


//------------随机数锁存、加速过程计数、分值计数------------//
    always @(posedge pk)
        begin
         if(p1==1) pk1=pk1+1;
         else  pk1=0;
         lck=rand_num;
         if(p2==0) score=score+1;
         if(p2==1) score=0;
         p=0;
         if(cnty<=5) cnty=cnty+1;
         else cnty=0;
        end

//-----------------主程序------------------//       
 always @(posedge CLK )
  begin
        if(jiasu==0&&nandu==0)begin v1=2;v2=3;end//改变难度
        if(jiasu==0&&nandu==1)begin v1=3;v2=4;end

        if(endg==0) //在游戏没有结束时执行
          begin
            if(score==0)p2=0;
             fenshu=score;
                if(HS_CNT==0 && VS_CNT==0) //产生cnt
                begin
                  if(cnt<=180)cnt=cnt+v1;
                end
              if(cnt>180 && cnt<190) cnt=0;

                        if(p==0) pk=0;

                        if(k1==1 && HS_CNT==0 && VS_CNT==0)  //当k1使能时cnt1开始计数,每一帧加2,下降到屏幕最下方时cnt1置零
                            begin
                                if(recby+cnt1<600) cnt1=cnt1+v1;
                            end
                        if(k2==1 && HS_CNT==0 && VS_CNT==0)  //当k2使能时cnt2开始计数,每一帧加2,下降到屏幕最下方时cnt2置零
                            begin
                                if(recby+cnt2<600) cnt2=cnt2+v1;
                            end
                        if(k3==1 && HS_CNT==0 && VS_CNT==0)  //当k3使能时cnt3开始计数,每一帧加2,下降到屏幕最下方时cnt3置零
                            begin
                                if(recby+cnt3<600) cnt3=cnt3+v1;
                            end
                        if(k4==1 && HS_CNT==0 && VS_CNT==0)  //当k4使能时cnt4开始计数,每一帧加2,下降到屏幕最下方时cnt4置零
                            begin
                                if(recdy+cnt4<600) cnt4=cnt4+v2;
                            end
                        if(k5==1 && HS_CNT==0 && VS_CNT==0)  //当k5使能时cnt5开始计数,每一帧加2,下降到屏幕最下方时cnt5置零
                            begin
                                if(recdy+cnt5<600) cnt5=cnt5+v2;
                            end
                        if(k6==1 && HS_CNT==0 && VS_CNT==0)  //当k6使能时cnt6开始计数,每一帧加2,下降到屏幕最下方时cnt6置零
                            begin
                                if(recdy+cnt6<600) cnt6=cnt6+v2;
                            end

                        if( (k1==1)&&(lck>=cmp1)&&(recby+cnt1) >= 350 ) begin k3=1;pk=1;end    //k1使能时,当随机数大于128时且障碍1下降到350像素之后k3使能,若随机数小于128则k2使能,当障碍1下降到屏幕最下方时k1置零
                        if( (k1==1)&&(lck= 350 ) begin k2=1;pk=1;end
                        if( (k1==1)&&(recby+cnt1)>=600) 
                        begin k1=0;pk=1;cnt1=0;end

                        if( (k2==1)&&(lck>=cmp1)&&(recby+cnt2) >= 350)  begin k3=1;pk=1;end    //k2使能时,当随机数大于128时且障碍2下降到350像素之后k1使能,若随机数小于128则k1使能,当障碍2下降到屏幕最下方时k2置零
                        if( (k2==1)&&(lck= 350 ) begin k1=1;pk=1;end 
                        if( (k2==1)&&(recby+cnt2)>=600) 
                        begin k2=0;pk=1;cnt2=0;end

                        if( (k3==1)&&(lck>=cmp1)&&(recby+cnt3) >= 350 ) begin k2=1;pk=1;end    //k3使能时,当随机数大于128时且障碍3下降到350像素之后k2使能,若随机数小于128则k1使能,当障碍3下降到屏幕最下方时k3置零
                        if( (k3==1)&&(lck= 350 ) begin k1=1;pk=1;end 
                        if( (k3==1)&&(recby+cnt3)>=600) 
                        begin k3=0;pk=1;cnt3=0;end  

                        if( (cnty==3)&&(lck1;                           //每有一个障碍降落到底则cnty加1,当cnty==6时置零,当cnty==3时根据随机数的值选择加速小方块下落的位置;
                        if( (cnty==3)&&(lck>cmp2)&&(lck1;
                        if( (cnty==3)&&(lck>cmp3) ) k6=1;
                        if( (k4==1)&&(recdy+cnt4)>=600)begin k4=0;cnt4=0;end
                        if( (k5==1)&&(recdy+cnt5)>=600)begin k5=0;cnt5=0;end
                        if( (k6==1)&&(recdy+cnt6)>=600)begin k6=0;cnt6=0;end



    if(cnt>120) //最上方虚线判断和计数
    begin 
        if(HS_CNT==0 && VS_CNT==0) cntx=cntx+v1;
        if(cntx>60 && cntx<70) cntx=0;
    end
    else cntx=0;
//--------------加速时速度乘以二,加速后经过10个障碍恢复原速-------------------//    
    if(jiasu==0) p1=0;
    if(jiasu==1)
      begin 
       p1=1;
      end
    if(pk1==10) 
        begin 
         if(jiasu) begin v1=v1>>1;v2=v2>>1;end
         jiasu=0;
        end
//---------------------跑道、障碍物、小人及加速小方块显示部分-------------------//
    if(!endg &&  (((HS_CNT >= recax1 && HS_CNT < (recax1+recal)) || (HS_CNT >= recax2 && HS_CNT < (recax2+recal))) && VS_CNT >= cntx   && VS_CNT < cnt ) ||  //最上方虚线

          (((HS_CNT >= recax1 && HS_CNT < (recax1+recal)) || (HS_CNT >= recax2 && HS_CNT < (recax2+recal))) && VS_CNT >= (recay1+cnt) && VS_CNT < (recay1+recah+cnt) ) || //虚线


         (((HS_CNT >= recax1 && HS_CNT < (recax1+recal)) || (HS_CNT >= recax2 && HS_CNT < (recax2+recal))) && VS_CNT >= (recay2+cnt) && VS_CNT < (recay2+recah+cnt) ) || //虚线


         (((HS_CNT >= recax1 && HS_CNT < (recax1+recal)) || (HS_CNT >= recax2 && HS_CNT < (recax2+recal))) && VS_CNT >= (recay3+cnt) && VS_CNT < (recay3+recah+cnt) ) || //虚线

            k1*(HS_CNT >= recbx1 && HS_CNT < (recbx1+recbl))&& VS_CNT >= (recby+cnt1) && VS_CNT < (recby+recbh+cnt1) ||  //障碍1
            k2*(HS_CNT >= recbx2 && HS_CNT < (recbx2+recbl))&& VS_CNT >= (recby+cnt2) && VS_CNT < (recby+recbh+cnt2) ||  //障碍2
            k3*(HS_CNT >= recbx3 && HS_CNT < (recbx3+recbl))&& VS_CNT >= (recby+cnt3) && VS_CNT < (recby+recbh+cnt3) ||  //障碍3

             k4*(HS_CNT >= recdx1 && HS_CNT < (recdx1+recdl))&& VS_CNT >= (recdy+cnt4) && VS_CNT < (recdy+recdh+cnt4) ||  //生命1
            k5*(HS_CNT >= recdx2 && HS_CNT < (recdx2+recdl))&& VS_CNT >= (recdy+cnt5) && VS_CNT < (recdy+recdh+cnt5) ||  //生命2
            k6*(HS_CNT >= recdx3 && HS_CNT < (recdx3+recdl))&& VS_CNT >= (recdy+cnt6) && VS_CNT < (recdy+recdh+cnt6) ||  //生命3

          (((HS_CNT >= reccx-20*res && HS_CNT < (recckx-20*res)) || (HS_CNT >= ((recckx+recckl)-20*res) && HS_CNT < ((reccx+reccl)-20*res))) && VS_CNT >= (reccy) && VS_CNT < (reccy+recckh)) ||   //人
          ((HS_CNT >= reccx-20*res && HS_CNT < ((reccx+reccl)-20*res)) && VS_CNT >= (reccy+recckh) && VS_CNT < (reccy+recch))                                                                                            //人
          )                                                                                                              


          ColorOutput=8'b11100000;
   else 
      ColorOutput=8'b00000000;


    if ( HS_CNT<200 || HS_CNT>620) ColorOutput=8'b01101111;//跑道左右两侧的颜色;


//----------------不加速时,判断小人是否碰到障碍物及是否吃到加速-----------//  
  if(jiasu==0)begin
    if(k1==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recbx1;
            y2=recby+cnt1;
            if(  (x2+recbl)>x1 && (y2+recbh)>y1 && (y1+recch)>y2 ) si1=1;
        end
    if(k2==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recbx2;
            y2=recby+cnt2;
             if((reccx-20*res)>recbx2)
                begin
                   if(  (x2+recbl)>x1 && (y2+recbh)>y1 && (y1+recch)>y2 ) si2=1;
                end
             else
                if((x1+reccl)>x2 && (y2+recbh)>y1 && (y1+recch)>y2) si2=1;

        end
    if(k3==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recbx3;
            y2=recby+cnt3;
            if(  (x1+reccl)>x2 && (y2+recbh)>y1 && (y1+recch)>y2 ) si3=1;
        end

    if( (si1==1) && (recby+cnt1>reccy+recch) ) begin life1=life1-1;si1=0;end//碰到障碍物减生命值
    if( (si2==1) && (recby+cnt2>reccy+recch) ) begin life1=life1-1;si2=0;end//碰到障碍物减生命值
    if( (si3==1) && (recby+cnt3>reccy+recch) ) begin life1=life1-1;si3=0;end//碰到障碍物减生命值

    if(k4==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recdx1;
            y2=recdy+cnt4;
            if( x1==x2-10 && y2>=y1 ) begin jiasu=1;v1=2*v1;v2=2*v2;life1=life1+1;k4=0;end 
            else jiasu=0;
        end
    if(k5==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recdx2;
            y2=recdy+cnt5;
            if( x1==x2-10 && y1==y2 ) begin jiasu=1;v1=2*v1;v2=2*v2;life1=life1+1;k5=0;end  
            else jiasu=0;
        end
    if(k6==1)  
        begin 
            x1=reccx-20*res;
            y1=reccy;
            x2=recdx3;
            y2=recdy+cnt6;
            if( x1==x2-10 && y1==y2 ) begin jiasu=1;v1=2*v1;v2=2*v2;life1=life1+1;k6=0;end  
            else jiasu=0;
        end

    end
    if(life1==0) endg=1;  //没有生命时游戏结束




    end
//-----------------------游戏结束时显示“END”------------------------//
   else begin       ///endgame

       if(HS_CNT==12'd380) char_bit<=6'd47;
            else if(HS_CNT>380&&HS_CNT<428) char_bit<=char_bit-1'b1;

      if(Blank)  ColorOutput=8'b00000000;
        else if(HS_CNT>380&&HS_CNT<428)
        begin
            case(y_dis)131:if(char_line0[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    132:if(char_line1[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    133:if(char_line2[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    134:if(char_line3[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    135:if(char_line4[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    136:if(char_line5[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    137:if(char_line6[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    138:if(char_line7[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    139:if(char_line8[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    140:if(char_line9[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    141:if(char_line10[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    142:if(char_line11[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    143:if(char_line12[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    144:if(char_line13[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    145:if(char_line14[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    146:if(char_line15[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    147:if(char_line16[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    148:if(char_line17[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    149:if(char_line18[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    150:if(char_line19[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    151:if(char_line20[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    152:if(char_line21[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    153:if(char_line22[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    154:if(char_line23[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    155:if(char_line24[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    156:if(char_line25[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    157:if(char_line26[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    158:if(char_line27[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    159:if(char_line28[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    160:if(char_line29[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    161:if(char_line30[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    162:if(char_line31[char_bit]) ColorOutput=8'b111_000_00;
                                else ColorOutput=8'b000_000_00;
                    default:ColorOutput=8'b000_000_00;
                    endcase
                    end
                    else ColorOutput=8'b000_000_00;
     if(reset==1) begin endg=0;life1=3;p2=1;end   //重置
end
end  
endmodule

随机数生成模块:

module suiji(
    input               clk_25M,      /*clock signal*/
    output reg [7:0]    rand_num=8'b11111111  /*random number output*/
);

always@(posedge clk_25M )
begin
            rand_num[0] <= rand_num[7];
            rand_num[1] <= rand_num[0];
            rand_num[2] <= rand_num[1];
            rand_num[3] <= rand_num[2];
            rand_num[4] <= rand_num[3]^rand_num[7];
            rand_num[5] <= rand_num[4]^rand_num[7];
            rand_num[6] <= rand_num[5]^rand_num[7];
            rand_num[7] <= rand_num[6];


end
endmodule

数码管显示模块:

module shumaguan(digit_anode,segment,CLK,fenshu2,fenshu1,fenshu0,shengming);
input CLK;
input [3:0] fenshu2;
input [3:0] fenshu1;
input [3:0] fenshu0;
input [3:0] shengming;
output [3:0] digit_anode;//四个8段数码管选择
output [7:0] segment;//数码管的8段
reg  [6:0]       cnt1=0;
reg  [6:0]       cnt2=0;
reg  [6:0]       cnt3=0;
reg  [6:0]       cnt4=0;
reg  [6:0]       k=2;
reg  [3:0]       k1=3;
reg [3:0] digit_anode;
reg [7:0] segment;



always@(posedge CLK)
begin


//----------消影计数--------------//
    if(k==1&&cnt1<=10) cnt1=cnt1+1;
    if(k==1&&cnt1>10) 
      begin 
        cnt1=0;
        k=2;
      end

    if(k==2&&cnt2<=10) cnt2=cnt2+1;
   if(k==2&&cnt2>10)    
      begin 
        cnt2=0;
        k=3;
      end

    if(k==3&&cnt3<=10) cnt3=cnt3+1;
   if(k==3&&cnt3>10)    
      begin 
        cnt3=0;
        k=4;
      end
    if(k==4&&cnt4<=10) cnt4=cnt4+1;
   if(k==4&&cnt4>10)    
      begin 
        cnt4=0;
        k=1;
      end

//------------数码管显示-------------//

      if(k==1&&cnt1<=k1)       
       begin       //第一个数码管显示,显示分数的百位
            digit_anode=4'b0111;
            case(fenshu2)
                4'b0000:segment=8'b11000000;
                4'b0001:segment=8'b11111001;
                4'b0010:segment=8'b10100100;
                4'b0011:segment=8'b10110000;
                4'b0100:segment=8'b10011001;
                4'b0101:segment=8'b10010010;
                4'b0110:segment=8'b10000010;
                4'b0111:segment=8'b11111000;
                4'b1000:segment=8'b10000000;
                4'b1001:segment=8'b10010000;
        endcase
        end
        if(k==1&&cnt1>k1) digit_anode=4'b1111;
        if(k==2&&cnt2begin           ////第二个数码管显示,显示分数的十位
            digit_anode=4'b1011;
            case(fenshu1)
                4'b0000:segment=8'b11000000;
                4'b0001:segment=8'b11111001;
                4'b0010:segment=8'b10100100;
                4'b0011:segment=8'b10110000;
                4'b0100:segment=8'b10011001;
                4'b0101:segment=8'b10010010;
                4'b0110:segment=8'b10000010;
                4'b0111:segment=8'b11111000;
                4'b1000:segment=8'b10000000;
                4'b1001:segment=8'b10010000;
            endcase
        end 
        if(k==2&&cnt2>k1) digit_anode=4'b1111;
        if(k==3&&cnt3<=k1) 
        begin       ////第三个数码管显示,显示分数的个位
            digit_anode=4'b1101;
            case(fenshu0)
                4'b0000:segment=8'b11000000;
                4'b0001:segment=8'b11111001;
                4'b0010:segment=8'b10100100;
                4'b0011:segment=8'b10110000;
                4'b0100:segment=8'b10011001;
                4'b0101:segment=8'b10010010;
                4'b0110:segment=8'b10000010;
                4'b0111:segment=8'b11111000;
                4'b1000:segment=8'b10000000;
                4'b1001:segment=8'b10010000;
            endcase
                end 
        if(k==3&&cnt3>k1) digit_anode=4'b1111;
        if(k==4&&cnt4<=k1) 
        begin       ////第四个数码管显示,显示生命值
            digit_anode=4'b1110;
            case(shengming)
                4'b0000:segment=8'b11000000;
                4'b0001:segment=8'b11111001;
                4'b0010:segment=8'b10100100;
                4'b0011:segment=8'b10110000;
                4'b0100:segment=8'b10011001;
                4'b0101:segment=8'b10010010;
                4'b0110:segment=8'b10000010;
                4'b0111:segment=8'b11111000;
                4'b1000:segment=8'b10000000;
                4'b1001:segment=8'b10010000;
            endcase
                end 
        if(k==4&&cnt4>k1) digit_anode=4'b1111;

end
endmodule

分频模块:

module fenpin(clk,clk_50M,clk_25M,clk_50M1
    );
input clk;
output clk_50M;
output clk_50M1;
output reg clk_25M;

always @(posedge clk)
 clk_25M = ~clk_25M;

assign clk_50M=clk;
assign clk_50M1=clk;

endmodule

分数计算模块:

module bcd (life,fenshu,fenshu2,fenshu1,fenshu0,shengming);  //  
parameter  B_SIZE = 8;  //B_SIZE为二进制数所占的位数,可根据需要进行扩展 
parameter  ena=1;
input    [3:0]   life;
input    [7:0]   fenshu;  
output  reg [3:0]   fenshu2;  
output  reg [3:0]   fenshu1;
output  reg[3:0]   fenshu0;
output   [3:0]   shengming;  


wire  [B_SIZE-1 : 0]   binary; 
reg   [B_SIZE-1 : 0]   bin; 
reg   [B_SIZE+3 : 0]  bcd;  // bcd的长度应根据实际情况进行修改 
reg   [B_SIZE+3 : 0]  result; //result的长度=bcd的长度  

always@( fenshu )
 begin   
    bin = fenshu;  result = 0;
    if ( ena == 0 )   bcd = 0; 
    else 
        begin 
            repeat ( B_SIZE-1 )    //使用repeat语句进行循环计算   
                begin 
                    result[0] = bin[B_SIZE-1]; 
                    if ( result[3 : 0] > 4 )     
                        result[3 : 0] = result[3 : 0] + 4'd3;
                    if ( result[7 : 4] > 4 )     
                        result[7 : 4] = result[7 : 4] + 4'd3;
                    if ( result[11 : 8] > 4 )    
                        result[11 : 8] = result[11 : 8] + 4'd3; 
                        result = result << 1;    
                        bin = bin << 1; 
                end   
                result[0] = bin[B_SIZE-1];
        end
        fenshu2=result[11:8];
        fenshu1=result[7:4];
        fenshu0=result[3:0];
 end 
 assign shengming=life;

endmodule

引脚ucf模块:

NET "clk" LOC = "B8";
NET "rest" LOC = "A7";
NET "leda" LOC = "G1";
NET "nandu" LOC = "N3";
NET "left" LOC = "C11";
NET "right" LOC = "G12";
NET "VS" LOC = "K13";
NET "HS" LOC = "J14";
NET "RED<0>" LOC = "C14";
NET "RED<1>" LOC = "D13";
NET "RED<2>" LOC = "F13";
NET "GREEN<0>" LOC = "F14";
NET "GREEN<1>" LOC = "G13";
NET "GREEN<2>" LOC = "G14";
NET "BLUE<0>" LOC = "H13";
NET "BLUE<1>" LOC = "J13";



//NET "led1" LOC="G1";
NET "digit_anode<0>" LOC="F12";
NET "digit_anode<1>" LOC="J12";
NET "digit_anode<2>" LOC="M13";
NET "digit_anode<3>" LOC="K14";
NET "segment<0>" LOC="L14";
NET "segment<1>" LOC="H12";
NET "segment<2>" LOC="N14";
NET "segment<3>" LOC="N11";
NET "segment<4>" LOC="P12";
NET "segment<5>" LOC="L13";
NET "segment<6>" LOC="M12";
NET "segment<7>" LOC="N13";


NET "left" CLOCK_DEDICATED_ROUTE = FALSE;
NET "right" CLOCK_DEDICATED_ROUTE = FALSE;

你可能感兴趣的:(编程)