差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
文本lcd模块的控制 [2020/07/09 11:01]
zili
文本lcd模块的控制 [2020/07/09 13:13] (当前版本)
zili
行 13: 行 13:
   * RS:寄存器选择,0表示命令字节,1表示数据字节。   * RS:寄存器选择,0表示命令字节,1表示数据字节。
 \\ \\
-大多数LCD模块都基于HD44780芯片或兼容的。查[[https://​en.wikipedia.org/​wiki/​Hitachi_HD44780_LCD_controller|Wikipedia]]以获取更多信息。+大多数LCD模块都基于HD44780芯片或兼容的。查[[https://​en.wikipedia.org/​wiki/​Hitachi_HD44780_LCD_controller|Wikipedia]]以获取更多信息。 
 +\\
  
 +\\
 ####​7位设计 ####​7位设计
-让我们FPGA板驱动LCD模块。\\+让我们FPGA板驱动LCD模块。\\
 这是我们设计的框图: 这是我们设计的框图:
 {{ ::​lcdmodule.gif |}} {{ ::​lcdmodule.gif |}}
  
-Pluto从PC串行端口接收数据,对其进行反序列化,然后将其发送到LCD模块。解串器与串行接口项目中的模块相同,因此此处仅对其进行实例化。+[[http://​www.knjn.com/​FPGA-RS232.html|Pluto]]从PC串行端口接收数据,对其进行反序列化,然后将其发送到LCD模块。解串器与串行接口项目中的模块相同,因此此处仅对其进行实例化。\\
  
 <code verilog> <code verilog>
行 33: 行 35:
 </​code>​ </​code>​
  
-每当串行端口提供一个字节时,“ RxD_data_ready”将在一个时钟周期内处于活动状态。 +每当串行端口提供一个字节时,“ RxD_data_ready”将在一个时钟周期内处于活动状态。\\ 
- +\\ 
-PC通过串口以8位模式向我们发送数据。理想情况下,我们需要从PC接收9位,以便我们可以驱动8位数据总线和LCD模块的“ RS”线。现在,让我们使用接收到的数据的MSB(第7位)来驱动“ RS”,并将仅7位发送到数据总线。+PC通过串口以8位模式向我们发送数据。理想情况下,我们需要从PC接收9位,以便我们可以驱动8位数据总线和LCD模块的“ RS”线。现在,让我们使用接收到的数据的MSB(第7位)来驱动“ RS”,并将仅7位发送到数据总线。\\
  
 <code verilog> <code verilog>
行 44: 行 46:
 </​code>​ </​code>​
  
-我们从不读取LCD模块,因此R / W线接地。 +我们从不读取LCD模块,所以R / W线接地\\ 
- +\\ 
-最后一个麻烦是“ E”信号需要长时间激活,即220ns。从FPGA的角度来看,这很长,因为我使用的是25MHz时钟(周期为40ns)。因此,“ E”至少需要驱动5.5个时钟。在这里,我们使用一个计数器对时钟进行计数,将其驱动7个时钟。+最后一个麻烦是“ E”信号需要长时间激活,即220ns。从FPGA的角度来看,这很长,因为我使用的是25MHz时钟(周期为40ns)。因此,“ E”至少需要驱动5.5个时钟。在这里,我们使用一个计数器对时钟进行计数,将其驱动7个时钟。\\
  
 <code verilog> <code verilog>
行 53: 行 55:
 </​code>​ </​code>​
  
-“ E”信号是通过寄存器创建的,因此可以保证无干扰。+“ E”信号是通过寄存器创建的,因此可以保证无干扰。\\
  
 <code verilog> <code verilog>
行 61: 行 63:
  
 波形如下所示: 波形如下所示:
 +{{ ::​lcdmodule_waveform.gif |}}
  
-HDL设计在这里。+HDL设计在[[https://​www.fpga4fun.com/​files/​LCDmodule.zip|这里]]\\
  
-软件 +\\ 
-我们初始化LCD并发送一些要显示的数据。 +####软件方面 
- +我们对LCD进行初始化并发送一些要显示的数据。 
-是初始化LCD模块并显示“ hello”的C代码。+{{ ::​lcd_hello.jpg |}} 
 +\\ 
 +以下是初始化LCD模块并显示“ hello”的C代码。
  
 <code verilog> <code verilog>
行 90: 行 95:
 } }
 </​code>​ </​code>​
 +\\
 +完整的代码在[[https://​www.fpga4fun.com/​files/​LCDmodule_com.zip|这里]]。\\
  
-完整代码这里+要获取有关HD44780指令集更多信息,[[http://​www.doc.ic.ac.uk/​~ih/​doc/​lcd/​instruct.html|请此处检查]]\\ 
 +\\
  
-获取有关HD44780指令集更多信息请在此处检查+####​8位设计 
 +缺点是较早设计是我们仅向LCD数据总线发送7位。这是一个问题因为无法再使用LCD模块的设置DD RAM地址命令\\
  
-8位设计 +一种简单的解决方法是使用转义符。我们选择了字符0x00。\\
-主要缺点是较早的设计是我们仅向LCD数据总线发送7位。这是一个问题,因为无法再使用LCD模块的设置DD RAM地址命令。 +
- +
-一种简单的解决方法是使用转义符。我们选择了字符0x00。+
  
 新协议如下: 新协议如下:
- +  * 要发送命令字节,请在其前面加上0x00。 
-要发送命令字节,请在其前面加上0x00。 +  ​* ​要发送数据字节,只需发送它,不需要前缀。 
-要发送数据字节,只需发送它,不需要前缀。+\\
 新的C代码是: 新的C代码是:
  
行 136: 行 142:
 } }
 </​code>​ </​code>​
 +\\
 新的HDL代码如下所示: 新的HDL代码如下所示:
  
行 177: 行 183:
 endmodule endmodule
 </​code>​ </​code>​
 +\\
 HD44780规范显示,“ E”变低后,“ RS”必须在10ns内有效。因此,您会注意到这里“ E”仅被驱动6个时钟,并且“ LCD_instruction”标志仅在时钟7之后被复位,以提供25ns的空间。\\ HD44780规范显示,“ E”变低后,“ RS”必须在10ns内有效。因此,您会注意到这里“ E”仅被驱动6个时钟,并且“ LCD_instruction”标志仅在时钟7之后被复位,以提供25ns的空间。\\
 +{{ ::​lcdmodule_waveform2.gif |}}
 \\ \\
  
-##​那就是所有人!轮到您尝试了。+\\ 
 + 
 +**That'​s all folks!轮到您尝试了。** 
 +