FPGA应用资料NiosⅡ应用资料
返回首页

基于NIOS II嵌入式处理器实现LCD的控制

时间:2010-01-31 17:08来源:网络 作者: 点击:
本文介绍了一种基于NIOS II软核处理器实现对LCD-LQ057Q3DC02控制的新方法。在设计中利用FPGA的Altera的SOPC Builder定制NIOS II软核处理器及其与显示功能相关的“软” 硬件模块来协同实现显示控制的软

随着半导体技术以及计算机软硬件技术的飞速发展,对于图像的显示的控制技术也呈现出越来越多的方式。
       
本文介绍了一种基于NIOS II软核处理器实现对LCD-LQ057Q3DC02控制的新方法。在设计中利用FPGA的Altera的SOPC Builder定制NIOS II软核处理器及其与显示功能相关的“软” 硬件模块来协同实现显示控制的软硬件设计。利用SOPC技术,将NIOS II CPU和LCD控制器放在同一片FPGA中,解决了通常情况下必须使用LCD 控制专用芯片才能解决LCD显示的问题。
       
1 LCD选型及主要特性
    
本文所采用的LCD是SHARP公司的5.7英寸的LCD-LQ057Q3DC02。它能显示320×240×3点像素,输入信号有:18位色度信号(R,G,B各6位)的数据信号,4个时钟信号(CLK,Hsync,Vsync,Enable)以及实现水平显示模式,垂直显示模式的R/L、U/D和VGA/QVGA模式选择信号线。
    
事实上,LCD-LQ057Q3DC02是一个逐行扫描设备,它总是从屏幕的左上方开始扫描,先水平扫描完一行(320像素点)到最右边,然后再回到最左边,换下一行,继续扫描。直到扫描到屏幕的最下方(共240行),这样就扫描完一帧图像,然后再回到最左边,开始下一帧的扫描。

2 Avalon流模式LCD控制器设计
    
文中实现的LCD 实时图像显示控制方式采用的是DMA数据传输方式。设计时,利用DMA控制器在流模式LCD控制器和SDRAM 之间建立一条DMA传送通道,让硬件来完成像素信息的自动读取,而NIOS II处理器仅通过操作SDRAM 中相应的区块就能实现LCD 图像的更新。
       
2.1 Avalon流模式控制器的组成
    
设计Avalon流模式外设时需要遵循Avalon总线规范。在实际设计时,笔者设计的Avalon流模式LCD控制器的硬件结构如图1。该控制器由如下3部分构成:LCD接口控制器、FIFO存储器和Avalon Streaming Port接口。


       
2.2 LCD显示控制流程
    
对LCD-LQ057Q3DC02而言,要实现LCD的正常显示就必须对相应的控制信号正确配置,特别是行同步(LCD_Hsync)、场同步(LCD_Vsync)必须与从SDRAM 存储器中取出的图像数据同步,否则,图像将不能正常再现。实现LCD控制的行同步、场同步的控制时序流程如图2。



2.3 LCD控制器文件组成及部分代码
    
与LCD控制器硬件相对应的是3个模块文件,分别是:LCD_interface.vhd,LCD_pixel_fifo.v以及LCD_controller_stream.v。其中LCD_controller_stream.v是顶层模块,其内部也包含了Avalon Streaming Port接口时序部分,LCD_pixel_fifo.v可通过QuartusII中的宏模块直接生成。当生成了上述3个文件后,可选择SOPC Builder中的System->Add Interface to User Logic命令打开Interface to User Logic对话框,选择总线类型为Avalon Memory Slave,因为工作于流模式的LCD控制器可看成一个存储器(FIFO类型),可通过添加DMA控制器来实现存储器(FIFO)到存储器(SDRAM)的DMA设置。下面给出LCD接口部分程序。
 

  1. ENTITY LCD_interface IS  
  2.  
  3. PORT(  
  4.  
  5. reset :IN std_logic;  
  6.  
  7. lcd_clk :IN std_logic;  
  8.  
  9. Wrdata :IN std_logic_vector(17 downto 0);  
  10.  
  11. hsync :OUT std_logic;  
  12.  
  13. vsync :OUT std_logic;  
  14.  
  15. enable :OUT std_logic;  
  16.  
  17. lcd_R/L :OUT std_logic;  
  18.  
  19. lcd_U/D :OUT std_logic;  
  20.  
  21. sel_VGA_QVGA :OUT std_logic;  
  22.  
  23. RGB :OUT std_logic_vector(17 downto 0);  
  24.  
  25. end_of_picture :OUT std_logic);  
  26.  
  27. END LCD_interface;  
  28.  
  29. ARCHITECTURE trans OF LCD_interface IS  
  30.  
  31. process(lcd_clk) begin  
  32.  
  33. if(rising_edge(lcd_clk)) then  
  34.  
  35. if(hcnt<400) then  
  36.  
  37. hcnt<=hcnt+1;  
  38.  
  39. else 
  40.  
  41. hcnt<=(others=>0);  
  42.  
  43. end if;  
  44.  
  45. end if;  
  46.  
  47. end process;--行计数器模块  
  48.  
  49. process(lcd_clk) begin  
  50.  
  51. if(rising_edge(lcd_clk)) then  
  52.  
  53. if(hcnt=320) then  
  54.  
  55. if(vcnt<262) then  
  56.  
  57. vcnt<= vcnt+1;  
  58.  
  59. else 
  60.  
  61. vcnt<=(others=>0);  
  62.  
  63. end if;  
  64.  
  65. end if;  
  66.  
  67. end if;  
  68.  
  69. end process;--场计数器模块  
  70.  
  71. process(lcd_clk) begin  
  72.  
  73. if(rising_edge(lcd_clk)) then  
  74.  
  75. if((hcnt>= 320+20+20 ) and (hcnt<320+20+20+40)) then  
  76.  
  77. hs<=0;  
  78.  
  79. else 
  80.  
  81. hs<=1;  
  82.  
  83. end if;  
  84.  
  85. end if;  
  86.  
  87. end process;--产生水平同步脉冲  
  88.  
  89. process(vcnt)begin  
  90.  
  91. if((vcnt>=240+6+6)and(vcnt<240+6+6+10)) then  
  92.  
  93. VS<=0;  
  94.  
  95. else 
  96.  
  97. vs<=1;  
  98.  
  99. end if;  
  100.  
  101. end process;--产生场同步脉冲  
  102.  
  103. process(lcd_clk) begin  
  104.  
  105. if(rising_edge(lcd_clk)) then  
  106.  
  107. if(hcnt<320 and vcnt<240)and(hcnt>20 and vcnt>6) then  
  108.  
  109. en<=1;  
  110.  
  111. else 
  112.  
  113. en<=0;  
  114.  
  115. end if;  
  116.  
  117. end if;  
  118.  
  119. end process;--产生显示使能控制信号  
  120.  
  121. process(led_clk)begin  
  122.  
  123. if(rising_edge(lcd_clk))then  
  124.  
  125. if(hcnt<320 and vcnt<240)then  
  126.  
  127. RGB<=Wdata;  
  128.  
  129. else 
  130.  
  131. RGB<=(others=>0);  
  132.  
  133. end if;  
  134.  
  135. end if;  
  136.  
  137. end process;--像素输出及消隐  
  138.  
  139. process(lcd_clk)begin  
  140.  
  141. if(rising_edge(lcd_clk))then  
  142.  
  143. if((vcnt=320+1)and(hcnt=0))then  
  144.  
  145. end_of_picture<=1;  
  146.  
  147. else 
  148.  
  149. end_of_picture<=0;  
  150.  
  151. end if;  
  152.  
  153. end if;  
  154.  
  155. end process;--一帧传输完毕  
  156.  
  157. END ARCHITECTURE trans; 


(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容