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. Mac OS X安装之硬盘和光盘引导总结

    继上一篇虚拟机环境下的安装,这篇文档主要描述硬盘和光盘引导安装Mac OS X,并可实现多操作系统. 硬盘安装: 首先介绍下硬盘安装需要用到的软件. Java虚拟机.作为HFSExplorer的运行前 ...

  2. c# 窗体最小化后截图实现

    我们知道,当我们需要对Control进行截图时,我们可以使用Control.DrawToBitmap()进行截图, 那么问题来了,当我们的窗体最小化了,我们还怎么截图呢? 当窗体最小化的时候,我们知道 ...

  3. redis 中文存储乱码问题

    在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) redis> set test "我们" OK redis> get test &q ...

  4. SQLSERVER利用FOR XML PATH实现分组拼接字符串

    首先看一下数据结构表 IF(OBJECT_ID('tempdb..#tProduct')IS NOT NULL) DROP TABLE #tProduct SELECT * INTO #tProduc ...

  5. C/C++基础知识总结——数组、指针域、字符串

    1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...

  6. CSS 选择器的学习

    从蛋学习 CSS 选择器 + 做一个 Jumony 桌面工具,真费劲,目前Jumony Tool两大问题无法解决,完美的显示 html 文档和根据结果在文档中定位,有点儿跑题了…… 1. 选择“cla ...

  7. JS简单验证密码强度

    <input type="password" id="password" value=""/><button id=&qu ...

  8. Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径

    Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...

  9. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  10. OpenXml操作Word的一些操作总结.

    OpenXml操作Word的一些操作总结. OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩 ...