实验四七段数码管的动态扫描显示一、实验目的1.进一步熟悉QuartusII软件进行FPGA设计的流程;2.掌握利用宏功能模块进行常用的计数器,译码器的设计;3.学习和了解动态扫描数码管的工作原理的程序设计方法;二、实验原理及过程实验板上面常用的4为联体的共阳极7段数码管。其接口电路是把所有数码管的8个笔划段a-h同名端连接起来,而每一个数码管由一个独立的公共极COM端控制。对于这种结构的数码管,采用动态显示的方法是最为广泛的一种显示方式之一。在轮流点亮的过程中每位显示器的点亮时间都极为短暂,但由于人的视觉暂留现象以及发光二极管的余晖效应,尽管实际上每个显示器并非同时点亮,但只要扫描的速度足够快(如达到30Hz以上),给人的印象就是一组稳定的显示数据,不会有闪烁感。本次实验要求在实验板上实现显示00000000-99999999的十进制计数器。使用的是宏模块产生一个16位的二进制计数器counter()作为4个数码管的显示数据;编写一个分频模块div,其输出作为计数器counter()的时钟信号;编写数码管驱动模块segmain,完成7段译码和扫描显示控制1、建立工程,并建立顶层图。2、设计计数时钟设计一分频器,对50Mhz分频输出到计数器,让计数器以较慢速度递增。建立.v文件,输入以下代码moduleint_div(clk,div_out);inputclk;outputregdiv_out;reg[31:0]clk_div;parameterCLK_FREQ='D50_000_000;parameterDCLK_FREQ='D10;always@(posedgeclk)beginif(clk_divCLK_FREQ/DCLK_FREQ)clk_div=clk_div+1;elsebeginclk_div=0;div_out=~div_out;endendendmodule输入完成后,将该文件设为顶层文件,并分析该设计文件,用于检查设计错误。检查无误后,要生成一个分频器的原件符号,根据步骤建立该原件的原件符号。3、数码管扫描显示程序设计数码管扫描显示程序如下:modulesegmain(clk,reset_n,datain,seg_data,seg_com);inputclk;inputreset_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用于计数integert;//一个整形变量talways@(posedgeclk)//always语句用于判断当上升沿来到时计数器的状态,并且设置计数器的归零功能beginif(!reset_n)count=0;elsebegincount=count+1;t=datain;endendalways@(count[14:12]ordatain)//判断已经计数的状态,并将相应的数码管变亮begincase(count[14:12])3'b000:begint=t%10;bcd_led=t[3:0];seg_com=8'b11111110;end3'b001:begint=t%100/10;bcd_led=t[3:0];seg_com=8'b11111101;end3'b010:begint=t%1000/100;bcd_led=t[3:0];seg_com=8'b11111011;end3'b011:begint=t%10000/1000;bcd_led=t[3:0];seg_com=8'b11110111;end3'b100:begint=t%100000/10000;bcd_led=t[3:0];seg_com=8'b11101111;end3'b101:begint=t%1000000/100000;bcd_led=t[3:0];seg_com=8'b11011111;end3'b110:begint=t%10000000/1000000;bcd_led=t[3:0];seg_com=8'b10111111;end3'b111:begint=t%100000000/10000000;bcd_led=t[3:0];seg_com=8'b01111111;endendcaseendalways@(seg_comorbcd_led)begincase(bcd_led)//判断led的数值4'h0:seg_data=8'hc0;//共阳低有效4'h1:seg_data=8'hf9;4'h2:seg_data=8'ha4;4'h3:seg_data=8'hb0;4'h4:seg_data=8'h99;4'h5:seg_data=8'h92;4'h6:seg_data=8'h82;4'h7:seg_data=8'hf8;4'h8:seg_data=8'h80;4'h9:seg_data=8'h90;4'ha:seg_data=8'h88;4'hb:seg_data=8'h83;4'hc:seg_data=8'hc6;4'hd:seg_data=8'ha1;4'he:seg_data=8'h86;4'hf:seg_data=8'h8e;default:seg_data=8'hc0;endcaseendendmodule输入完成后,将其设为顶层文件,检验后生成原件符号。4.调用宏模块设计计数器。双击顶层图空白处,弹出symbol对话框,展开library,找到lmp-counter,弹出宏模块设置对话框,根据讲义和实验要求对其进行设定。5.设计完整的顶层。返回顶层原理图,根据讲义和需要添加原件完成完整的图。其图如下所示:6.设置芯片和管脚。参照讲义进行芯片和管脚的配置,并运行该脚本。7.编译。将顶层图设为当前顶层实体,然后编译8.接好下载线,进行下载,下载完成后,会看到8个数码管会显示数值,按reset按钮则清零。三、实验小结根据本次实验,进一步熟悉了quartus2软件进行设计的流程。对如何利用宏功能模块进行计数器,译码器的设计有了初步的了解与掌握。实验后了解了数码管的工作原理,对如何实现显示功能有了很大的提高。通过实验学会举一反三,能够通过课本上的例子进行其他进制的代码编写,并能够实现相应的功能。在进行调用宏模块设计计数器步骤时,要仔细参透实验要求,进行相应的设定,这样才会实现。在实验中尽可能的减少错误和警告次数的出现,并能够根据错误提示,找出问题所在,多请教老师和同学掌握和吸收实验中的精华。