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的更多相关文章

  1. 树莓派的演奏音符3 -- LCD1602显示文章

    LCD1602它是低-cost输出装置.它具有体积小.简单的操作.低功耗优势.因此,在一些DIY 用它来输出关于产品的一些信息. 昨日在使用,尽管平局网上资源,但仍存在一些问题,确处理. 一.LCD1 ...

  2. LCD1602

    一.关于LCD1602: 在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点. 1.管脚: 1602共16个 ...

  3. 单片机学习(十一)I2C总线和AT24C02的使用

    一. 存储器介绍 存储器分类图 1. RAM 这类存储器中的数据都是掉电即失的,例如计算机中的内存就是DRAM,但它们数据读写速度都是要比ROM要快得多的. SRAM:本质是电路,使用电路构成的触发器 ...

随机推荐

  1. 关于PHP 缓冲区

    最权威的资料:http://php.net/manual/en/function.flush.php 里面有全世界的开发者的留言.常见问题都有讨论. 再说一下PHP 缓冲区相关的. web服务器 如 ...

  2. (转)最大似然估计&贝叶斯估计

    最大似然估计&贝叶斯估计 与传统计量模型相对的统计方法,存在 1)参数的解释不同:经典估计:待估参数具有确定值它的估计量才是随机的.如果估计量是无偏的,该估计量的期望等于那个确定的参数.bay ...

  3. CSS position overflow float 属性 详解

    position  overflow float 几个属性比较容易混淆,写一段代码详解各自具体情况: position在w3school的可能取值: 值 描述 absolute 生成绝对定位的元素,相 ...

  4. CF 161D Distance in Tree【树DP】

    题目大意:给一棵树,求树上两点之间距离为K的点对数目. 方程含义: dp(i,j)表示从已经遍历过的点到当前点i,路径长度为 j 的路径条数.因此,对于当前点,每当遍历了其中一个儿子节点的时候,首先统 ...

  5. AsyncTasLoader不进行加载操作的原因及解决方法

    使用AsyncTaskLoader加载数据.但是LoadInBackground却不会被回调.这是什么情况?我要怎么解决这个问题?如果你和我一样有这样的疑问.你可以移步至我的blog的这篇文章找到答案 ...

  6. MongoDB学习之--增删改查(1)

    本文是对mongodb学习的一点笔记,主要介绍最简单的增删改操作,初学,看着API,有什么错误,希望大家指正:(使用官方驱动) 1.增 增加操作是最简单的,构造bsonDcument插入即可: 方式1 ...

  7. WPF之TreeList的实现方法1

    WPF之TreeList的实现方法(一) 做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求, 很多时候我们需要对现有的控件做一下加工. 最简单的我们可能会把Tree转换成List形式有的叫 ...

  8. 寻找两个已序数组中的第k大元素

    寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...

  9. mongoDB入门必读(概念与实战并重)

    一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是 ...

  10. 黑马程序员:Java基础总结----正则表达式

    黑马程序员:Java基础总结 正则表达式   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 正则表达式 import  java.util.regex.*; 符合一定规 ...