使用Verilog语言编写的投篮机模块Word下载.docx
《使用Verilog语言编写的投篮机模块Word下载.docx》由会员分享,可在线阅读,更多相关《使用Verilog语言编写的投篮机模块Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
![使用Verilog语言编写的投篮机模块Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/3/fa4670d1-2cc6-40f3-a684-37dd8802bcaa/fa4670d1-2cc6-40f3-a684-37dd8802bcaa1.gif)
4、计时模块—初始化之后开始倒计时,每秒递减
5、计数模块—每次投中球,计数加一
三、五个模块的具体完成过程:
在上完理论课之后,我们对Verilog和VHDL语言有了初步的了解,老师告诉我们这门课的关键在于自己的动手实践,于是我们实验小组着手开始了投篮机的设计实践。
首先通过查阅老师给的课件和网上的一些资料,熟悉了一下Quartusii的操作流程,并对两种硬件描述语言有了一个更深的了解,但同时也遇到很多不明白的地方,通过向老师的咨询,对投篮机模块有了一个感性的认识,并准备采用分解模块的方法,进行初步的实践。
随后我们着手进行实现投篮机功能所需模块代码的编写。
起初,我们简单的认为,投篮机无非就是一个计数模块,一个倒计时模块,因此我们只编写这两个模块的代码。
如下:
计数模块:
moduleCounter99(LED,keytouch,clr);
inputkeytouch,clr;
output[7:
0]LED;
reg[7:
always@(posedgekeytouchornegedgeclr)
begin
if(!
clr)
LED<
=8'
h00;
else
if(LED[3:
0]==4'
d9)
begin
LED[3:
0]<
=4'
d0;
if(LED[7:
4]==9)
LED[7:
4]=4'
else
4]<
=LED[7:
4]+1'
b1;
end
else
=LED[3:
0]+1'
end
endmodule
计时模块:
moduleBCD_cnt59(qout,clktouch,reset);
0]qout;
0]qout;
inputclktouch,reset;
always@(posedgeclktouchornegedgereset)
if(!
reset)
qout<
=0;
else
if(qout[3:
d0)
qout[3:
=9;
if(qout[7:
4]==0)
qout[7:
=5;
else
4]=qout[7:
4]-1'
elseqout[3:
=qout[3:
0]-1'
endmodule
通过在Quartusii上编译,运行,波形仿真,无误。
波形图如下:
图1Counter99功能仿真波形图
图2BCD_59功能仿真波形图
经过仔细观察开发板,发现KX-7C5T00578型号开发板只有三个数码管,其中有两个直接是BCD形式的,有一个是七段形式的,还少一个数码管,我们决定用LED灯来代替倒计时的十位数字,七段数码管显示倒计时的个位数字,另外两个数码管分别显示计数器的十位、个位。
为此我们还需要编写译码器模块。
经过几次改写,译码器代码编写成功如下:
七段译码模块:
moduleBCD1(in,LED);
output[4:
input[3:
0]in;
reg[4:
always@(in)
case(in)
4'
d0:
LED=5'
b00000;
d1:
b10000;
d2:
b11000;
d3:
b11100;
d4:
b11110;
d5:
b11111
default:
bx;
endcase
对LED灯的译码:
moduleBCD2(in,LED);
output[6:
reg[6:
LED=7'
b1111110;
b0110000;
b1101101;
b1111001;
b0110011;
b1011011;
d6:
b1011111;
d7:
b1110000;
d8:
b1111111;
d9:
b1111011;
开发板系统时钟是20MHz,而计数器采用的是按键触发,考虑到按键一下的平均时间是几个毫秒,所以我们需要把系统时钟分频到1KHz,所以这里就要用到分频模块和按键消抖模块。
在老师的指导下,我们写出了这两个程序,如下:
分频模块(20MHz——1KHz):
moduleclk_div1(clk_20M,clk1k);
inputclk_20M;
outputclk1k;
regR_clk1k=0;
assignclk1k=R_clk1k;
reg[15:
0]counter=0;
always@(posedgeclk_20M)
if(counter<
=19999)
counter<
=counter+1;
end
=9999)
R_clk1k<
=1;
end
endmodule
按键消抖模块:
modulesample(keyout,clk,keyin);
inputclk,keyin;
outputkeyout;
reg[3:
0]samp_count;
regkeyout;
initial
samp_count<
b0000;
always@(posedgeclk)
samp_count[3:
1]<
=samp_count[2:
0];
samp_count[0]<
=keyin;
if(samp_count==4'
b1111)
keyout<
=1'
b0;
经过这几个步骤,采用按键触发的计时器模块就能成功运行了。
考虑到倒计时是每秒数值减一,我们还必须利用系统时钟产生秒信号。
之前已经将20MHz时钟分频到1KHz,我们还需要继续分频,把1KHz时钟分频到1Hz,以产生秒时钟。
程序如下:
分频模块(1KHz——1Hz):
moduleclk_div2(inclk,outclk);
inputinclk;
outputoutclk;
regoutclk;
integerN=1000;
integerk;
always@(posedgeinclk)
if(k<
N/2)
outclk=1'
k=k+1;
if(k==N)
k=0;
至此,我们把所有的代码编写完毕。
我们将功能需求转换为器件模块图。
确定模块名称与每个模块的I/O端口名称,并确定模块之间的连接关系。
全部连接好并且成功分配好管脚的图如下:
图3核心控制模块图
此处需要注意分配管脚完成后一定要再编译一次,确认无误后把程序下载到开发板中。
实验结果:
在老师的指点下,成功的使用硬件描述语言编写出投篮机的功能代码,并实现了功能的仿真,达到了预期的设计实践的目的。