【设计开发】 玩转FPGA (DE2-115) - 1602 LCD接口设计

一、前言

  闲来无事,在X宝上搜寻了一套DE2-115的FPGA开发板以丰富业余生活。虽附带光盘里包含各外设及组件驱动及接口样例,但本着“不捣腾不痛快”的折腾精神,将DE2-115的各个外设重新整理并玩转一遍。

  DE2-115全貌见下图,LCD1602是一个简单、实用的显示交互界面;DE2-115中的1602不支持中文字库。

  

二、接口说明

  1602 LCD模块接口如下图所示,对几个信号做简要说明:

  #4 (RS) - DB内容指示信号:0-当前DB数据为命令数据;1-当前DB数据为显示数据。

  #5 (RW)- 读写指示信号:0-当前进行写操作;1-当前进行读操作。

  #6 (E)- 片选使能指示信号:0-片选无效;1-片选有效。  

  #7~#14 (DB0~DB7)- 显示或命令读写数据。

  

三、接口时序

  写时序如下图所示:由于LCD 1602配置接口没有时钟,接口时序需要严格遵守。

  

  读时序

  

四、接口设计

  1 //--====================================================================================--
  2 // THIS FILE IS PROVIDED IN SOURCE FORM FOR FREE EVALUATION, FOR EDUCATIONAL USE OR FOR
  3 // PEACEFUL RESEARCH.  DO NOT USE IT IN A COMMERCIAL PRODUCT . IF YOU PLAN ON USING THIS
  4 // CODE IN A COMMERCIAL PRODUCT, PLEASE CONTACT [email protected] TO PROPERLY LICENSE
  5 // ITS USE IN YOUR PRODUCT.
  6 //
  7 // Project      : Verilog Common Module
  8 // File Name    : lcd_reg_intf.v
  9 // Creator(s)   : [email protected]
 10 // Date         : 2015/12/01
 11 // Description  : A Reg Timing for LCD1602
 12 //
 13 // Modification :
 14 // (1) Initial design  2015-12-01
 15 //
 16 //
 17 //--====================================================================================--
 18
 19 module LCD_REG_INTF
 20     (
 21         clk           ,
 22         rst_n         ,
 23         write         ,
 24         read          ,
 25         wdata         ,
 26         reg_sel       ,
 27         rdata         ,
 28         ready         ,
 29         lcd_rs        ,
 30         lcd_rw        ,
 31         lcd_en        ,
 32         lcd_db_out    ,
 33         lcd_db_oen    ,
 34         lcd_db_in
 35     );
 36
 37 //PARA   DECLARATION
 38 parameter LCD_EN_SETUP_MIN = 16‘d40   ;
 39 parameter LCD_EN_WIDTH_MIN = 16‘d230  ;
 40 parameter LCD_EN_HOLD_MIN  = 16‘d230  ;
 41
 42 parameter LCD_EN_CYCLE_MIN = (LCD_EN_SETUP_MIN + LCD_EN_WIDTH_MIN + LCD_EN_HOLD_MIN)  ;
 43
 44 //INPUT  DECLARATION
 45 input                           clk          ; //LCD clock
 46 input                           rst_n        ; //LCD clock reset (0: reset)
 47 input                           write        ; //LCD write enable(1: enable), only one clock pulse
 48 input                           read         ; //LCD read  enable(1: enable), only one clock pulse
 49 input                           reg_sel      ; //LCD DATA SEL: 0-COMMAND | 1-DATA;
 50 input   [7:0]                   wdata        ; //LCD write data
 51 input   [7:0]                   lcd_db_in    ; //LCD INTF SIGNAL
 52
 53 //OUTPUT DECLARATION
 54 output  [7:0]                   rdata        ; //LCD READ data
 55 output                          ready        ; //LCD ACCESS Ready
 56 output                          lcd_rs       ; //LCD INTF SIGNAL
 57 output                          lcd_rw       ; //LCD INTF SIGNAL
 58 output                          lcd_en       ; //LCD INTF SIGNAL
 59 output  [7:0]                   lcd_db_out   ; //LCD INTF SIGNAL
 60 output                          lcd_db_oen   ; //LCD INTF SIGNAL
 61
 62 //--========================MODULE SOURCE CODE==========================--
 63 reg     [15:0]                  lcd_timing_cnt  ;
 64 wire                            lcd_wr_cmd      ;
 65 wire                            lcd_cmd_idle    ;
 66 reg                             lcd_rs          ;
 67 reg                             lcd_rw          ;
 68 reg                             lcd_db_oen      ;
 69 reg                             lcd_en          ;
 70 reg     [7:0]                   lcd_db_out      ;
 71 reg     [7:0]                   rdata           ;
 72
 73 //--=========================================--
 74 // LCD TIMING COUNT :
 75 // Initial Value LCD_EN_CYCLE_MIN ; It count
 76 // from 0 to LCD_EN_CYCLE_MIN when one access.
 77 //--=========================================--
 78 assign lcd_wr_cmd   = (write | read);
 79 assign lcd_cmd_idle = (lcd_timing_cnt >= LCD_EN_CYCLE_MIN) ;
 80
 81 always @(posedge clk or negedge rst_n)
 82 begin
 83     if(rst_n == 1‘b0)
 84         lcd_timing_cnt <= LCD_EN_CYCLE_MIN ;
 85     else if (lcd_wr_cmd & lcd_cmd_idle)
 86         lcd_timing_cnt <= 16‘b0 ;
 87     else if (lcd_timing_cnt < LCD_EN_CYCLE_MIN)
 88         lcd_timing_cnt <= lcd_timing_cnt + 16‘b1 ;
 89 end
 90
 91 //--=========================================--
 92 // LCD INTERFACE SIGNAL :
 93 // RS   : 0-COMMAND | 1-DATA;
 94 // RW   : 0-WRITE   | 1-READ;
 95 // E    : 0-Disable | 1-ENABLE;
 96 //--=========================================--
 97 always @(posedge clk or negedge rst_n)
 98 begin
 99     if(rst_n == 1‘b0)
100         lcd_rs <= 1‘b0 ;
101     else if (lcd_wr_cmd & lcd_cmd_idle)
102         lcd_rs <= reg_sel ;
103 end
104
105 always @(posedge clk or negedge rst_n)
106 begin
107     if(rst_n == 1‘b0)
108     begin
109         lcd_rw     <= 1‘b0 ;
110         lcd_db_oen <= 1‘b1 ;
111     end
112     else if (write  & lcd_cmd_idle)
113     begin
114         lcd_rw     <= 1‘b0 ;
115         lcd_db_oen <= 1‘b0 ;
116     end
117     else if (read  & lcd_cmd_idle)
118     begin
119         lcd_rw     <= 1‘b1 ;
120         lcd_db_oen <= 1‘b1 ;
121     end
122 end
123
124 always @(posedge clk or negedge rst_n)
125 begin
126     if(rst_n == 1‘b0)
127         lcd_en <= 1‘b0 ;
128     else if (lcd_timing_cnt <= LCD_EN_SETUP_MIN)
129         lcd_en <= 1‘b0 ;
130     else if (lcd_timing_cnt >= LCD_EN_SETUP_MIN + LCD_EN_WIDTH_MIN)
131         lcd_en <= 1‘b0 ;
132     else
133         lcd_en <= 1‘b1 ;
134 end
135
136 //--=========================================--
137 // lcd_db_out :
138 // Update wdata when write enbale and keep it
139 // till en cycle end.
140 //--=========================================--
141 always @(posedge clk or negedge rst_n)
142 begin
143     if(rst_n == 1‘b0)
144         lcd_db_out <= 8‘b0 ;
145     else if (write  & lcd_cmd_idle)
146         lcd_db_out <= wdata;
147     else if (lcd_timing_cnt >= LCD_EN_CYCLE_MIN)
148         lcd_db_out <= 8‘b0 ;
149 end
150
151 //--=========================================--
152 // rdata :
153 // Update rdata when lcd en cycle end.
154 //--=========================================--
155 always @(posedge clk or negedge rst_n)
156 begin
157     if(rst_n == 1‘b0)
158         rdata <= 8‘h0 ;
159     else if (read  & lcd_cmd_idle) //Specify an Error Code here.
160         rdata <= 8‘hFF;
161     else if (lcd_timing_cnt >= LCD_EN_CYCLE_MIN)
162         rdata <= lcd_db_in ;
163 end
164
165 endmodule
166
167     

  

时间: 2024-09-29 17:43:48

【设计开发】 玩转FPGA (DE2-115) - 1602 LCD接口设计的相关文章

电子商务系统的设计与实现(五):账务系统的功能接口设计

电商系统.p2p网贷系统.第三方支付都可以有自己的账务系统,账务系统与用户系统可以完全独立,不需要用户ID等信息,只提供给其它系统若干接口.服务可以用WebService的方式实现,对内提供服务非常方便,调用接口,就要调用普通的API一样.也可以做成HTTP的方式,外部使用相对麻烦一些.疑问:WebService提供的接口,可以直接用HTTP的方式调用么? 账务系统的功能接口设计 1.开户  可选输入:用户ID.账户资金类型(人民币.美元)  功能描述:创建一个账户.  理论上不需要存入用户的I

如何设计好程序员自己的UI-RESTful 风格的接口设计。

最近在做一个客户端程序的架构设计,看了下服务器给的初版接口文档,发现做的非常不好,接口设计没有任何规范可言,也没有规律.着手修改了一下,给出了一些修改意见. 现在把这些心得分享给大家,希望大家以后再设计接口时,也能遵循这些规范,让我们的程序员在coding的时候能够更加顺手. 所谓RESTful架构,就是 Representational State Transfer.但是实际上这个词组少了一个主语 也就是Resources.资源的意思.合起来就是 资源 表现层的状态转化. 比较绕口不好理解.我

接口设计六大原则

一.单一职责原则 Single Responsibility Principle, 简称SRP. 定义:There should never be more than one reason for a class to change. 应该有且仅有一个原因引起类的变更. 职责的划分?单一的定义和级别? 应该根据实际业务情况而定.关注变化点. 实际使用时,类很难做到职责单一,但是接口的职责应该尽量单一. 二.里氏替换原则 Liskov Substitution Principle, 简称LSP.

基于FPGA的VGA可移植模块终极设计【转】

本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事,一般的单片机是办不到的:由于FPGA的速度,以及并行的优势,加上可现场配置的优势,VGA的配置,只有俺们FPGA可以胜任,也只有FPGA可以随心所欲地配置(当然ARM也可以,应用比较高吧). 初学者就是喜欢看炫的效果,往往会忍不住想玩.尤其玩FPGA的,没玩VGA就感到跟单片机没啥提升,因此VGA的驱动

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

数据库设计开发规范

1 数据库命名约定  1.1 规则 (1) 命名富有意义英文词汇,多个单词组成的,中间以下划线分割. (2) 除数据库名称长度为1-8个字符,其余为1-30个字符,dblink名称也不要超过30个字符. (3)命名只能使用英文字母,数字和下划线,字母全部小写 (4)避免使用Oracle的保留字如level.关键字如type. 1. 2系统模块 编号 名称 英文 缩写 1 系统管理 system sys 2 配置管理 dictionary dic 3 设备系统 equipment equ 4 通讯

升讯威微信营销系统开发实践:(3)中控服务器的设计 .Net 还是 Java?

.Net 还是 Java?  :) 最近园子里又出现了.Net 和 Java 的口水贴,如果你觉得本文的内容根本就是 a piece of cake,不值一提,轻轻松松就能码出可靠健壮的实现,或许还可以讨论下.Net 和 Java 的问题,否则我想你还是歇歇吧,对你来说都是一样的,用好一样就行了,否则 .Net 1.1 都能完爆你. .Net的应用领域没有有些人想的那么窄,只能说你眼界实在是太浅了..Net在国外是否受待见?自己去国外招聘网站看一看就是了,又没被墙的,呵呵. 技术不过关不要赖平台

以DDD为开发模式的设计开发步骤可以是

以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各个用例图,就知道了系统使用的各种业务场景,同时也明确了系统的边界,从而就明确了领域模型的边界:4)在领域模型的边界内划分聚合,找出每个聚合的边界,找出边界内的聚合根,实体,值对象:这步是难点.这里一定不能混淆的一个概念是,领域建模不是以用户为中心的建模,而是以用户的需求为中心的建模.所以要努力寻找各

CSS3实战开发: 弹性盒模型之响应式WEB界面设计

各位网友大家好,如果你已经阅读过我先前写的关于CSS3弹性盒模型的实例演示,相信你对CSS3弹性盒模型属性知识点应该已经有了一个非常深刻的映像. 从本篇文章开始,我将带领大家,手把手地教大家如何来开发一个适合移动端浏览器的弹性盒模型的响应式页面.同时实战开发中的案例代码可以作为你项目中的精简框架了. 当你学习完成<CSS3实战开发: 弹性盒模型之响应式WEB界面设计>这个系列教程之后,相信你对目前比较流行的前端轻量级框架 Bootstrap等会有一个深刻的认识. Bootstrap(弹性流体布