1、4、计时模块初始化之后开始倒计时,每秒递减5、计数模块每次投中球,计数加一三、五个模块的具体完成过程:在上完理论课之后,我们对Verilog和VHDL语言有了初步的了解,老师告诉我们这门课的关键在于自己的动手实践,于是我们实验小组着手开始了投篮机的设计实践。首先通过查阅老师给的课件和网上的一些资料,熟悉了一下Quartusii的操作流程,并对两种硬件描述语言有了一个更深的了解,但同时也遇到很多不明白的地方,通过向老师的咨询,对投篮机模块有了一个感性的认识,并准备采用分解模块的方法,进行初步的实践。随后我们着手进行实现投篮机功能所需模块代码的编写。起初,我们简单的认为,投篮机无非就是一个计数模块
2、,一个倒计时模块,因此我们只编写这两个模块的代码。如下:计数模块:module Counter99(LED, keytouch, clr); input keytouch, clr; output7:0 LED; reg7: always(posedge keytouch or negedge clr) begin if(!clr) LED = 8h00; else if(LED3:0 = 4d9) begin LED3:0 = 4d0; if(LED7:4 = 9) LED7:4 = 4 else 4 = LED7:4 + 1b1; end else = LED3:0 + 1 endendm
3、odule计时模块:module BCD_cnt59(qout, clktouch, reset);0 qout;0qout; input clktouch,reset; always(posedge clktouch or negedge reset ) if(!reset) qout = 0; else if(qout3:d0) qout3:= 9; if(qout7:4 = 0) qout7:= 5; else4 = qout7:4 - 1 else qout3:= qout3:0 - 1 endmodule通过在Quartusii上编译,运行,波形仿真,无误。波形图如下:图1 Coun
4、ter99功能仿真波形图图2 BCD_59功能仿真波形图经过仔细观察开发板,发现KX-7C5T00578型号开发板只有三个数码管,其中有两个直接是BCD形式的,有一个是七段形式的,还少一个数码管,我们决定用LED灯来代替倒计时的十位数字,七段数码管显示倒计时的个位数字,另外两个数码管分别显示计数器的十位、个位。为此我们还需要编写译码器模块。经过几次改写,译码器代码编写成功如下:七段译码模块:module BCD1(in , LED); output4: input3:0 in; reg4: always(in) case(in) 4d0:LED = 5b00000;d1:b10000;d2:b
5、11000;d3:b11100;d4:b11110;d5:b11111 default:bx; endcase对LED灯的译码: module BCD2(in , LED); output6: reg6:LED = 7b1111110;b0110000;b1101101;b1111001;b0110011;b1011011;d6:b1011111;d7:b1110000;d8:b1111111;d9:b1111011; 开发板系统时钟是20MHz ,而计数器采用的是按键触发,考虑到按键一下的平均时间是几个毫秒,所以我们需要把系统时钟分频到1KHz,所以这里就要用到分频模块和按键消抖模块。在老师
6、的指导下,我们写出了这两个程序,如下:分频模块(20MHz1KHz):module clk_div1(clk_20M , clk1k); input clk_20M; output clk1k; reg R_clk1k = 0; assign clk1k = R_clk1k ; reg 15:0 counter = 0; always ( posedge clk_20M ) if(counter = 19999) counter = counter + 1; end = 9999 ) R_clk1k = 1; end endmodule 按键消抖模块:module sample(keyout,
7、 clk, keyin); input clk , keyin; output keyout; reg3:0 samp_count; reg keyout; initial samp_count b0000; always (posedge clk) samp_count3:1 = samp_count2:0; samp_count0 = keyin; if (samp_count = 4b1111) keyout = 1b0;经过这几个步骤,采用按键触发的计时器模块就能成功运行了。考虑到倒计时是每秒数值减一,我们还必须利用系统时钟产生秒信号。之前已经将20MHz时钟分频到1KHz,我们还需要
8、继续分频,把1KHz时钟分频到1Hz,以产生秒时钟。程序如下:分频模块(1KHz1Hz):module clk_div2(inclk , outclk); input inclk; output outclk; reg outclk; integer N = 1000; integer k; always (posedge inclk) if(k N/2) outclk = 1 k = k + 1; if(k = N) k = 0;至此,我们把所有的代码编写完毕。我们将功能需求转换为器件模块图。确定模块名称与每个模块的I/O端口名称,并确定模块之间的连接关系。全部连接好并且成功分配好管脚的图如下:图3 核心控制模块图此处需要注意分配管脚完成后一定要再编译一次,确认无误后把程序下载到开发板中。实验结果:在老师的指点下,成功的使用硬件描述语言编写出投篮机的功能代码,并实现了功能的仿真,达到了预期的设计实践的目的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1