lcd_1602
module lcd_pdf(
clk,lcd_data,
lcd_rw,lcd_rs,
lcd_en,rst_n
); input clk;
input rst_n;
output reg [:] lcd_data;
output reg lcd_rw; // wirte L
output reg lcd_en;
output reg lcd_rs; //clock 分频
reg [:] cnt;
reg clk_10;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
cnt <= 'd0;
clk_10 <= 'b0;
end
else begin
if(cnt == )begin
clk_10 =~ clk_10;
cnt <= cnt + 'b1;
end
end //shixu
always @(posedge clk_10 or negedge rst_n)
if(!rst_n)begin
lcd_rw <= 'b0;
lcd_en <= 'b0;
end
else begin
case(cnt)
:begin
lcd_en <= 'b0;
lcd_data <= 'h30;
lcd_rw <= 'b0;
lcd_rs <= 'b0;
end
:begin
lcd_en <= 'b1;
end
:begin
lcd_en <= 'b0;
lcd_data <= 'h0c;
lcd_rw <= 'b0;
lcd_rs <= 'b0;
end
:begin
lcd_en <= 'b1;
end
:begin
lcd_en <= 'b0;
lcd_data <= 'h01;
lcd_rw <= 'b0;
lcd_rs <= 'b0;
end
:begin
lcd_en <= 'b1;
end
:begin
lcd_en <= 'b0;
lcd_data <= 'h80;
lcd_rw <= 'b0;
lcd_rs <= 'b0;
end
:begin
lcd_en <= 'b1;
end
:begin
lcd_en <= 'b0;
lcd_data <= 'h30;//字符0
lcd_rw <= 'b0;
lcd_rs <= 'b1;
end
:begin
lcd_en <= 'b1;
end
default:lcd_en <= 'b0;
endcase
end
endmodule
主要还是按照时序图的时间顺序一步步的写,没有上机验证 而且tb在处理很大的数的时候不知道具体咋弄,留下以后解决
//-----------------------------------2-10号修改------------------------------------------//
module fsm_lcd(
rs,rw,en,data,
clk,rst_n
); input wire clk;
input wire rst_n;
output reg rs; //write_cmd -L or write_data -H
output wire rw; //write - L
output reg en; //写数据或者写指令 高脉冲
output reg [:] data; //上电20ms稳定电源
parameter TIME_20MS = 'd1_0-1;//为了仿真将时间缩短
reg [:] cnt_init;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt_init <= 'd0;
else if(cnt_init == TIME_20MS)
cnt_init <= TIME_20MS;
else
cnt_init <= cnt_init + 'b1; //分频 1602为慢速器件,要降低clk频率
parameter DIV_CNT = 'd5 - 1;//加快仿真速度;
reg [:] cnt_div;
reg clk_500hz;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
cnt_div <= 'd0;
clk_500hz <= 'd0;
end
else if(cnt_div == DIV_CNT)begin
cnt_div <= 'd0;
clk_500hz =~ clk_500hz;
end
else
cnt_div <= cnt_div + 'b1; //fsm
reg [:] state;
reg [:] cnt_ms;
always @(posedge clk_500hz or negedge rst_n)
if(!rst_n)begin
data <= 'd0;
en <= 'd0;
rs <= 'd0;
state <= 'd0;
cnt_ms <= 'd0;
end
else if(cnt_init == TIME_20MS)
case(state)
'd0:begin
data <= 'd0;
en <= 'd0;
rs <= 'd0;
state <= 'd1;
end
'd1:begin
data <= 'h38; //显示模式
en <= 'd0;
rs <= 'd0;
state <= 'd2;
end
'd2:
if(cnt_ms == 'd2)begin
cnt_ms <= 'd0;
en <= 'd1;
rs <= 'd0;
state <= 'd3;
end
else cnt_ms <= cnt_ms + 'b1;
'd3:begin //0x0c 开显示不显示光标
data <= 'h0c;
en <= 'd0;
rs <= 'd0;
state <= 'd4;
end
'd4:begin
en <= 'd1;
state <= 'd5;
end
'd5:
if(cnt_ms == 'd2)begin
cnt_ms <= 'd0;
en <= 'd0;
state <= 'd6;
end
else cnt_ms <= cnt_ms + 'b1;
'd6:begin //0x80 首地址
en <= 'd0;
data <= 'h80;
state <= 'd7;
end
'd7:begin
en <= 'd1;
state <= 'd8;
end
'd8:if(cnt_ms == 3'd2)begin //write_data
cnt_ms <= 'd0;
en <= 'd0;
rs <= 'd1;
data <= 'h1;
state <= 'd9;
end
else cnt_ms <= cnt_ms + 'b1;
'd9:begin
en <= 'd1;
state <= 'd10;
end
'd10:
if(cnt_ms == 'd2)begin
cnt_ms <= 'd0;
en <= 'd0;
state <= 'd0;
end
else cnt_ms <= cnt_ms + 'b1;
default:state <= 'd0;
endcase assign rw = 'b0; endmodule

lcd_1602的更多相关文章
- 树莓派的演奏音符3 -- LCD1602显示文章
LCD1602它是低-cost输出装置.它具有体积小.简单的操作.低功耗优势.因此,在一些DIY 用它来输出关于产品的一些信息. 昨日在使用,尽管平局网上资源,但仍存在一些问题,确处理. 一.LCD1 ...
- LCD1602
一.关于LCD1602: 在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点. 1.管脚: 1602共16个 ...
- 单片机学习(十一)I2C总线和AT24C02的使用
一. 存储器介绍 存储器分类图 1. RAM 这类存储器中的数据都是掉电即失的,例如计算机中的内存就是DRAM,但它们数据读写速度都是要比ROM要快得多的. SRAM:本质是电路,使用电路构成的触发器 ...
随机推荐
- Jquery中获取iframe的代码方法
父窗口中操作iframe:window.frames["iframeChild"].document //假如iframe的id为iframeChild 在子窗口中操作父窗口:wi ...
- HTML5 CANVAS制图 基础总结
一.基本绘图 首先,定义2D渲染变量ct(这里用了Jquery库): var ct = $(#canvasId).get(0).getContext('2d'); 以下是绘制各种基本图形的方法: // ...
- C# socket编程实践
C# socket编程实践——支持广播的简单socket服务器 在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# ...
- UVA 141 The Spot Game 斑点游戏。。
The Spot Game The game of Spot is played on an NxN board as shown below for N = 4. During the game ...
- c# 发邮件功能
using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using Sy ...
- IOS使用不同父类的 view 进行约束
最终效果图如下: 很多限制条件都已经应用到了视图中,我们在解释一下: ·在我们的视图控制器的主视图中有两个灰色的视图.两个视图距视图控制器的视图左 边和右边都有一个标准的空白距离.视图的顶部距顶部的视 ...
- 用来代替本机IP的万能IP:127.0.0.1
用来代替本机IP的通用IP:127.0.0.1
- C语言实现,队列可伸缩
两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素. 一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空, ...
- 支付宝移动支付开发详细教程服务端采用.net mvc webapi(C#)
转自:http://www.kwstu.com/ArticleView/netmvc_201511132005431321 最近开发手机app需要实现移动支付功能,由于考虑支付安全将支付宝生成签名写到 ...
- jquery animate stop函数解析
今天我们来看看jquery中动画操作的stop函数.其实我至今不是很明白啊,所以此文算是求救以及抛砖引玉. 在jquery 1.7版本以前,stop支持两个参数,分别是clearQueue和jumpT ...