16*16点阵显示实验报告116*16点阵显示实验报告一、实验目的(1)学习点阵显示字符的基本原理。(2)掌握用数控分频控制速度,实现点阵扫描的基本方式。(3)会使用QuartusII软件中的VerilogHDL语言实现点真的行列循环显示。二、实验设备与器件QuartusII软件、EP2C8Q208C8实验箱三、实验方案设计1.实验可实现的功能可通过编写VerilogHDL语言,实现点阵的行列交替扫描。先是行扫描,扫描间隔为1s,16行都扫描完之后开始列扫描,扫描间隔仍然为1s,16列扫描完之后,行继续扫描,依次循环。2.点阵基本知识16*16扫描LED点阵只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,X0=0即可。应用时限流电阻可以放在X轴或Y轴。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。LED点阵每个点都有一个红色的发光二极管。点阵内的二极管间的连接都是行共阳,列共阴。本实验采用共阴,当二极管的共阳极为高电平,共阴极为低电平时,所接点发光;反之处于截止状态,不放光。3.系统工作原理本系统用了两个模块,其中dianzhen.v是顶层文件,而hangsaomiao.v和liesaomiao.v是两个子模块,总体的系统功能框图如图3.3.1所示。16*16点阵显示实验报告250MHz时钟信号1Hz分频16s计时器开始满16s?当前状态为行扫描?NY行扫描列扫描NY点阵结束图3.3.1系统功能图示通过流程图可以看到,体统是先将试验箱的50MHz时钟信号分频为1s,因为要实现16*16的点阵扫描,所以用一个16s的计时器计时,每经过16s行扫描与列扫描的状态转换一次,通过点阵显示出来。4.模块化程序设计(1)点阵显示顶层程序设计moduledianzhen(clk50mhz,row,sel0,sel1,sel2,sel3,line);inputclk50mhz;//实验箱提供50MHz时钟信号outputsel0,sel1,sel2,sel3;//设置引脚选通点阵outputreg[15:0]row;//行outputreg[3:0]line;//列wire[15:0]row1,row2;wire[3:0]line1,line2;reg[24:0]cnt=0;//1Hz计数子reg[4:0]cnt1=0;//16s计数子assignsel0=1'b0;assignsel1=1'b1;assignsel2=1'b0;assignsel3=1'b0;always@(posedgeclk50mhz)begin16*16点阵显示实验报告3if(cnt=25'd50000000)begincnt=25'b0;//1Hz计时器cnt1=cnt1+1;//16s计时器endelsecnt=cnt+1;endhangsaomiaou1(.clk50mhz(clk50mhz),.row(row1),.line(line1));liesaomiaou2(.clk50mhz(clk50mhz),.row(row2),.line(line2));always@(*)if(cnt1=5'd15)beginrow=row1;//行扫描line=line1;endelsebeginrow=row2;//列扫描line=line2;endendmodule(2)行扫描模块hangsaomiao.v程序设计modulehangsaomiao(clk50mhz,line,row);inputclk50mhz;//实验箱输入50MHz时钟信号outputreg[15:0]row;//列outputreg[3:0]line;//行reg[24:0]cnt1,cnt2;//计数子regclkrow,clkline;//行脉冲、列脉冲always@(posedgeclk50mhz)beginif(cnt1=25'd50000000)begincnt1=25'b0;clkrow=~clkrow;//1s列脉冲endelsecnt1=cnt1+1;endalways@(posedgeclk50mhz)beginif(cnt2=25'd500)16*16点阵显示实验报告4begincnt2=25'b0;clkline=~clkline;//50KHz行脉冲endelsecnt2=cnt2+1;endalways@(posedgeclkline)begincase(line)4'd0:line=4'd1;//高速行扫描4'd1:line=4'd2;4'd2:line=4'd3;4'd3:line=4'd4;4'd4:line=4'd5;4'd5:line=4'd6;4'd6:line=4'd7;4'd7:line=4'd8;4'd8:line=4'd9;4'd9:line=4'd10;4'd10:line=4'd11;4'd11:line=4'd12;4'd12:line=4'd13;4'd13:line=4'd14;4'd14:line=4'd15;4'd15:line=4'd0;default:line=4'd0;endcaseendalways@(posedgeclkrow)//时间间隔为1s的列扫描begincase(row)16'b0000000000000001:row=16'b0000000000000010;16'b0000000000000010:row=16'b0000000000000100;16'b0000000000000100:row=16'b0000000000001000;16'b0000000000001000:row=16'b0000000000010000;16'b0000000000010000:row=16'b0000000000100000;16'b0000000000100000:row=16'b0000000001000000;16'b0000000001000000:row=16'b0000000010000000;16'b0000000010000000:row=16'b0000000100000000;16'b0000000100000000:row=16'b0000001000000000;16'b0000001000000000:row=16'b0000010000000000;16'b0000010000000000:row=16'b0000100000000000;16'b0000100000000000:row=16'b0001000000000000;16*16点阵显示实验报告516'b0001000000000000:row=16'b0010000000000000;16'b0010000000000000:row=16'b0100000000000000;16'b0100000000000000:row=16'b1000000000000000;16'b1000000000000000:row=16'b0000000000000001;default:row=16'b0000000000000001;endcaseendendmodule(3)列扫描模块liesaomiao.v程序设计moduleliesaomiao(clk50mhz,row,line);inputclk50mhz;//实验箱输入50MHz时钟信号outputreg[15:0]row;//行outputreg[3:0]line;//列reg[24:0]cnt;//计数子regclk;always@(posedgeclk50mhz)beginif(cnt=25'd50000000)begincnt=25'b0;clk=~clk;//1sendelsecnt=cnt+1;endalways@(posedgeclk)//列扫描begincase(line)4'h0:beginrow=16'b1111111111111111;line=4'h1;end4'h1:beginrow=16'b1111111111111111;line=4'h2;end4'h2:beginrow=16'b1111111111111111;line=4'h3;end4'h3:beginrow=16'b1111111111111111;line=4'h4;end4'h4:beginrow=16'b1111111111111111;line=4'h5;end4'h5:beginrow=16'b1111111111111111;line=4'h6;end4'h6:beginrow=16'b1111111111111111;line=4'h7;end4'h7:beginrow=16'b1111111111111111;line=4'h8;end4'h8:beginrow=16'b1111111111111111;line=4'h9;end4'h9:beginrow=16'b1111111111111111;line=4'ha;end4'ha:beginrow=16'b1111111111111111;line=4'hb;end4'hb:beginrow=16'b1111111111111111;line=4'hc;end4'hc:beginrow=16'b1111111111111111;line=4'hd;end16*16点阵显示实验报告64'hd:beginrow=16'b1111111111111111;line=4'he;end4'he:beginrow=16'b1111111111111111;line=4'hf;end4'hf:beginrow=16'b1111111111111111;line=4'h0;enddefault:line=4'h0;endcaseendendmodule5.下载电路及引脚分配设计设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2、sel3四个使能端选通点阵,EP2C8Q208C8就会工作在给点阵下命令的状态,并用line和row分别作为点阵的行、列选通端,最终使得点阵正常工作,如图3.5.1所示。图3.5.1输入输出端口电路输入、输出引脚分配设计如图3.5.2所示。图3.5.2引脚分配16*16点阵显示实验报告7四、实验仿真及结论1.模块仿真(1)列扫描仿真波形列扫描仿真波形如图4.1.1所示。图4.1.1列扫描仿真波形通过波形可以看到,仿真用1s的时钟信号触发,以列为单位的二极管以1s为时间间隔一次被选中,而以行为单位的二极管始终被选通。例如,列信号选通第一列时,所有行的二极管都是亮的,综合以上两个条件,得到的最终结果就是第一列的二极管都是亮的。(2)行扫描仿真波形行扫描仿真波形如图4.1.2所示。图4.1.2行扫描仿真波形通过波形看到,行信号随着列扫描脉冲从第1行到第16行依次循环选通,而列信号则随着列脉冲从第1列到第16列依次循环选通。程序中设置的行脉冲周期为20µs,而列脉冲周期为1s,则被选通行的二极管全亮,并随着列信号的循环而移动。2.实验结论本次设计实验实现了16*16点阵行和列的依次循环扫描,行、列内部扫描的时间间隔均为1s,行列之间的循环周期为16s。先开始行扫描,行扫描完成后列再开始扫描,依次循环显示在点阵上。仿真结果与实验现象均说明了,程序设计的功能和时序基本无误,整个系统功能已实现,实验目的基本达到。16*16点阵显示实验报告8五、实验总结与体会1.实验总结总体来说这次试验还是比较顺利的,我在上实验课时弄明白了点阵的工作原理,所以当时就把点阵列扫描的功能实现了。课后我又写出行扫描的程序,不过在实验箱上下载运行时发现了一些问题。现在我主要说一下遇到的问题以解决的方案。我把原程序下