基于Basys 2的VGA视频游戏——Running man
来源:互联网 发布:如何复制知乎的文字 编辑:程序博客网 时间:2024/05/17 10:08
基于Basys 2的VGA视频游戏
一、实验目的
- 掌握ISE软件及FPGA开发板的基本结构
- 熟练应用Verilog语言编程实现
- 掌握VGA的显示方法并将其应用到自己的游戏之中
二、模块结构
三、游戏画面展示
四、实验源代码
游戏主逻辑:
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;
阅读全文
0 0
- 基于Basys 2的VGA视频游戏——Running man
- 基于FPGA的VGA视频弹球游戏
- 基于BASYS 2开发板的多功能数字钟Verilog程序
- 基于Basys 3的四位加法运算器
- 基于TMS320DM355的VGA视频采集系统的设计与实现
- 视频图像传输与显示(5)——视频图像阵列VGA及其时序的VHDL实现
- 显示器VGA视频数据线的问题
- 171024 .vga网页视频的增质快放
- 计算机的组成 —— VGA
- 基于VGA的常见显示屏像素
- 基于fpga的vga图片显示
- 基于FPGA的VGA彩条发生器
- the running man 【NOJ】
- 常用接口介绍06——视频篇04——VGA接口
- VGA视频调试总结
- VGA视频显示
- 今日推荐。基于unity的游戏开发视频,适合自学。
- 如何同步播放asf和vga文件的教学视频
- centos6.8配置nginx
- Spring从IOC(Inversion of Control:控制反转)开始
- 怎样在SQL SERVER中添加系统默认时间字段
- 分布式调用跟踪与监控实战
- Swift: 获取目录结构
- 基于Basys 2的VGA视频游戏——Running man
- 关于线程死锁的了解(LIUNX)
- FT(IG)显著+分割+Surf识别笔记(一)
- 基于caffe的鉴黄图片分类c++代码
- Qt的Model/View Framework解析
- C++/CLI:第一流的CLI语言
- 设计模式用前须知
- 2017年华为软件精英挑战赛初赛解题思路
- java汉子转拼音