16x16点阵显示实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16*16点阵显示实验报告

一、实验目的

(1)学习点阵显示字符的基本原理。

(2)掌握用数控分频控制速度,实现点阵扫描的基本方式。

(3)会使用Quartus II软件中的Verilog HDL语言实现点真的行列循环显示。

二、实验设备与器件

Quartus II 软件、EP2C8Q208C8实验箱

三、实验方案设计

1.实验可实现的功能

可通过编写Verilog HDL语言,实现点阵的行列交替扫描。先是行扫描,扫描间隔为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所示。

图3.3.1 系统功能图示

通过流程图可以看到,体统是先将试验箱的50MHz时钟信号分频为1s,因为要实现16*16的点阵扫描,所以用一个16s的计时器计时,每经过16s行扫描与列扫描的状态转换一次,通过点阵显示出来。

4.模块化程序设计

(1)点阵显示顶层程序设计

module dianzhen (clk50mhz,row,sel0,sel1,sel2,sel3,line);

input clk50mhz; //实验箱提供50MHz

时钟信号output sel0,sel1,sel2,sel3; //设置引脚选通点阵

output reg [15:0] row; //行

output reg [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计数子

assign sel0=1'b0;

assign sel1=1'b1;

assign sel2=1'b0;

assign sel3=1'b0;

always@(posedge clk50mhz)

begin

if(cnt>=25'd5*******)

begin

cnt<=25'b0; //1Hz计时器

cnt1<=cnt1+1; //16s计时器

end

else

cnt<=cnt+1;

end

hangsaomiao u1(.clk50mhz(clk50mhz),.row(row1),.line(line1)); liesaomiao u2(.clk50mhz(clk50mhz),.row(row2),.line(line2));

always@(*)

if(cnt1<=5'd15)

begin

row<=row1; //行扫描

line<=line1;

end

else

begin

row<=row2; //列扫描

line<=line2;

end

endmodule

(2)行扫描模块hangsaomiao.v程序设计

module hangsaomiao(clk50mhz,line,row);

input clk50mhz; //实验箱输入50MHz时钟信号output reg [15:0] row; //列

output reg [3:0] line; //行

reg [24:0] cnt1,cnt2; //计数子

reg clkrow,clkline; //行脉冲、列脉冲always@(posedge clk50mhz)

begin

if(cnt1>=25'd5*******)

begin

cnt1<=25'b0;

clkrow=~clkrow; //1s列脉冲end

else

cnt1<=cnt1+1;

end

always@(posedge clk50mhz)

begin

if(cnt2>=25'd500)

begin

cnt2<=25'b0;

clkline=~clkline; //50KHz行脉冲

end

else

cnt2<=cnt2+1;

end

always@(posedge clkline)

begin

case(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;

endcase

end

always@(posedge clkrow) //时间间隔为1s的列扫描begin

case(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;

相关文档
最新文档