16x16点阵显示实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;