游戏主逻辑:
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;