基于单片机和可编程逻辑器件实现LED显示屏
LED显示屏主要由电流驱动电路及LED点阵阵列、控制系统和PC端管理软件三部分构成(图1)。控制系统负责接收、转换和处理各种外部信号,并实现扫描控制,然后驱动LED点阵显示需要的文字或图案。控制系统作为LED显示屏的核心部分,直接决定了显示屏的显示效果和性能的优劣。本文详细分析采用Verilog HDL对ATF1508AS进行编程,实现双口RAM访问和产生LED点阵驱动电路所需的各种时序信号。
1 LED显示屏的基本结构及关键技术
本系统设计中,控制系统采用单片机+CPLD的方案来实现,整个控制系统可分为:信号接收及处理模块和CPLD的扫描控制模块和LED点阵驱动模块,如图1 所示。本系统的关键技术是使用双口RAM和CPLD芯片,解决LED显示屏中高速数据传输和快速扫描控制的难题,大大提高了动态显示的刷新率。
信号接收与处理模块的功能是AT89S52单片机通过串口接收PC送来的点阵信息,同时对点阵信息做各种不同的处理。利用双口RAM IDT7007在单片机和ATF1508AS之间以共享的方式建立高速的数据交换通道。
500)this.style.width=500;" onmousewheel="return bbimg(this)" src="/arTIcle/UploadPic/2009-12/20091224175028385.jpg" />
CPLD的扫描控制模块采用ATF1508AS芯片实现。其功能是从双口RAM读取点阵信息,串行化后送显示扫描驱动电路,同时输出各种所需的控制信号。CPLD具有扫描速度快,延时短等特点,克服了单片机由于传输速率慢而造成在大屏幕显示时产生的闪烁效应。
2 基于CPLD的扫描控制模块的设计
2.1 设计思想
本模块的功能是从存储器中读取数据,将数据输送到显示屏体上,同时产生各种控制信号。时序产生模块由两部分构成,一是产生访问双口RAM的时序,二是产生LED显示屏接口所需的各种信号。
扫描控制部分的原理电路如图2所示,ATF1508AS是核心部分,需要根据系统需要定义ATF1508AS的各个I/O端口,下面是I/O端口定义和内部寄存器定义的Verilog HDL语言代码。
500)this.style.width=500;" onmousewheel="return bbimg(this)" src="/article/UploadPic/2009-12/20091224175028305.jpg" />
module LedSequ(color, datain, addrout, CE, OE, SEMR, RWC, sdr, sdb, sck, le, oe1, cs, clk, counter);
input clk; //系统时钟
input[7:0] datain;//RAM数据输入
input[1:0] color;//颜色控制
output[13:0] addrout;//地址输出口
output SEMR,RWC;
output CE,OE,sdr,sdb,sck,le,oe1,cs;
output[3:0] counter;
reg[3:0] hcnt;//38译码器计数器
reg [7:0] data1;//数据寄存器
reg[3:0] counter;//38翻码器输出端
reg SEMR,RWC;
reg SDA,SDC;
reg[13:0] addrout,addr;//addr地址计数器
reg[3:0] state;// 状态寄存器
reg [2:0] shcnt; //移位脉冲读数器
reg CE,OE,sdr,sdb,sck,le,oe1,cs;
reg [8:0] byte;
parameter s0=1'd0,s1=1'd1,s2=1'd2,s3=1'd3, s4=1'd4, s5=1'd5; //状态常量
2.2 访问双口RAM时序的产生
IDT7007是具有32KB的双口RAM电路,与ATF1508AS的连接电路如图2所示,其中: 为片选信号, 为读写控制信号, 为输出使能信号,A0R-A13R为右端口地址总线,D0R-D7R为右端口数据总线,其右端口读写时序如图4所示。我们采用有限状态机实现,其基本工作原理是:S0状态进行初始化,S1状态时ATF1508AS首先输出地址信号addrout,然后置 相有效,S2状态读取双口RAM的数据,并存储到内容寄存器datain中,从而完成双口RAM的读数据过程。下面给出ATF1508AS读取双口RAM数据的主要代码:
always @ (posedge clk)
begin //每个时钟周期,状态变化一次
case(state)
s0: begin //初始化状态
CE=1'b0; //IDT7007片选
OE=1'b1; //IDT7007读选通
le=1'b0;
oe1 = 1'b0;
cs = 1'b0;
addr= 14'b0;
SEMR=1'b1; //IDT7007 置1有
RWC = 1'b1; //写控制 1
hcnt=4'b0000;
counter=4'b0000;
state=s1;
end
s1: begin //输出RAM地址
CE=1'b0;
addrout=addr;//输出地址
OE=1'b0;
SEMR=1'b1;
RWC = 1'b1;
shcnt = 3'b000;
state=s2;
end
s2: begin //读双口RAM数据
oe1=1'b0;
data1 = datain;
state=s3;
end
……(显示扫描及LED驱动代码部分)
endcase
end
500)this.style.width=500;" onmousewheel="return bbimg(this)" src="/article/UploadPic/2009-12/20091224175028446.jpg" />
500)this.style.width=500;" onmousewheel="return bbimg(this)" src="/article/UploadPic/2009-12/20091224175028353.jpg" />
2.3 LED显示驱动时序信号的产生
CPLD 与LED点阵的驱动电路接口如图 所示,其中:CS为3-8译码器片选信号;OE为BMI5026输出使能信号,控制LED点阵是否能被点亮;LE为驱动芯片数据锁存信号;sck为移位脉冲,将CPLD串行输出的红绿数据串行移入MBI5026(移位寄存器);A-D为双3-8译码器构成的4-16译码器的数据输入,实现显示行选通控制; sdr为红数据信号线;sdb为绿数据信号线。
其工作过程为:S3状态,sck脉冲置0,sdr和sdb分别输出一位数据;S4状态时,sck置 1,红和绿数据分别移入相应移位寄存器BMI5026,若不足8位时,返回S3状态,若不足一行时,返回S1状态,读下一个字节,若完成一行数据移位过程,则转S5状态;S5状态时,置le为0,将BMI5026的缓冲寄存中一个显示行的点阵数据送输出寄存器,同时置cs1有效,控制第hcnt行的点阵显示,然后判断一屏内容是否显示完成,返回s1状态。图4为完整的有限状态机的状态图。
下面给出LED显示屏体驱动时序信号对应的Verilog HDL程序代码:
s3: begin
sck=1'b0;
sdr= SDA && color[0];
sdb= SDC && color[1];
OE=1'b1; CE=1'b1;
state=s4;
end
s4: begin // 移位输出到LED显示屏
sck = 1'b1;
shcnt = shcnt +1'b1;
if (shcnt = = 0)
begin
addr=addr+1'b1; //读完一个字节地址记数器加1
byte=byte+8'b1;
if(byte= = nrow)// 如果读完一行数据
begin
oe1=1'b1;//关LED显示
cs=1'b1;
le=1'b0;//驱动芯片写入数据
byte = 8'b0;
state=s5;//读完一行数据则显示
end
else state=s1;
end
else state=s3; //当前字节移位输出
end
s5: begin
sck=1'b0;
le=1'b0;
counter=hcnt;
OE=1'b1;
CE=1'b0;
if(addr = = nscreen)
addr=0;
oe1=1'b0;
cs=1'b0;
state =s1;
end
500)this.style.width=500;" onmousewheel="return bbimg(this)" src="/article/UploadPic/2009-12/20091224175028693.jpg" />
4系统测试及仿真
系统的开发调试环境是:单片机部分在KeilC51下调试,CPLD部分在Maxplus10下调试。LED显示屏的扫描控制模块的Verilog HDL源程序编写完成后,在ALTERA公司Maxplus10可以先进行软件仿真,以观察各信号是否符合硬件电路所需的时序要求。图5为扫描模块 CLPD仿真结果,符合设计要求。通过JTAG接口下载到ATF1508AS后,系统工作正常。
5 结束语
基于Verilog HDL实现的LED显示屏扫描控制模块,应用于我们开发LED大屏幕电子信息显示屏系统,简化了系统结构,提高性了性价比。该LED显示屏在实际应用中具有良好的显示效果,画面清晰、性能稳定,已经在学校的多个部门得到应用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)