1、 LED点阵书写显示屏 摘 要 本设计运用了基于 Nios II 嵌入式处理器的 SOPC 技术。系统以 ALTERA 公司的 Cyclone II 系列 FPGA 为数字平台,将微处理器、Avalon 总线、LED 点阵扫描控制器、存储器和人机接口控制器等硬件设备集中在一片 FPGA 上,利用片内硬件来实现 LED 点阵的带地址扫描,降低系统总功耗和简化 CPU 编程的同时,提高了系统的精确度、稳定性和抗干扰性能。 关键词:SOPC FPGA 带地址扫描
2、Abstract This design using the Nios II based on embedded processor SOPC technology.ALTERA system to the company for the Cyclone II FPGA digital platform、 series、Will microprocessor、 Avalon bus of LED dot matrix scanning controller、memory and human-computer interface controller hardware device f
3、ocused on such a FPGA,Using the piece of hardware to achieve inside of LED dot matrix with address scanning, reduce the total power of the programming and simplify the CPU, improve the precision and stability of the system and the anti-jamming performance. Keyword: SOPC FPGA Address
4、 scanning 目 录 1 引言..................................................................3 2 系统方案..............................................................3 2.1主控器选择方案论证...................................................3 2.2点阵驱动方案论证.....................................................3 3
5、 理论分析与计算.......................................................4 3.1 光笔选取与参数设计..................................................5 3.2 LED点阵屏驱动参数设计........................................ ......5 3.3 屏亮自动调节设计....................................................6 3.4 超时关显示节电设计..................
6、6 4 系统电路设计.........................................................7 4.1 系统工作原理........................................................7 4.2 系统工作时序........................................................7 5 系统程序设计.................................................
7、8 5.1 系统流程概述........................................................8 5.2系统总流程图........................................................8 6 系统测试与结果.......................................................9 7 结论..................................................................9 参考文献......
8、10 附录:...................................................................10 附1:电路原理图.........................................................10 附2:扫描电路硬件描述...................................................11 附2:软核NIOS II程序.............
9、17 附4:完整的测试结果.....................................................47 1 引言 LED点阵显示屏被用到很多领域,随着电子技术的发展,LED点阵书写显示屏的广泛应用是一种趋势。传统的LED点阵显示是由微处理器实现的,但是以FPGA做控制器将成为发展趋势。 FPGA的结构灵活,其逻辑单元、可编程内部连线和I/O单元都可以由用户编程,可以实现复杂逻辑功能,满足各种设计需求。其速度快,功耗低,通用性强,特别适用于大型系
10、统的设计。使用FPGA还可以实现动态配置、在线系统重构(可以在系统运行的不同时刻,按需要改变电路的功能,使系统具备多种空间相关或时间相关的任务)及硬件软化、软件硬化等功能。用FPGA做为控制器对本系统进行设计,利用它灵活丰富的I/0资源简化了电路,降低了系统的成本。本作品用FPGA做为控制器,来实现LED点阵书写显示屏的功能。 2 系统方案 2.1 主控器选择方案论证 方案一:以 ARM 为系统控制器 采用 32 位 RISC 微处理器 ARM 实现点阵屏的控制和编码功能,基本上能完成题目的要求,但是 ARM 不适合多线程操作,如果应用在系统中会使电路和软件设计变得复杂。
11、 方案二:用 FPGA 作为系统控制器 FPGA可以直接用硬件扫描、编码、解码、纠错,速度快、稳定性高、扩展性能好、体积小,可以提供丰富的逻辑单元和I/O 资源。用SOPC工具可以快速生成片上软核处理器,将所有的控制单元集成在一片FPGA芯片内,降低了额外的功耗开支。采用并行的输入/输出方式,可以达到很快的速度。这样合理的分配了FPGA 资源,具有很强的实时性和准确性。可以实现各种灵活控制。 综合考虑,最后采用方案二。 2.2点阵驱动方案论证 方案一:串行方式显示 这种显示方式由译码器单元74HC138、数据移位寄存器74HC595和列驱动器组成,点阵显示屏可以用少量I/O口接收
12、控制器传输下来的大量数据,此方案为点阵显示屏系统中比较常用的,所用器件也比较常用,容易买到。但是它存在一个致命的缺点,就是刷新速度不够快,高速度的地址编码信息无法发送。 方案二:并行方式显示 可以通过锁存器芯片来增强FPGA的I/O口的驱动能力,将32位宽的数据同时输入到LED点阵列中,达到并行控制LED点阵的目的。方案中运用4片锁存器74HC573来组成双缓冲寄存器,驱动LED点阵行线,用5片3-8译码器74HC138组合成5-32译码器对LED点阵的32列进行选取。这样就避免了各行数据显示不同步的问题。由于并行数据传输速度非常快,所以高速度的地址编码信息可以同步发出。
13、综上所述,本设计最终选择了第二个方案。 3 理论分析与计算 3.1光笔选取和参数设计 光笔用光电三极管3DU33做为的感光元件,LM393为比较器。由于点阵的光强相对较弱,通过光电三极管的电流很小,通过串接硅二极管来提升光电三极管发射极电压,方便后级比较器作业。光笔原理图如下图: 图1光笔原理图 3.2 LED点阵屏驱动设计 本电路采用74HC573 做电平转换及行驱动,8550三极管做列驱动,用5片74HC138扩展成5-32译码器对列选信号进行译码,显示亮度和器件参数均可达到系统要求的功能设计。系统原理图如下: 省略4行 ……………………………
14、 …… …… …… …… …… 图2 LED点阵驱动原理图 3.3 屏亮自动调节设计 利用片外A/D转换芯片将当前光强转换成数字信号,将传统的PWM调光技术稍加修改,变换成带编码的PWM调光方式,根据显示的内容进行屏亮的自动调节。设计的框图如下: 亮度调节 编码区 内容显示区 清0调亮区 光敏电阻 A/D转换 图3 点阵屏亮度自动调节图 3.4 超时关显示节电设计 基于定时器的数字电路,给定一个时间,当光笔检测到光信号,定时电路自动复位,否则定时电路到给定的时间后数字信号溢出,把溢出信号传送给核心模块,通过功耗管
15、理模块,把系统其余部分模块的时钟切断以达到节电的目的。系统的节电框图如下: 全局时钟 功耗管理 核心模块 片外器件片选控制 片 外 器 件 图4 超时待机框图 4 系统电路设计 4.1 系统工作原理 以NIOS II软核为主控,系统包括 LED 扫描为主的多功能模块、按键管理模块、LCD控制等,通过键盘扫描来确定工作模式以实现点亮、划亮、擦除、区域拖拽等功能,用外围电路的反相功能能实现点阵显示屏的反显,功耗管理模块对各模块时钟的控制可以实现节电的功能。 光笔输入 LED扫描 地址编码 地址解码
16、 解码纠错 反显控制 亮度调节 反显 点阵数据 显示缓存 RAM 按键 管理 点阵列选 驱动芯片片选控制 A/D调光调理 NIOS II 32位软核 微处理器 功耗管理模块 LCD 控制器 图 5 系统工作原理框图 4.2系统工作时序 D10~D6送出Y轴坐标的原码,D5为原码的奇校验,D4~D0为原码的反码校检。 经过双层编码校验,有效防止了周边点阵对数据的干扰。降低了CPU数据处理的难度,只有确定有效的数据才会通过中断被CPU读入内部进行处理。X轴坐标值则为当前所选列的
17、地址。系统工作时序图如下: D10 D8 …… D9 D0 显示区 …… 地址编码区 上升沿读入光笔数据 5 系统程序设计 5.1系统流程概述 本系统是以软核NIOS II为主控,编程采用模块死循环的方式:按任意模式设置键将会复位CPU ,CPU重新启动后将根据复位标志进入相应的管理模式,从而实现点亮、划亮、擦除、拖移等功能,这种编程模式在降低编程难度的同时增强了系统的可靠性。 多字连写模式 读复位 标志 读显示缓存RAM 等待有效坐标中断 更新显示缓存 等待有效坐标中断 更新显示缓存 清除显示缓存数据 结束 点亮 模式
18、笔画擦 除模式 全屏擦 除模式 循环 检测KEY+/- 更新待机时间 ………… 按键存入字1并清屏 循环显示字1~4 按键存入字4并清屏 区域选择 选区拖动 区域缝合 建立辅助选区 任意模式键对CPU进行复位 待机时间设定 区域拖动模式 5.2系统总流程图 图6 系统程序设计流程图 6 系统测试与结果 6.1 划亮反显擦除拖移的测试和结果 各模块均调通,将调好的模块连在一起,加上5v电压源,启动进行系统初始化。按键进入点亮模式
19、用光电笔在LED点阵书写显示屏上接触,可以看到接触的点点亮,LCD上显示亮点的精确坐标。用光笔快速的在书写显示屏上划过,发现划过的地方变亮,多次操作都能实现。再次按键,进入反显模式,光笔划过,发现经过的地方没有亮其他的部分高亮,反显测试正常。再次按键进入擦除模式,用光笔在屏幕上划过,显示屏亮的地方变暗了。再按一次键可以看到整屏由亮变暗,实现了擦除这一功能。最后进入多字连写模式和区域拖动模式用光笔在LED点阵显示屏上写四个字,最后在屏上循环显示。最后对写的字用笔圈起来可以用笔移动。实现了对象拖移功能。经过反复的测试,所有的功能都能很好的实现,系统正常。 6.2屏亮自动调节测试和结果
20、 外部光环境人为地改变后,测试LED点阵书写显示屏的亮度是否发生变化如果发生变化,则表明能够自动调节,结果屏亮随外部环境的变化而改变,系统正常。 6.3 超时关显示节电测试和结果 加5v电压启动系统,对系统初始化。设定待机关显示的时间,在测试点接入万用表,不进行任何操作到设定的时间,看显示屏是否自动关闭。结果书写显示屏自动关闭,电路板测试点上的电流小于5mA。表明测试正常,完成系统要求。 7 结论 本作品完成了题目的基本要求和发挥部分的全部要求,系统性能良好。通过对作品的各项进行了优化,使系统的性能有了提高。FPGA的运用提高了强大的数据处理能力和较高的运行速度,并且使电路
21、简单。同时也提高了系统的集成度和可靠性。 参考文献 《模拟电子线路基础》,吴运昌著,广州:华南理工大学出版社,2004年; 《数字电子技术基础》,阎石著,北京:高等教育出版社,1997年; 《FPAG系统设计与实践》,黄智伟著,北京:电子工业出版社,2004年; 《EDA技术与应用(第2版)》,江国强著,北京:电子工业出版社,2007年; 《电子系统设计》,李金平、沈明山、姜余祥著,北京:电子工业出版社,2007年; 附录 附1:FPGA内部构架图
22、 附2 扫描电路硬件描述 module saomiao(ram_data,ram_address, saomiao_clk,saomiao_en_n, leds_data32,leds_select, pen_in, pen_zuobiao_x,pen_zuobiao_y,pen_ok ,pen_du_shunjian,liangdu); //reg[7:0]liangdu; input[7:0]liangdu; output[3:0] pen_du_shunjian; reg[3:0] pen_du_shunjian;
23、 //line 91 input[31:0] ram_data; output[4:0] ram_address; input saomiao_clk,saomiao_en_n; output[31:0]leds_data32; output[4:0] leds_select; input pen_in; output[4:0]pen_zuobiao_x; output[4:0]pen_zuobiao_y; output pen_ok;//兩次數據相同,座標值有效,輸出中斷 reg ram_clock; reg[31:0] leds_data32; reg[
24、4:0] leds_select; reg[4:0]pen_zuobiao_x; reg[4:0]pen_zuobiao_y; reg pen_ok; reg[4:0] ram_address; reg[11:0] all_shixu;//d'2047. //hang+xiao.//6bits //\5..1\0. reg[5:0] pen_serial; reg[5:0] pen_serial_backup; reg[4:0] pen_serial_fan; always@(negedge saomiao_clk) begin if(!saomiao_en_n)
25、 begin leds_select<=5'b11111; all_shixu=9'd0; leds_data32<=32'h00000000; pen_zuobiao_x<=5'b00001; pen_zuobiao_y<=5'b00010; pen_du_shunjian<=0;////////////////////////////////////// end else begin all_shixu<=all_shixu+1; ////////////////////////////////////////
26、//////////////////////// //liangdu='hff; if(all_shixu==(12'd2000+(liangdu*5-1281)))leds_data32<=32'h00000000;//liangdu if(all_shixu==12'd2000)all_shixu<=12'd0; //--------------------------------------------------- case(all_shixu) 12'd0:leds_data32<=32'h00000000; 12'd1:
27、begin leds_select<=leds_select+1; end // 12'd2:leds_data32<=32'hffff0000; 12'd52:pen_serial[5]<=pen_in; //big wei 12'd53:leds_data32<=32'hff00ff00; 12'd103:pen_serial[4]<=pen_in; //3 12'd104:leds_data32<=32'hf0f0f0f0; 12'd154:pen_serial[3]<=pen_in; //2
28、 12'd155:leds_data32<=32'hcccccccc; 12'd205:pen_serial[2]<=pen_in; //1 12'd206:leds_data32<=32'haaaaaaaa; 12'd256:pen_serial[1]<=pen_in; //small wei // 12'd257:leds_data32<=32'h69969669;// 12'd307:pen_serial[0]<=pen_in; //反碼 /////////////////////////////////////
29、////////////// 12'd308:leds_data32<=32'h0000ffff; 12'd358:pen_serial_fan[4]<=pen_in; //big wei 12'd359:leds_data32<=32'h00ff00ff; 12'd409:pen_serial_fan[3]<=pen_in; //3 12'd410:leds_data32<=32'h0f0f0f0f; 12'd460:pen_serial_fan[2]<=pen_in; //2 12'd461:leds_data32<=32'h3
30、3333333; 12'd511:pen_serial_fan[1]<=pen_in; //1 12'd512:leds_data32<=32'h55555555; 12'd562:pen_serial_fan[0]<=pen_in; //small wei ///////////////////////////////////////////////////// 12'd563:leds_data32<=ram_data;//xianshi /* 11'd369: begin pen_zuobiao_x<=pe
31、n_serial[5:1]; pen_zuobiao_y<=leds_select; end */ 12'd564:if( (pen_serial[0]!=(pen_serial[5]+pen_serial[4]+pen_serial[3]+pen_serial[2]+pen_serial[1])) &&(pen_serial_fan==~pen_serial[5:1]) ) begin if(pen_serial==pen_serial_backup)
32、 begin pen_zuobiao_x<=pen_serial[5:1]; pen_zuobiao_y<=leds_select; pen_ok<=1; end pen_serial_backup<=pen_serial;//get new data end //-- 12'd580:pen_ok<=0;//get new data endcase //-----------------------------------------
33、 end end Endmodule 附3 软核NIOS II程序 #include "sys/alt_stdio.h" #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "lcd12864.h" volatile alt_u8 temp_x_old; volatile alt_u8 temp_y_old; volatile alt_u8 PEN_GET;//mark int volatile al
34、t_u8 DiJiGeZi;//第幾個字 volatile alt_u32 ram_zi_1[32]; volatile alt_u32 ram_zi_2[32]; volatile alt_u32 ram_zi_3[32]; volatile alt_u32 ram_zi_4[32]; alt_u8 disp_dijigezi[]="-"; volatile alt_u8 quyu_state;//區域功能 volatile alt_u8 start_x_point; volatile alt_u8 start_y_point; volatile alt_u32 ram
35、back_up[32]; volatile alt_u32 ram_shixin_xuanqu[32]; /*volatile alt_u8 quyu_state;//區域功能 volatile alt_u8 start_x_point; volatile alt_u8 start_y_point; volatile alt_u32 ram_back_up[32]; volatile alt_u32 ram_shixin_xuanqu[32];*/ volatile alt_u8 start_poi
36、nt_biaozhi; volatile alt_u8 likai_start_point;//是否离开原点 volatile alt_u8 huidao_start_point;//是否回到原点 volatile alt_u8 shixing_xuanqu;//是否已经实心选区 // volatile alt_u8 temps_x; volatile alt_u8 temps_y; alt_u8 gillian_x[]="**_twins_y.";//實際上是y alt_u8 gillian_y[]="**_twins_x.";//實際
37、上時x alt_u8 num_table[]="0123456789ABCDEF"; alt_u8 twins[]="twins!"; alt_u8 int_isr[]="--"; alt_u8 int_isr_cishu; volatile alt_u32 ram_main[32]; #define pen_ok_int IORD_ALTERA_AVALON_PIO_DATA(PIO_PEN_OK_BASE)&0X01 void main_delays(alt_u16 DELAYS) { for(;DELAYS>
38、0;DELAYS--); } void delays_32bit(alt_u32 DELAYS) { for(;DELAYS>0;DELAYS--); } void pen_ok_ISR(void * context,alt_u32 id)//中斷服務程序。 { temps_x=IORD_ALTERA_AVALON_PIO_DATA(PIO_PEN_X_BASE);//&0X1f; temps_y=IORD_ALTERA_AVALON_PIO_DATA(PIO_PEN_Y_BASE);//&0X1f; PEN_GET=0x01;
39、 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_PEN_OK_BASE,0X0); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_PEN_OK_BASE,0); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_PEN_OK_BASE,0X1); } int main() { alt_u8 CHOI; IOWR_ALTERA_AVALON_PIO_DATA(PIO_RAM_EN_BASE,0); LCD_Init();
40、 alt_irq_register(PIO_PEN_OK_IRQ,0,pen_ok_ISR); //注册外部中断,对应的参数分别为中断优先级,传递 //到中断服务函数的参数,和中断服务函数。 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_PEN_OK_BASE,0x1); //使能按键中断位,这里在定义硬件时只用了1位 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_PEN_OK_BASE,0x0); //边沿捕获寄存器清零 // for(CHOI=0;CHOI<32;CHOI++) {
41、 IOWR_ALTERA_AVALON_PIO_DATA(PIO_RAM_ADDR_BASE,CHOI); main_delays(3); ram_main[CHOI]=IORD_ALTERA_AVALON_PIO_DATA(POWER_ON_RAM_READ_BASE);//&0X1f; } start_point_biaozhi=1; likai_start_point=0;//是否离开原点
42、 huidao_start_point=0;//是否回到原点 shixing_xuanqu=0;//是否已经实心选区 alt_u8 yuandianzuobiao[]="X:-- Y:--"; alt_u8 key_mode=IORD_ALTERA_AVALON_PIO_DATA(KEY_STATE_BASE);//&0X1f; alt_u32 temps_set_point; switch(key_mode) { case(0x00):LCD_String(2
43、6,"点亮模式"); while(1) { // if(IORD_ALTERA_AVALON_PIO_DATA(PEN_LINE_BASE)==1) { float x_yuan,y_yuan; float x_zhong,y_zhong; alt_u8 x_all_temp,y_all_temp;
44、 float xielv_temp; float xielv_all; x_yuan=temp_x_old; y_yuan=temp_y_old; x_zhong=temps_x; y_zhong=temps_y;
45、 xielv_temp=1;//((x_zhong-x_yuan)/(y_zhong-y_yuan)); //if((temps_x>=temp_x_old)&&(temps_y>=temp_y_old)) { for(y_all_temp=0;y_all_temp<33;y_all_temp++) {
46、 for(x_all_temp=0;x_all_temp<32;x_all_temp++) { xielv_all=(x_all_temp/*-x_yuan*/)/(y_all_temp/*-y_yuan*/); if( xielv_all==xielv_temp) {
47、
temps_set_point=1;
temps_set_point=temps_set_point< 48、
}
}
}
}
for(CHOI=0;CHOI<32;CHOI++)
{
IOWR_ALTERA_AVALON_PIO_DATA( 49、PIO_RAM_DATA_BASE,ram_main[CHOI]);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RAM_ADDR_BASE,CHOI);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RAM_EN_BASE,1);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RAM_EN_BASE,0);
}
50、 }
}
/* case(0x00):LCD_String(26,"点亮模式");
while(1){
if(0x01==PEN_GET)
{
PEN_GET=0x00;
gillian_x[0]=num_table[temps_x/10];//串行
gillian_x[1]=num_table[temps_x%10];






