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

来源:互联网 发布:如何复制知乎的文字 编辑:程序博客网 时间:2024/05/17 10:08

基于Basys 2的VGA视频游戏

一、实验目的

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

二、模块结构

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<cmp1) &&(recby+cnt1) >= 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<cmp1) &&(recby+cnt2) >= 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<cmp1) &&(recby+cnt3) >= 350 ) begin k1=1;pk=1;end                         if( (k3==1)&&(recby+cnt3)>=600)                         begin k3=0;pk=1;cnt3=0;end                          if( (cnty==3)&&(lck<cmp2) ) k4=1;                           //每有一个障碍降落到底则cnty加1,当cnty==6时置零,当cnty==3时根据随机数的值选择加速小方块下落的位置;                        if( (cnty==3)&&(lck>cmp2)&&(lck<cmp3) ) k5=1;                        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   //重置endend  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];endendmodule

数码管显示模块:

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&&cnt2<k1)        begin           ////第二个数码管显示,显示分数的十位            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;endendmodule

分频模块:

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;
原创粉丝点击