ASIC数字IC设计讲解(4)连载中......

提醒:【视频版】请在叩持电子知乎观看!
  大家好,我是IC修真院的Andy老师,接下来跟同学们一起来来做一个小的练习,练习的题目是LCD driver的设计。

LCD driver的设计从需求,功能,划分,接口协议,时序,分解,功能设计,仿真。我们按照这个来讲。那么,需求分析是什么?

需求分析:就是要求大家使用verilog代码完成对LCD1602型号的液晶显示屏的驱动设计,那1602就是两行,每行16个字符,这个驱动,液晶显示,它有它的端口,后面给同学们看一下,那他的上位机,前面是一个控制系统,对应的下位机就是液晶显示屏,内部呢,实际上已经内嵌了一个控制的模块,能够接收上位机发过来的控制的指令跟这些data。

那我们的要求LCD驱动模块跟这个主控系统,使用APB接口,这里专门讲了一下,就是说使用APB接口,我们会定义他的时钟是64MHz。这边比如说已经定好了,前面由于我们上位机的需求,那么是64。上位机要求是APB对吧,这个clock好了。然后驱动模块,上位机发过来,把东西发到这儿来控制。那么你的APB把你的东西转出来,到这儿来,比如说,这是你显示的那个两行,一行16个字符,1602它里边也有一个内嵌的一个控制的东西,这是我们要做的东西。这个地方的工作要求是50兆,那第4点就是说,这个模块,我们初始化完成以后,输出什么呢?ABCDEFGHIJKLMOP16个对吧,第二行小写的ABCD,那要求的是说,我们这边主控系统,能够通过APB总线进行编程,控制你输出的这个字符。第五个就是我们的需求,就是有人要求,做这么一个东西,要设计一些东西去分析。你每次输出个新的字符的时候,要来配置寄存器,那如果说人家现在忙着,你不能去编程,那就需要设计这个busy,只有not busy的时候,才去往里写,那我们要求是说,把这边给过来的busy信息放到state里边去,这边能够知道你是忙还是不忙。第七个要求,我们只负责往里写,这个很重要,再强调一遍,我们只负责往里写。
在这里插入图片描述

我们认为它任何时候我们只负责往里写,不去读,那就意味着PWRITE,这个东西是高的,往里写这个data,做读操作。
在这里插入图片描述

需求分析:拓展小知识1

这是一个补充的知识,是关于这个液晶显示屏的,显示屏的原理。我们通过电压,对这显示区域进行控制,有电的就显示,现在很多像PDA上面都用到这个。那它的分类有,段式的,字符式的,点占式的等等比较多,这里就是补充一点知识。
在这里插入图片描述

需求分析:拓展小知识2

那LCD呢,显示一个字符比较复杂,因为一个字符一般是说有这个88,或者是68的一个点阵组成的,可以想象一下,要把这个东西显示过来的时候,可以想象一下我就是一个matrix,那既要找到和显示屏幕上对应着的那个位置,还要是每个字节的不同位,为一还是为零,那一,你这个地方就亮的,零就不亮了,这样就可以显示出某个字符来。我们现在用的带着这个字符发生器的,就比较简单了,只需要把想要的东西控制过去,控制你的光标,送上想要的这个字符,就可以完成了。
在这里插入图片描述

需求分析:LCD1602

接下来做实验,对应这个component元器件,它内部的已经有一个控制芯片了,我们看一下他的管脚,在这个地方都写得很清楚。那一会儿我们有一个table,会来描述的。就是说,我们要做的东西是什么,我们要往这些管脚上驱动东西,让他在上面把我们想要的信息显示出来,要做一个驱动模块对,那这个驱动模块做完了以后,比如说有一个MCU,一个POC。这个地方有一个APB的bus,能通过APB的bus来控制你里面的东西,把你想要的东西下进来。这就是这个东西本身内部已经有一个控制的芯片了,相对来说就会简单些。

在这里插入图片描述

需求分析:LCD1602液晶显示屏主要技术参数

那我们做的这个譬如说需求分析主要的技术参数都列出来了,显示容量1602 十六个字符,两行,工作电压的五V,比如说,比如说是从4.5V到5.5V,工作电流,最佳工作电压,这个尺寸都给你标注出来。刚才强调了内部已经有一个控制器了,所以说设计相对来说就简单了。我们只需要把我们的设计,相应的驱动,像VCS,VDD,这个东西是不是我们来控制的,要控制的是它的data,他的enable,RW,RS,这是我们要控制的。我们要设计状态机,怎么来帮我把想要显示的数据传递给他,他内部就会把这个东西给显示出来。那人家这个东西已经有标准的字库表在里面,这个表库里边比如说像ABCD,1234等等它里面都有。
在这里插入图片描述

这就是刚才看到的这个东西的尺寸特征图,以及那如果是带背光不带背光的一个特征图。刚才给大家看的就是这个地方,这些pin脚,那要关注的是在哪儿?是所谓的每一行16个,一共是两行,能够显示的数据的一定是从左往右过来,最后光标,再继拉,再显示,至于他带背光不带背光,I don’t care,就这是一个物理尺寸的大小。那这个就是刚才讲到的,因为它是一个显示也非常缓慢的一个器件,所以说我们执行每条指令之前,要确认一下是busy还是not busy,本身会输出一个东西,我们要确认一下这个东西,就在not busy的时候才往里去写你想要的东西。

在这里插入图片描述

需求分析:RAM形式的标准字库

地址在这个地方都标出来了,他做的比较多一些,但是,我们因为只是1602所以说这个地方就是00到0F。第二行的起始不是20,是从40开始的,这个点是要注意的,因为我们接下来在去coding的时候,rtl coding的时候,去指定地址的时候,这是我们的确实地址。

在这里插入图片描述

那刚才讲到了,比如说,有个客户就给提了要求,说现在有这么一个LCD1602,有这么一个component,你给我做一个驱动,把这些想要的东西通过这些给弄进来,这个东西里面到时候可能手头都能拿到,做实验,1602这个东西都能拿到,比如说通过PC,通过什么样的MC模拟一下,接到APB上去,他这个东西反正已经能发过来,那我要做一个什么样的东西,人家这里面已经有一个东西了,我要把我想显示的东西要能发送过来,那那个信息在哪里?你可以通过软件在这里面去编程,把编程的控制信息发送到这儿来,对它进行操作。那这里边的信息,如果是因为它是一个慢显的东西,你不能说我一口气把它弄进去,你一定要判断这边会过来一个东西放到这边来,你要把它做一个state register。软件就一下。看他busy没,这个not busy的时候,你才开始去写。那需求就说我这地方有一个上位机一个下位机,就这个1602我这个口跟你定义得很清楚了,我说清楚了APB,那同学们在这个地方脑子就要转一下了,我说32位宽的,你有没有注意到,前面说这个地方的时候是8 byte。那意味着什么?意味着我这个32位实际上是有四个byte,对吧。

另外的需求呢,就是说从ABCD得到OP,这16个大写的,以及小写的主控系统就是你前面处理器是可以通过这个APB的Interface下下来,通过Interface这个地方的输出到按照LCD1602上去的。那如果说我们把这个东西作为一个MCU的控制芯片,这是一个显示的话,这个东西就是你的一个模块,那到时候你做完这个小的module,就可以给你整个的MCU的大系统就可以做一个integration,那就相当于是一个driver。那么这个地方就说的很清楚,就是说我们使用硬件来做,我们一定是能够通过配置我们APP的总线,配置些寄存器,另外刚才提到了,因为它是一个慢显的器件,我们一定要提供一个寄存器,这是一个Status。就是它是类似于一个read only,只读的。就说我们寄存器可能有read write。有时候是write only的。还有些read only的。像这个因为是一个硬件传过来的invicade。你没法去写的,只能去读出来,那读出来的时候要注意了,是不是在你的APB的clock domain里边,那过来的busy也可能是在另一个clock domain里面,刚才讲到的这个地方可能是一个62兆。而你这个可能它的时钟,刚才我们提到了是一个50兆。那这两个是一个时钟频率。那这个东西过来以后是不是要想一想,我是不是要做一个,所以要尽量如果不做成一个,也没有大的问题。但是从CDC的角度来讲,严谨性上来讲,我们要做一个同步进来,放在这儿,因为它是两个不同的clock domain,对吧。

在这里插入图片描述

这些是11条的控制指令,比如说上面有一些乌七八糟的字符要清显示,那光标返回关闭,返回是什么意思呢,
在这里插入图片描述

我们这个光标,比如说一开始在这儿,想象一下,光标右移在那儿走,当你到达这儿以后,下一个的显示,比如说,我们要求是从左到右,刚才讲到的那你的光标,要让他挪到这儿,就跟那个大家想象以前那个擦黑板大黑板擦,比如说从左往右擦一遍,里面有些同学喜欢给老师擦黑板,就这么一个道理,有跑到左边去,一般一来黑板上,上个老师上完高数的课,他的擦掉,紧接着,一个模电的老师可以给你上新的课。清显示,然后让这个光标回到你想要的位置去,那这就是对应的。这些port,这些口就是我们刚才看的,就是说,就是我们这些口了。
在这里插入图片描述

需求分析:LCD1602

大家看一下这个,你看我的data从D7到D0,就是你做这件事的时候,你要把这些口上对应的初步来的value。刚才我们讲到了, 它内部也有一个小的控制器啊,你只需按照这个要求,给他发就行了,人家内部有一个测试780的,你只需要给他发过来,按照这个要求。发相应的控制,跟data过来就可以了。那RW是这样的。那就是读写。它定义的就是LCD1602这个说明里边的这个protocol里面就说你怎么来弄,也就是按着这个东西来弄就可以了。你要想清显示,你就给他发了这RS为零,而WE点。我不是read呀,我是write啊,所以说,就把data写成一,过来就行。光标返回,这输入模式,你就按着这个来。你如果是要无忙的标志,就刚才我讲到的这个东西。这个地方,因为你是要读了,前面零时,write为一时是读。把这个时代都很那这个呢。刚才讲到的这个零就是write,一个就是read。这是一你要写的数据内容,跟要读的这个数据内容。

在这里插入图片描述

那这是我们列出来的,就是相对应的,这个是很重要的!就说是这个地方,只是在这儿,给看一下,下去把这个地方,因为你们要毕竟你们要做,把这个地方认认真真的都看一下。实际上底下会有一个呃,这是刚才在APB bus的那个,我们会有一个安排,这是刚才的管脚的描述,后面还有一个就是说对每一个怎么来做,还有一个更详尽的一个说明。

在这里插入图片描述

接口时序:APB读时序

这是APB的这个,因为我们要写,刚才我提到了不读,我们就是要往里写。当然,这是那个读的时序,这是给了他们的DEMO1下,就前面我们已经详细的阐述过了,那我就skip。
在这里插入图片描述

接口时序:LCD液晶显示屏引脚功能说明

这个呢,就是刚才我讲的这个1602的那些pin脚,那对我们来讲,我们关心的是哪一些啊?这些,以及这些OK,那这些东西你可以去l8连接,像这个刚才提到了VDD要接什么呀,5伏电源,这个该怎么接啊!你是怎么来接,这个是由他的讲究的那我们不太关心他,从我们这个设计上来讲。

在这里插入图片描述

接口时序:LCD读操作时序

那这是他的这个读的时候的一些时序,这是他的spec里边,要求我们也必须要respect。那么来看一下,假如说我要读的话,那我把这个RS拉起来,因为我是要读,所以说他一定是高,高了以后我这个时候enable打起来,打起来以后呢,内部的data开始准备,在我这,肯定要有一个setup跟hold的概念在里边,就是后面一个表!会给大家详细描述每一个parameter,每个parameter它的含义,对吧?那它里面也是有一个hold跟setup这么一个概念在里边。那你在这个沿上,就把这个data给抓走,抓走了以后,RS跟RW就可以了。
在这里插入图片描述

这是对应的里面的每一个具体的要求的值,那这个是我们要注意继承他写的一个,也是类似就说你写的时候,你一定要把这个data早一点的present过来,等他在这个下降沿,把这个东西放进去,那大家看一下这有个AH的描述,就是你的hold,DSW,这类似于你的setup,就是你这个data。要提前准备,就是说它相对于enable的下降沿来讲,你这个数据要准备好,维持一段时间。就跟我们这个clock所讲的这个setup跟hold里边,有个类似的。我们的在他hold是这样子对吧,我们要准备好。那这是我的clock沿,那在这个clock上升沿来之前,我们这个data要必须先准备好,这是我的setup对吧?那等我这个走了以后,我要hold,这是我们的这个flip flop,那我们就就跟这个类似了,我们是看关门的时候。我要看他的关门的时候,setup,hold。那这个地方呢,要对上需求对吧,这个的同学们要注意,就是可以对这张表对着这个把每一个参数的,自己理解一下。
在这里插入图片描述

功能分解:详细结构框架

那好,那有了前面讲了以后呢,我们内部怎么做这个东西,人家已经给咱们要求了。customer已经给咱们要求了,这个地方是64,对不对那你这边过来的是多少,这是个多少,这应该是一个50吧。reset对吧?那这边比如说MCU上面有一个东西。你这个就是一个就在上面。他要求是什么?我们这个说APP的,并且我们讲了我们是只写不读,往里去写,判断busy不busy,把那个FB读过来。那我们内部,要有寄存器,因为你无论如何你是要写那些输入,把每一个位置上,你要往里去写不同的输入,所以说,每一个位置有对应着一个寄存器。另外刚才讲到的我要把内部的那个东西拿过来,他不忙的时候开始写。我们内部就是说,一定要有这个东西要提供这个东西,另外我们要有这个状态机,他写的时候是有要求的。另外,怎么又给他要接上,对接上那个口,把它都已经看过了,对吧这就是我们内部的这个框图。

功能分解:框图整体功能概述

那转化成文字描述,那就说我这个设计框架有APB,LCD接口,有内部的寄存器,我们内部因为我要写,写的时候先清屏啊,等待,然后擦屏,然后写。写完一行,然后呢,移动光标到最左边开始写第二行的,对吧,写写写写完以后回去。这个东西,大家想象一下,我就可以拿一个状态机来做,对不对我就是顺序的对吧?接收发回来的东西,把这东西传过去。那这些就是说,数据和内部寄存器,使用多组寄存器来设计,就是我们是这样的想的,然后,每一组寄存器对应四个字符,为什么是四个字符啊?刚才讲过了,一个字符是多少。8bite,一个byte,那么我们的APP,刚才我讲了是多少,是32,对不对那你内部不就是四个byte对吧?那我们LCD的设计那可以灵活的设计。比方说这个打开啊!关闭啊!我清一些原来的显示的内容呀!对吧?我设置成输入模式呀。跳到第一行呀,第二行第一列呀等等等等,这些。
在这里插入图片描述

功能分解:APB接口和LCD接口

刚才讲过了,就说我对APP接口的这个阐述,64兆32位宽度。持续参数就可以看,这个里面有一个描述就说我是一个什么样的状态。我写进去,输出是一个什么样的东西。

功能分解:寄存器功能

那寄存器,我们怎么来做。我们现在要求的是说要显示同大ABCD等,这16个已经晓得ABCD,一行显示一个,那我们现在内部有单独的针对每一个。然后我们的MCU可以通过APP clock 往里去配置想要的东西,你如果想换成别的东西也可以啊,你编成不同的数值过去就OK了。那busy一再强调,就是我们有这么一个东西。
在这里插入图片描述

功能分解:初始化(复位)过程

那这个东西同学们一定要认真看一下,我们做的时候就是照这个来的,要做这种来做功能分解的时候,就是说这按个来做,比如说驱动商店完成后,我们delay。然后写指令38H。然后我在delay。以后呢,每次写写指令,写数据,你都需要检测这个忙,还是不忙对吧,就是这刚才前面也提到了说,说这个关闭显示模式,显示模式的设置,显示关闭,清屏,移动光标对应的这些,在这儿。就是你只需要把这个东西下过去,他就认识你这个东西。那我要求说,驱动完成以后,自动这32个字符在上面要显示出来。

功能分解:主状态机功能

那刚才讲到了我们的显示方式,是第一行显示完,然后光标要回到下一行的行首,那这个时钟,复位这个地方的也有具体的要求,同学们到时候做实验的时候,把这个地方,大家看一下,那这个地方要提一下,就是说他这个里边的那个模块,对这个有一个要求,比如说这个第二行的第一个字符,我们前面提到。

需求分析:RAM形式的标准字库

他的地址是说这个图里面,就是第二行第一个地址是40H,那我们是不是就直接写个40H就行了呀,答案实际上是否定的,为什么,我们要注意,就是说你要从这个地方开始写的时候呢,就这些40H是不行的,因为他要求这个写入这个显示地址的时候,最高位这个D7必须恒定为一,所以说写入的时候,也就在这个上面最高位的这个一也加上,就你写这么个数,C0H,就OK了。

功能设计:字符写入过程

要设置这个显示模式,他这个本身这个显示,就是从左往右自动移动的,你不用去管它,就是说,你只是要去一下他逼busy还是not busy,它里面已经集成了,比方说,有这个阿拉伯啊,英文字母呀,一些常用的符号。这些东西,他每一个对应着这么一个数值,那这有一个表可以查,那在这个地方,没有显示出来,那当同学们做练习的时候,可以把那个表格对应的查一下,看一下A是对应哪个,B是对应哪个,哪个是对应哪个,这是油表可查的,譬如说,我们把这个东西输过去,他那边就知道这是个A,你把另一个值输过去,这就是B。这有一个查找表,到时候,同学们的可以去找一些老师要一下。

在这里插入图片描述

功能设计:主状态机

那这就是刚才我提到的,就是说我们做的这个设计,我们要遵循这么一个要求。那这个东西实际上转化成我们内部的设计的话,就是我们的状态机。就是说首先第一个状态,比如说,我reset完了以后,我在这个list,那如果说你把那个寄存器打开了以后,他也会跳到这个状态来,然后他要先关显示。清显示,然后,他变为输入格式。然后,设为输入格式以后呢,我就可以是显示了。那光标跳的,就是说第一行的第一个上面对吧,那就开始发通知,发16个,发完以后,它会自动的跳到第一行第二个上面去,再继续发送,从十几个发送到16个发到32,那就结束了,那对应的要发送的那个东东在这个地方给大家列出来了,指令就是你要发送的那个东西对吧,都列得很清楚,大家照着这个到时候去发送这个东西就OK了。这个地方,省略符那我的状态,这个地方涉及到很多的,最简单的就是顺序来写,发一个发两个到发完。就是说我们这个东西是跟我们在这个状态有关系,你要发啥的东西只跟状态有关系,跟你输入没有任何关系,输入给已经通过APP跟他给隔离开了对吧,APP寄存器下过来,下到我们这个状态机里,他就在那不停的跳对,你只要是开始显示,他就开始跳。
在这里插入图片描述

功能设计:显示驱动模块显示流程

那显示流程就这样的,就说我完成以后,可以去通过MCU配置这个使能寄存器,配置字符寄存器,配置完了以后看他不busy,那么就可以开始去做了,一个一个的显,不停地LOOP,LOOP,LOOP,最后弄完了以后,OK,就结束了。

本期课程到这里就结束了,课后练习(LCD_Driver的代码实现),希望同学们自己做,如果需要进行辅导和答疑解惑,请在下方留言!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值