发 帖  
原厂入驻New
[经验]

FPGA 学习笔记01 (LCD 1602,verilog)——2014_6_15

2014-6-15 11:38:15  6050
分享
5
本帖最后由 oldbeginner 于 2014-6-15 11:40 编辑

********************
学习背景

********************


配合 https://bbs.elecfans.com/jishu_435855_1_1.html
proteus仿真学习笔记02 (LCD1602 外设)——2014_6_1

利用51 学习 1602,然后 过度到 FPGA 中 的1602。指令学习将不会在这里出现,但是有复习。

因为 FPGA 也是 初学,感觉 用 FPGA 驱动 1602,有些难。而且包含 1602 的 FPGA 开发板 比例也越来越少,更侧重 VGA 或 TFT。

*********************************
借鉴资料: 青创开发板的 1602程序,和 百度文库中的一篇 PPT,长沙太阳人电子 《1602手册》。

1602 基本操作 有 读时序 和 写时序,借鉴了 百度文库 中 深圳大学医学院(???)的一个 PPT,只考虑 写时序,如下

33.JPG

通过对照 《1602手册》,确认 时序操作 都是以 ns 为单位的,因为 在程序中,利用分频,单位都是 1us,所以操作时序基本上没有问题。

34.JPG

因为借鉴了 青创 的程序,没有了初始化,只有 状态机。

35.JPG

首先,clk_div 从名字上就能看出,是分频后的时钟





  1. //分频时钟
  2. defparam Gen_ClkDiv.divdFACTOR=24,Gen_ClkDiv.divdWIDTH=7;//分频出1M的时钟
  3. gen_divd Gen_ClkDiv(.reset(!resetin),.clkin(clkin),.clkout(clk_div));//端口名称关联

复制代码


这里 做了一个修改,把 240 改为了 24,这样 分配后 的时钟 是 1us。青创配套的程序,在 时序 上的注释 都是 有问题的,比如 等待>40us时间,实际操作上, >1000 us 时间。

程序的 核心 是 状态机 和 某一状态的时序操作。

parameter set_Func=8'b0000_0001,                    //功能设置
          set_DispSwitch=8'b0000_0010,                 //--设置显示开关
          set_EntryMd=8'b0000_0100,                    //--设置输入模式
          clr_Disp=8'b1000_1000,                            //--刚开始时就需要清屏幕
          set_DDAd1=8'b0001_0000,                      //--设置成DDRAM第一行的地址首地址为0x81
          set_DDAd2=8'b0010_0000,                      //--设置DDRAM第二行的地址首地址为0xc2
          display1=8'b0100_0000,                         //--向第一行DDRAM写数据
          Display2=8'b1000_0000,                         //--向第二行DDRAM写数据
          Over=8'b0000_0000;

这些状态的编码是自己定义的,和指令的编码没有关系。
另外这些状态是 有 先后关系的,如下

36.JPG

看第一个状态 clr_Disp





  1.                 case (lcd_state)

  2.                         clr_Disp://--刚开始时就需要清屏幕
  3.                                 begin
  4.                                         delay_cnt<=delay_cnt+1;
  5.                                         if (delay_cnt<=2)
  6.                                                 begin
  7.                                                         lcd_rs<=1'b0;
  8.                                                         lcd_rw<=1'b0;
  9.                                                         lcd_e<=1'b1;
  10.                                                 end
  11.                                         else if (delay_cnt<=4)
  12.                                                 lcd_data<=8'h01;
  13.                                         else if (delay_cnt<=6)  
  14.                                                 lcd_e<=1'b0;//下降沿产生
  15.                                         else if (delay_cnt>=50) //等待>40us时间,使指令写入完毕
  16.                                                 begin
  17.                                                         delay_cnt<=0;
  18.                                                         lcd_state<=set_Func;        
  19.                                                 end
  20.                                 end

复制代码

delay_cnt 是 每过 1us 加 1,用来产生延时。

在 2us 内, rs rw  e 赋值;

超过2us时,写 命令,即给 lcd_data 赋值;

超过4 us时, e 产生下降沿,读入指令;

等待 >40 us 后,设置下一状态。

FPGA状态1.gif

同样的方法,可以分析第二个状态,





  1.                         set_Func://功能设置
  2.                                 begin
  3.                                         delay_cnt<=delay_cnt+1;
  4.                                         if (delay_cnt<=2)
  5.                                                 begin
  6.                                                         lcd_rs<=1'b0;//指令
  7.                                                         lcd_rw<=1'b0;//写
  8.                                                         lcd_e<=1'b1;
  9.                                                 end
  10.                                         else if (delay_cnt<=4)
  11.                                                 lcd_data<=8'h38;//DL=1,8位,N=1,2行,F=0,5*7字体
  12.                                         else if (delay_cnt<=6)
  13.                                                 lcd_e<=1'b0;//下降沿产生
  14.                                         else if (delay_cnt>=50)//等待>40us时间,使指令写入完毕
  15.                                                 begin
  16.                                                         delay_cnt<=0;
  17.                                                         lcd_state<=set_EntryMd;
  18.                                                 end
  19.                                 end

复制代码


此时,lcd_data <= 8'h38; 就是 C51 中常见的 写入指令 0x38。

时序分析省略。。。。

这样, 怎样理解 1602 在 FPGA 中实现,就有了一个大概的理解。

管家 2014-6-17 14:55:32
好东西 支持一下!
回复

举报

oldbeginner 2014-6-19 14:43:39
********************
一段式
有限状态机
********************


青创的 1602 驱动代码 是 标准的 一段式 有限状态机,即 时序和组合逻辑都放在 一段内 (always)描述。

网上吐字比较清晰的视频 是 华清的

http://my.tv.sohu.com/us/82053896/29155722.shtml

*********************************

再来复习一下 1602 的状态:
36.JPG
除了初始化外,还有 9种状态,而且是无条件的转移;
另外 根据定义
moore有限状态机:输出仅依赖于内部状态,跟输入无关。

属于比较简单 的 moore 状态机。

在每个 状态 中, 又包含了一系列 时序 操作,所以 赋值 都是 利用了 非阻塞模式(这个是 一定要理解的概念,否则白学)。

FPGA状态1.gif





  1.                                 begin
  2.                                         delay_cnt<=delay_cnt+1;
  3.                                         if (delay_cnt<=2)
  4.                                                 begin
  5.                                                         lcd_rs<=1'b0;
  6.                                                         lcd_rw<=1'b0;
  7.                                                         lcd_e<=1'b1;
  8.                                                 end
  9.                                         else if (delay_cnt<=4)
  10.                                                 lcd_data<=8'h01;
  11.                                         else if (delay_cnt<=6)  
  12.                                                 lcd_e<=1'b0;//下降沿产生
  13.                                         else if (delay_cnt>=50) //等待>40us时间,使指令写入完毕
  14.                                                 begin
  15.                                                         delay_cnt<=0;
  16.                                                         lcd_state<=set_Func;        
  17.                                                 end
  18.                                 end

复制代码


好在 这几个状态 的格式 都差不多,变化主要 集中在 lcd_data (命令或数据),lcd_state(依次转变,有规律可循)。虽然 代码很长,但是只要理解了其中一个状态,其他的状态都可以理解。 这也是没有 把 所有 状态代码 都复制到 帖子上 的原因;一下子代码太多 反而 会 乱了手脚,不如 一段代码理解透彻,其他代码自然也跟着明白了。

case(状态)
       状态1:一堆代码(理解透彻);
       状态2:一堆代码;
       状态3:一堆代码;
。。。
       状态9:一堆代码;

**************************************
**************************************

关于初学 FPGA 的术语,

术语很 唬人,初学者 很容易 被吓到。

例如 one-hot编码

第一眼看,感觉 高上大,其实理解很简单,就是

parameter set_Func=8'b0000_0001,
                  set_DispSwitch=8'b0000_0010,
                  set_EntryMd=8'b0000_0100,
                  clr_Disp=8'b1000_1000,
                  set_DDAd1=8'b0001_0000,
                  set_DDAd2=8'b0010_0000,
                  Display1=8'b0100_0000,
                  Display2=8'b1000_0000,
                  Over=8'b0000_0000;

状态编码 只有 1 个 1。对照下面看 很简单。
  
十位数
  
  
二进制码
  
  
格林码
  
  
独热码
  
  
约翰逊
  
  
0
  
  
0000
  
  
0000
  
  
0000_0000_0000_0001
  
  
0000_0000
  
  
1
  
  
0001
  
  
0001
  
  
0000_0000_0000_0010
  
  
0000_0001
  
  
2
  
  
0010
  
  
0011
  
  
0000_0000_0000_0100
  
  
0000_0011
  
  
3
  
  
0011
  
  
0010
  
  
0000_0000_0000_1000
  
  
0000_0111
  



************************
阻塞 赋值  和 非阻塞 赋值 ,则需要 很多精力 理解 和记忆。

感觉 解释 阻塞和非阻塞 比较好 的 是 “FPGA Protoyping by Verilog Examples” 这本书 P175,

7.1 BLOCKING VERSUS NONBLOCKING ASSIGNMENT
回复

举报

李萍 2014-8-2 01:21:02
{:1:}{:1:}
回复

举报

李萍 2014-8-2 01:21:20
{:1:}{:1:}
回复

举报

王立宇 2014-8-7 14:31:36
开始学习,谢谢分享!
回复

举报

wangxiaohu1218 2014-8-8 11:08:59
好东西,学习一下
回复

举报

王开拓 2014-8-8 11:19:22
很好的学习笔记啊。很需要的。
回复

举报

郑居烽 2014-8-8 17:34:56
好。。。。。。。。。。。
回复

举报

Window-blinds 2015-5-5 18:52:47
好,赞一个!!!!!!!!!!!!!
回复

举报

lv0817 2015-5-24 10:00:26
很好的笔记,,,,,,
回复

举报

李耀 2015-12-7 13:19:37

正在学习,谢谢楼主分享!!!
回复

举报

laughing小家 2016-4-19 22:11:26
谢谢楼主分享
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表