七段数码管的动态扫描显示实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四七段数码管的动态扫描显示
一、实验目的
1.进一步熟悉Quartusll软件进行FPGA设计的流程;
2.掌握利用宏功能模块进行常用的计数器,译码器的设计;
3.学习和了解动态扫描数码管的工作原理的程序设计方法;
二、实验原理及过程
实验板上面常用的4 为联体的共阳极7 段数码管。其接口电路是把所有数码管的8个笔划段a-h 同名端连接起来,而每一个数码管由一个独立的公共极COM端控制。对于这种结构的数码管,采用动态显示的方法是最为广泛的一种显示方式之一。
在轮流点亮的过程中每位显示器的点亮时间都极为短暂,但由于人的视觉暂留现象以及发光二极管的余晖效应,尽管实际上每个显示器并非同时点亮,但只要扫描的速度足够快 (如达到30Hz 以上),给人的印象就是一组稳定的显示数据,不会有闪烁感。
本次实验要求在实验板上实现显示00000000-99999999的十进制计数器。使用的是宏模块产生一个16 位的二进制计数器counter() 作为4 个数码管的显示数据;编写一个分频模块div ,其输出作为计数器counter() 的时钟信号;编写数码管驱动模块segmain ,完成7 段译码和扫描显示控制
1 、建立工程,并建立顶层图。
2、设计计数时钟
设计一分频器,对50Mhz 分频输出到计数器,让计数器以
较慢速度递增。建立.v 文件,输入以下代码
module int_div(clk,div_out);
input clk;
output reg div_out;
reg[31:0] clk_div;
parameter CLK_FREQ='D50_000_000;
parameter DCLK_FREQ='D10; always@(posedge clk) begin
if(clk_div else begin clk_div<=0; div_out=~div_out; end end endmodule 输入完成后,将该文件设为顶层文件,并分析该设计文件,用 于检查设计错误。检查无误后,要生成一个分频器的原件符 号,根据步骤建立该原件的原件符号。 3、数码管扫描显示程序设计数码管扫描显示程序如下:module segmain(clk,reset_n,datain,seg_data,seg_com); input clk; input reset_n; input[31:0] datain; // 由于要显示8 位数字所以要将输入数据设为32 位output[7:0] seg_data; // 输出与例子中的一样保持不变,任然为8 位 output[7:0] seg_com; // 设置输出时要用到的8 个端口 reg[7:0] seg_com; /由于在always语句中要用到,所以再把它们都定义为寄存器变量类型 reg[7:0] seg_data;/寄存器变量 reg[3:0] bcd_led; // 寄存器变量类型 reg[36:0] count; //寄存器变量类型,同时count用于计数integer t; // 一个整形变量t always@(posedgeclk) //always 语句用于判断当上升沿来到时计数器的状态,并且设置计数器的归零功能 begin if(!reset_n) count<=0; else begin count<=count+1; t=datain; end end always@(count[14:12] or datain) // 判断已经计数的状态,并将相应的数码管变亮 begin case(count[14:12]) 3'b000: begin t=t%10; bcd_led=t[3:0]; seg_com=8'b11111110; end 3'b001: begin t=t%100/10; bcd_led=t[3:0]; seg_com=8'b11111101; end 3'b010: begin t=t%1000/100; bcd_led=t[3:0]; seg_com=8'b11111011; end 3'b011: begin t=t%10000/1000; bcd_led=t[3:0]; seg_com=8'b11110111; end 3'b100: begin t=t%100000/10000; bcd_led=t[3:0]; seg_com=8'b11101111; end 3'b101: begin t=t%1000000/100000; bcd_led=t[3:0]; seg_com=8'b11011111; end 3'b110: begin t=t%10000000/1000000; bcd_led=t[3:0]; seg_com=8'b10111111; end 3'b111: begin t=t%100000000/10000000; bcd_led=t[3:0]; seg_com=8'b01111111;