00:00
好,那么接下来的话,咱们就以咱们这次实训的主题,然后呢,给大家呢去分模块,以及去细分一下咱们的呃各项功能以及模块的一个划分,然后呢,呃,咱们一步一步的给大家呢,去讲解一下咱们的每个模块的功能,以及呃,以及这个怎样的去做的啊。好,那么首先的话,咱们本周的任务呢,是去做一个图像的采集以及显示,包括咱们后续的一个图像处理啊等等这这一部分的内容,那么嗯,首先的话,我先给大家呢,去大概的画一下咱们的一个整个的一个逻辑。嗯,首先的话,呃,咱们呢。
01:01
嗯,做这个图像采集的话,肯定是需要有一个图像采集的设备,那么这个设备的话,咱们用的呢,是咱们常见的一个摄像头。常见的摄像头,这个摄像头呢,咱们用的型号是OV7670的一个型号。啊,用的是这款摄像头。那么这个摄像头呢,它有一些好处啊,就是首先的话,它的呃驱动比较方便,然后其次的话,体积比较小啊,携带也比较方便,然后它的图像呃对于我们来说,呃对于我们的做这个实验来说啊,这个清晰度,包括这个分辨率等等各方面呢,已经是呃可以满足我们的实验的啊,所以呢,我们在做的时候呢,就选择了这一款。摄像头啊,选择这款摄像头,这个摄像头呢,它的主要作用是将我们外界的一个光信号转换成数字信号。
02:04
啊,转换成数字信号。那么转换成数字信号之后。啊,咱们呢,把这个数据可以给它缓存到一个存储器里面啊,比如说咱们的SDM。那这个过程的话。呃,首先这个树模树魔魔术转换这个过程呢,是不需要咱们去做的,在这个摄像头里面,它内部的话会自带一个,呃,魔术转换的一个模块,它输出出来的数据直接就是数字信号,那么我们IP音呢,可以直接把这个数字信号啊,直接拿过来继续用。那么这个地方为什么要把这个图像数据缓存到SDRAM当中呢?呃,是因为咱们后续呢,是有一个显示模块的,这个显示呢,咱们用的是围巾。
03:04
嗯,危机模块。那么V呢,它是比较特殊的一个显示装置啊,特殊在什么地方呢?就是首先它的速度。啊,它的速度是没有摄像头快的,那也就是说它在显示的时候,嗯,摄像头速度,呃。比较快,然后呢,VD呢,这个要数据的速度呢,比较慢,这是其一,其次啊,第二点就是V机要数据的话,是在特定的时间段去要数据的,不是全程都要数据的,那么咱们的摄像头呢,是全程都是给数据的,是一直给的,那么这样的话两者不协调。那么所以呢,我们要将数据呢,做一个缓存,当我们的VGA需要数据的时候,然后呢,从存储器当中把把这个图像数据给读出来,然后进行显示,是这样的一个过程,那么。
04:05
可能会有同学这个有疑问,就是说为什么我们要用到SDMM啊,不用到其他的存储器,那么呃,首先的话,在我们常用的啊,或者是大家比较熟知的一些存储器当中,嗯,这个。相对来说它的存储的容量比较大啊,存储的容量比较大,咱们这个呃,常用的,比如说这个常用的SDM,咱们可以用到2个G啊,可以用到2个G的一个存储。那么像一些一般的其他的存储器呢,它的存储容量可能只有几十兆,或者是呃,几百兆这个容量的话,可能不够咱们的图像。呃,咱们的视频图像去存储,那么这个时候呢,就需要我们用一个大容量的一个存储器啊,那么我们就想到了我们的SDMM,或者是呢,大家可以也可以用咱们DDR也是可以的啊,DDR的容量也比较大啊,但是呢,呃,相对来说咱们的SDM呢,驱动起来比较方便。
05:15
啊,所以呢,咱们就选择了SDM。然后后续啊,后续这个VGA,那么咱们常用的视频显示装置啊,视频显示接口除了危机呢,大家可能还比较熟知的像HDMI。这两款接口的话,呃,都是可以作为咱们的视频显示的一个接口来用的,但是这两者的区别在什么地方呢?呃,就是两者都可以传输高清图像,但是呢,HDMI比VGA这个高级的一个地方在什么地方呢?就是。HDMI可以传输。声音数据啊,就是传输咱们的音频。
06:01
啊,这是它比较,呃,这个高级的一个地方。嗯,那么呃,在这儿的话,为什么还要用围巾呢?啊首先第一个问题就是咱们的,呃这个大多数啊,大多数的这个嗯,这个。显示器啊,用的还是晰机的一个接口啊,这是其一,其二的话,V机的显示是比较简单的啊,V机的显示是比较简单的,驱动起来也比较方便,而且呢,我们也不需要呢去像admi那样,需要对这个数据做编码啊,这这部分内容呢,对于对于这个大家来说呢,可能呃稍微这个复杂一些,呃稍微复杂一些,所以呢,我们在这儿呢,就选择了相对来说比较简单的啊围巾。啊,这是呃,我们的一个选择,嗯,当然了,V是也是可以显,也是可以显示高清图像的,呃,所以对于我们来说,对于显示来说是没有任何影响的啊,没有任何影响的。
07:11
这是我们每个模块的一个,呃,划分以及这个选择啊,这是大概是这样的一个过程啊,大概是这样一个过程。那么咱们,嗯,咱们这次实训的话,呃,主要的话,呃,是把这个几个模块呢,一一的给大家呢,去讲解一下。啊,然后呢,嗯,我们由简单到复杂的一个顺序,然后呢给大家去做分享。那在做分享的时候呢,我会这个。嗯,带大家呢,从头到尾的去写咱们的代码啊,那如果说呃,大家这个。哪个地方没有跟上,或者是没有听明白,那么大家就直接在聊天界面呢,直接说,然后呢,嗯,我看到的话会给大家去做解释,嗯。
08:11
好,那么接下来的话,嗯,咱们就从最简单的危机模块啊开始,然后呢,给大家去一个一个来讲解啊。嗯,首先嗯,先来介绍一下VGA,嗯,VGA呢是咱们视频图像阵列的一个显电这个视频接口,那么在这个前些年,在HDMI还没有普及的时候呢,危机呢,是作为咱们显示的一种标准啊,显示一种标准,那么它呃。驱动呢比较简单啊,管角也比较少啊,咱们呢,呃还而且呢,它还有具有分辨率高,颜色丰富等等等这些呃,这些比较呃比较显著的一些特点啊。
09:13
那么。嗯,咱们的微机接口呢,大家应该也比较熟悉啊,大概是这个样子,在咱们的呃,显示器上啊,或者是大家的笔记本上可能都会有这个接口啊,可能这个近些年这个。这个新出的笔记本呢,可能都换成了HDMI的接口啊,那么但是呢,不影响啊不影响呃,如果说后续的话,大家想要去呃,这个使用这个接口的话啊,大家呢,可以做一个转接啊,因为在这个市场上有这个危机和HDMI相互转换的一个接头啊,如果大家需要特殊场合需要去需要去使用的话,大家可以呢,去购买一下那个那个转接口啊。
10:01
那么咱们这个地方的V呢,大家可以看到啊,它是一种梯形的一种接口啊,梯形的一种接口,那咱们在图图当中呢,看到这个接口呢,是一个母座啊,是一个母头。呃,那么。呃,这个微机接口呢,呃,它总共呢是有15个针啊,15个针也就是说咱们母座呢,是有15个插孔的啊,15个插孔的总共呢是分为三排啊,每一排呢是5个,是这样的一个划分,那么这5这15个接口里面啊,都用到了哪些接口呢?啊,我们先来看一下它的各自的含义啊。大家可以看到这个每个管角啊,每个管角都是干什么用的,在这上面的话都会给大家做了注释啊,比如说地址麻,还有这个,呃,蓝色这个颜色的地线,或者是蓝色的基色啊,然后绿色红色,还有咱们的地址码,还有行场同步啊等等等等啊,像这些信号。
11:12
啊这些信号,那么在我们的这个呃使用当中呢,呃可能呢,呃这个有些有些这个插针呢,是没有接的啊是没有接的,也就是说嗯,我们只使用了它,它其中的部分端口啊,只使用它其中的部分端口,那在这儿的话,我就呃以一个。嗯,卡瓦为例啊。我就在这儿的话,随便给大家找一个开发版啊。嗯,因为这个接口的话,大部分都是一样的啊,都是通用的,所以在这儿的话,我就以一个为例啊,给大家去解释一下这个接口。
12:01
好,我们来看一下啊嗯。咱们这个接口的话,呃,咱们这个接口的话,嗯,大家可以看到总共15根针,15根针呢,我们先看左边这一列啊,先看左边这一列,左边这一列的话,第15个管角是没有接的啊,是没有接线的,然后14接出来了,13接出来了,分别是V1的VS和HS这两个信号,这两个信号的作用是什么呢?啊,它两个作用呢,分别是进行咱们的行列同步的啊,是为了进行咱们行列同步扫描用的啊,这是这两个型号。然后12管角,11管角也没有接啊,这是我们左边这一列物的5个管角啊,这5个管角当中呢,只使用了其中两个。然后我们再看中间这一列10管角啊,然后呢,到这儿接到D了,然后9管角没接,8管脚接地,7管角接地,6管角接地啊,大家可以看到中间这一列5个管角啊,一个没接,4个接地。
13:13
啊,四个接地,然后呢,我们再看最右边一列,五管角没接,四管角没接,然后三管角啊拉出来之后分成了两根线啊一个管角拉出来之后分成分成了两根线,然后二管角拉出来之后分成了三根线,然后一管角拉出来之后分成了三根线啊我们呃,这个电路图的话,我们先不管这个分成了几根线,我们可以看到整个的晰接口15和管角啊,我们只使用了其中的。5个管角啊,5个管角,然后其他的要么没接,要么就是接地了啊,那么。这5个管角呢,也就是咱们危机驱动的主要信号啊,我们呢,需要去通过驱动这5个管角,然后达到。
14:06
咱们危机显示的一个目的啊,危机显示的一个目的,那么这5个管角啊,分别是怎样的时序,或者说分别怎样去驱动啊,我们接着往下看。啊,我们接着往下看。嗯,在这儿呢,我们首先的话,先给大家呢,去说一下我们的图片啊,说一下我们的图片,呃,就是我们的图片呢,都是由像素点去构成的。这个像素点呢,嗯。是一个很小很小的一个点啊,在咱们这个屏幕上的很小的一个点,那么这个点呢,如果说足够多,那么它通过拼接的方法可以呢,实现咱们显示图像的一个效果啊,显示图像的一个效果。
15:08
那么大家都知道咱们的图片呢,都会有一个分辨率的一个说法啊,图片都会有一个分辨率的说法,那么这个分辨率的话是对应咱们这个。图片的一个像素点的个数啊,那么当然这个像素越越高啊,这个图片呢,越高清啊,大家看看起来的话就画质就越好啊,是这样的一个关系。那么我们。显示器呢,在显示的时候。嗯,它是一个像素点一个像素点的去扫描的啊,就是嗯,假如说你整个的屏幕是有100个点,那么这个扫描的时候呢,它会从第一个点开始显示,然后呢,一直到最后一个点,一个一个的去显示,那又因为呢,它扫描的速度比较快,所以人眼呢,看起来呢,是所有的像素点呢,都是一起一起点亮的啊一起点亮的,其实呢,这个呢,是咱们的一个人眼的一个视觉的一个错觉。
16:13
啊,一个错觉,因为它速度比较快,人眼呢是看不出来的啊,如果是然后呢,我们通过连续不断的去刷新,然后呢,大家就能看到咱们的视频啊,是这样的一个效果。那接下来的话,咱们就需要呢,去了解一下咱们屏幕的一个扫描方式。这个扫描方式的话,咱们呢,是分为这个两种啊,是分为两种。嗯,第一种的话。第一种的话。啊,是这个。假如说这是咱们的屏幕。啊,这是咱们的屏幕。嗯,第一种扫描方式就是从第一行的第一个点开始扫描啊,然后往后。
17:03
啊,第二个点啊,第三个点啊,就是就是按照这样的顺序,一个一个的去扫描,然后呃,第一种扫描方式呢,叫做。隔行扫描。啊,隔行扫描。隔行扫描的话,就是什么含义呢,就是。嗯,咱们的扫描呢是呃,第一行先扫,扫描完之后,然后再扫第三行啊,再扫第三行,第三行扫完之后扫第5行,它是隔一行去扫描的,然后呢,扫描到最后一行的时候,再回过头再扫第二行啊,再扫,然后第4行第6行这样的一个顺序去进行扫描的,那这种扫描方式,呃。这个有一些缺点,比如说嗯,它这个控制呢,比较复杂啊,控制比较复杂,然后呢,其次。
18:05
这个屏幕人眼看起来呢,它的闪烁比较厉害,所以给人的感觉呢不是很好,所以这种方法的话,嗯,扫描的话,这种扫描方式现在的话一般的话就很少用了啊,一般就很少用了。然后呢,现在用的比较多的就是我们的第二种扫描方式,叫做逐行扫描。啊,叫做逐行扫描,这种方法的话,它是一行一行的进行显示,从第一行的第一个点开始,然后呢再扫,呃,把一整行扫描完,然后再扫第二行,然后第三行第4行按照这样的顺序去进行扫描的。啊,这种扫描方式的话,控制简单,而且呢视觉效果呢也比较好啊,这是咱们的第二种扫描方法。嗯,那么。这种扫描方法。
19:01
啊,这种扫描方法我们怎样去控制呢?就是说我们怎么能够让屏幕能够知道什么时候第一行扫描完了啊,然后开启下一行呢。怎么去这个告诉他呢,我们就是通过我们的呃,VS和HS这两个信号去做控制的啊。通过这两个信号的控制的话,我们呢,可以很好的呃,让这个屏幕按照咱们的想法呢去进行扫描。啊,而且呢,呃,另外每一种分辨率呢,都是对应一种,嗯,一种这个视频格式的啊,就是说不同的分辨率,它的行和列的点的个数是不同的,然后另外它的扫描的速度也是不一样的。啊,扫描速度也是不一样的啊,我们来看一下这个分辨率啊,看一下这个分辨率。
20:02
这是咱们这个显示器比较常用的一些分辨率啊,这个分辨率的话。嗯,咱们用危机接口呢,都是可以去实现的,那但是呢,咱们今天就选择其中一种进行显示啊,进行使用啊,比如说呢,咱们就用这个。640×480啊,这种这个分辨率啊,为什么要用这个分辨率呢?因为咱们的摄像头输出的视频格式就是这个分辨率啊,摄像头输出的分辨率就是这个,所以呢,咱们为了后续的使用,咱们呢,就把这个微机呢,在做的时候就按照这个分辨率来做啊,这是咱们的一个做法。那么在这儿的话给大家呢,去解释一下这个。长度啊嗯,首先的话,咱们的扫描时钟是25.175MHz,那这个时钟的话,咱们呢,是无法是没有办法通过代码来实现的,那么咱们怎么办呢?会咱们呢会通过锁向环啊去直接去生成。
21:15
啊,用锁链环直接去生成。然后它的一行是总共呢,是800个点啊,一行总共是800个点,这是它一个嗯行的一个长度,然后列的话,一列总共是525,嗯,总共是总共是525啊,也就是说一一副图片有525行啊,这是它的一个参数啊,这是它的一个参数。然后至于这个ABCD啊是什么含义呢?在这儿的话给大家去做一下解释。就是说,嗯,假如说这是咱们的显示区域啊,这是咱们的显示区域,就是说大家能看到的显示器给大家去显示图像的一个区域,那么在这个区域之外呢,其实呢,它还有一片区域。
22:10
啊,它还有一片区域。呃,在这片区域里面呢,呃呃,官方呢,把这片区域给它做了一下划分,呃,它是怎么划分呢?假如说呃先说咱们的列,他把这个列呢。在这一部分分成了两个部分,第一个部分呢,咱们称之为A段,第二个部分呢,是到这个显示区域为止啊,这一部分呢,叫做B段。啊,然后中间的显示区域咱们称之为是C段,然后最后这一部分称之为D段啊,它是把这个列呢,分成了这4个部分啊,分成这四个部分,这四个部分分别都是什么作用呢?啊在这儿呢,给大家去介绍一下,首先这个A段叫做列同步区啊,叫做咱们的同步区啊。
23:05
这个同步区呢,就是为了同步咱们的一个扫描的啊,A段呢,就是这样的一个作用,然后B段和D段。嗯,称之为咱们的消音区。啊,称之为咱们的消隐区,这个消隐什么意思呢?啊,这个消隐呢,其实嗯这个嗯这个直译过来呢,叫小尹啊其实它的作用是什么呢?它的作用呢,是来传输其他信息的啊,是来传输除了视频图像之外的其他信息的。啊,是这样的一个作用。那么C段的话,就是咱们的一个视频显示的一个区域啊,视频显示的一个一个。部分啊,然后行的话,它也是这样去划分的啊,行的话也分为A段。
24:00
B段,然后中间的C段,然后最后的D段啊也是分为这4个部分的,啊也是分为这4个部分的,那A段作用也是一样,都是用来做同步的,B段和D段呢,也是效应区,那C段的话就是咱们的显示区域,那当我们的行和列同时扫描到这个C段的时候,就是到了咱们的显示区域了。这个是咱们的一个。这个扫描,那么不同的分辨率ABCD四段呢,长度是各不相同的啊,长度是各不相同的,大家从这个表格当中也可以看得出来,每一个分辨率都是有呃,这个一组特殊的数据的。啊,都是不一样的啊,都是不一样的,那么我们做的分辨率呢,是640×48640×480,呃,这样的分辨率对应的长度啊,每一段对应的长度啊,在这儿的话都给大家呢给出来了啊,到时候咱们去做的时候就按照这个长度啊来做就可以了。
25:10
好,那么接下来的话。嗯,咱们再来看一下咱们的行列的一个同步啊,是怎么去做同步的。在官方的时序当中呢,是有这样的一个要求,就是场同步信号呢,必须在扫描到A段的时候,必须为为低电平。啊,扫描到A段的时候必须为低电平,那也就是说你在。呃,你在这个A段的时候,扫描到A段时候,你让你的场同步信号拉低,那么这个显示器呢,就知道你要换行或者是换列了啊,是这样的一个,呃,是这样的一个作用啊,是这样的一个作用,嗯,所以呢,咱们待会儿再去做驱动的时候。
26:00
啊,一定要注意让这个场通的信号啊,VS和HS这两个信号呢,扫描到A段时候为低电平啊,这是这个官方的一个时序上的一个要求啊,这个咱们必须要实现,要不然的话,这个危机驱动呢就不会成功啊,咱们必须要按照人家的时序来,这是咱们的一个。呃,时序上的一个要求啊,那了解了这了解了这个驱动之后呢,还有三个信号啊,还没有给大家去做介绍啊,这三个信号呢,就是咱们的,呃,123这三个端口啊,123这三个端口,呃,这个VS和HS呢,刚才已经给大家解释过了,它的作用以及驱动方法,以及在核实给什么样的波形,呃,这个呢,都给大家已经说过了啊,都已经介绍完了,那接下来的话,我给大家去介绍一下一二三这三个管角到底是什么样的作用。嗯,大家都知道这个颜色的话是有三原色的,呃,是有三原色的,那么这个三原色,嗯,咱们图片的三原色是什么呢?是红绿蓝啊是红绿蓝,那么咱们要让屏幕去做显示,那么咱们就需要呢。
27:19
呃,就需要呢,这个给出来颜色,那这个颜色怎么去给呢?呃,这个颜色怎么去给呢?咱们就是通过这个,呃,这三个端口啊,直接去给颜色数据,然后呢,让它显示对应的一个。颜色的,那么嗯,这三个颜色是可以混合出来咱们想要的任何颜色的啊,就是说咱们的其他颜色啊,都是可以通过这个三颜色混合而成啊。那么。咱们,嗯,来看一下。来看一下,比如说一拉出来之后呢,大家可以看到它是分成了。
28:01
呃,三个三个管角,这三个管角,嗯,大家可以看到它对应的电阻的阻值是不一样的,呃,电阻的阻值是不一样的,那也就是说这三个管角所对应的电压的分量是不一样的。啊,这个,呃,不是这个是对应的这个电流啊,是不一样的啊,对应的电流是不一样的。那么我们想要显示呃不同颜色的话,那么就需要对这三个管角,呃,给出不同的电瓶就可以了啊给出不同的电瓶就可以了,因为我们这个呃V机的话,它是一个模拟信号的一个接口,那也就是说你这个不同的电压会显示出来不同的颜色,你比如说咱们的红色,你这个有这个电压的高低区分,那么它显示出来的时候,这个红色就会有这个深红和浅红的一个区别。
29:05
啊,深红和浅红的一个区别。那么其他的像绿色和蓝色也是一样的道理,那么像我们目前划分成的这种格式,叫做RGB的332的格式,就是红色占。占3位,呃,绿色占3位,蓝色占2位,是这样的一种格式啊,当然了,在现在市面上大家可能还会见到什么呢,就是见到咱们的这个。嗯,这个分量呢,是565的一种格式啊,565的一种格式,或者是八八的格式啊,都是有的。嗯,那么大家在做驱动的时候,一定要根据这个硬件电路啊去做调整,呃,比如说你的硬件电路呢,就是规定的就是就画出来了,就是332的,那么咱们在做的时候就按332的格式呢去做,如果是565,那你就按565的格式去做。
30:05
啊,这是咱们的一个要求吧。好,那么接下来的话,咱们知道了这个驱动之后呢,嗯,接下来呢,咱们就做一下咱们的代码的一个。呃,一个驱动啊,首先的话,大家先把咱们的软件打开啊,先把咱们的软件打开。啊,这是咱们的这个,嗯,这两天要用到的这个软件的一个界面。这个软件的话,嗯,比较大,嗯,大家在呃打开的时候啊,可能会稍微慢一些啊,稍微慢一些。嗯,然后的话。这个大家其实只要这个。只要这个熟悉一种软件啊,熟悉一种开发软件,其他的开发软件呢,其实都是大差不差的啊,都是类似的啊。
31:17
好,那么大家把软件打开之后,那接下来的话,咱们就去建工程,然后呢,给大家做一下这个驱动。首先的话,呃,这个界面的第一,呃,第一条啊是快速开始那么。呃,第一个就是创建工程啊,然后第二个打开工程啊,在这儿的话,咱们就直接去创建工程就可以了啊,直接点这个第一个选项啊去创建工程。好,弹出来这个界面之后啊,我们下一步。然后嗯,这个工程起个名字。
32:04
比如说叫做围巾。啊,工程的名字叫做VJ。嗯,大家的话也可以把这个。呃,名字啊,先给他写好啊。把这个名字给他起好。啊,那好了之后大家呢,自己去选择一个路径啊,自己去选择一个路径,呃,但是呢,这个路径一定要保证是没有中文的啊,一定要保证没有中文。
33:01
好,那么大家这个选好这个路径之后,我们继续下一步啊,继续下一步啊,大大家这一步这个对勾一定要打上啊,这个对勾一定要打上这样,呃,这样的话,它会自动的帮咱们去新建一个文件夹啊,会新建这样的一个文件夹。啊,大家可以看到后边会有一个路径对吧,这个路径就是呃,他帮咱们自己新建好的啊,他帮咱们新建好的。把这个对勾给勾上啊。然后好了之后,呃,往下下一步。啊,然后呢,选择这个RTR工程啊,选择RTR工程,然后下面的话也有一个选项,这个的话,呃,是这个问大家这个是否去定义原文件的啊,在这儿的话,咱们先不定义啊,所以把它给勾上。勾上之后啊,接着下一步。
34:03
呃,在这儿的话需要呢,我们去选择咱们的IP的芯片啊,IP的芯片,嗯,那。呃,大家现在手里有没有这个对应的开发版啊,有没有。啊,大家如果这个手里有这个开发板的话啊,大家打个1。没有的话打个2。嗯,没有是吧,好。那如果说没有对应的卡板的话。那么我们就呃,就随便找一个芯片型号,然后呢,我们就继续往下做啊。
35:04
嗯,我们,呃,随便找一个吧,啊,假如说就以这个为例吧。这个型号呢,是叉C735TFGG484-2是这样的一个型号啊,大家可以直接在这个搜索框里面把这个型号给打出来啊,直接在这个搜索框里面把这个型号给他打出来啊就可以了。
36:07
嗯,这个这个字体大家能看看得清吗。能不能看得见,如果看不见的话,我给大家呢。这个重新写一下啊,我给大家重新写一下。这个型号啊,是。叉C,嗯,然后735TFGG484-2啊,是这样的一个型号啊。大家直接在搜索框里面啊,直接去搜这个型号就可以了。
38:03
好,那么大家这个型号啊,打完之后啊,选中第一个啊,它下面有一个L啊,下面有一个带L的,那这两者有什么区别呢?就是呃,一个呢是这个正常的,一个呢是低功率低功耗的一个芯片啊,咱们就选择这个上面这个就可以了。咱们选择上面这个就可以了。这个一定要选中一下啊,一定要点一下啊,选中一下,然后再下一步,然后完成。
39:14
现在的话,大家可以看到咱们的工程呢,已经新建好了,这一部分的话,就是咱们整个工程的一个呃,一个信息,包括这个芯片,包括咱们的工程路径,包括咱们的这个工程名,还有以及咱们的用的这个语言等等等等啊这些信息呢,在这里面都可以看到啊,都可以看到。好,那接下来的话。呃,接下来的话,咱们就先新建一个文件,然后呢,写一下咱们这个驱动啊,写一下咱们的驱动。首先呢,咱们点一下这个窗口上的一个加号啊,这个地方呢,有一个加号,点一下这个加号。点一下加号之后呢,大家可以看到呢,这里面呢,有三个选项,第一个选项呢,是创建添加或者是创建咱们的呃,约束文件。
40:09
这个约束文件的话,是咱们的管角约束文件啊,是管角约束文件啊,现在的话咱们还没有写代码,所以呢也不需要去分配管角,那第一个选项呢,就先不选啊,就先不选,然后的话,第二个是创建或者是添加咱们的原文件,这个原文件呢,是指的是咱们代码的一个原文件啊,所以呢,咱们此次要新建文件的话,就选择第二个选项。啊,就选择第二个文第二个选项,然后第三个的话,它是来添加或新建咱们的,呃,这个仿真源文件的,呃,仿真源文件的在这儿的话,咱没有还没有到仿真那一步,所以的话,第三个选项也不选啊,咱们就选择第二个。选择第二个之后,然后下一步。
41:02
转到下一步,到下一步之后。呃,下面呢,也有三个选项,这三个选项呢,咱们选择创建文件啊,选择创建文件,因为咱现在的话还没有代码啊,还没有代码文件,所以呢,咱们要新建一下。啊,然后呢,点完之后需要去给文件起个名字,咱们的文件名字,比如说还叫做VGA啊,还叫做VGA。咱把这个文件名啊,给它写进去就可以了,不需要呢去。呃,不需要呢,去做其他的修改啊,其他都不需要去动啊,就写一个文件名就可以了,然后OK。然后再点击完成。然后这个这个界面的话,是让咱们呢去定义咱们的端口的啊,去定义端口的,那在这的话,我就不需要让它去定义了啊,待会儿的话咱们自己去写代码,然后直接点OK就可以了。
42:09
然后新建好之后呢,大家会在这个窗口里面看到咱们刚才新建的这个原文件啊。可以直接看得到。啊,那么新建好之后,接下来的话,咱们呢,就直接双击啊,直接双击,然后呢,在这个文件里面去写代码就可以了,啊在这个文件里面去写代码就可以了。
43:11
呃,那在这儿的话,呃,它里面呢,有这个生成的一部分内容啊,这部分内容的话,呃,在这的话就不再使用了啊,然后呢,我在这呢,全部给它删掉,然后呢,我从头呃从头给大家去写这个代码。首先啊,首先开头,呃,Model,然后文件名。啊,这是咱们的一个基本的一个框架啊,基本的一个框架,然后呢,接下来要写入咱们的信号啊,写入咱们的信号。端口有输入的时钟。输入的。
44:01
复位,还有这个输出,咱们危机的一些端口,比如说什么呢?比如说有这个。VGA的HS。嗯,还有VGA的。VS.然后还有输出的。颜色啊,总共是8根线啊。总是8根线。啊,总共是这几个端口啊,大家先把这个。这个端口啊,先写一下啊,大家写完之后呢,就。在这个聊天界面打个1啊,然后我就继续了。
47:32
这个大家在写这个代码的时候啊,注意一下这个标点符号啊,注意一下标点符号。大家写完了啊,就打个1啊。
51:35
好,那么大家写完之后啊,咱们就继续往下啊。呃,如果说有同学这个没有跟上,没有跟上,那么大家在到时候呢,可以给你们留点时间,回过头再重新的去看一下这个代码。然后接下来的话,我们去定一下我们这个每一段的一个长度啊。
52:05
Ha.啊,Ha.咱们来看一下啊,按照咱们这个手册里面的这个分辨率的一个长度,那么ha是等于。96的啊,等于96的,所以我们在代码里面直接给值啊96。那么我们需要呢,把每一段啊都给它写出来啊,每一段都给它写出来,那么A段是96 B段是48 C段是640,嗯,然后D段是16,然后总长是800。
53:01
啊,总长是800,这是我们列的一个长度,啊,列的一个长度。然后接下来是行。那么A段啊,行的,A段是2,然后呢,B呢是33,呃,C段的话是480,嗯,然后地段的话是10,总长525。啊,这是咱们的一个分辨率的一个参数啊,这个参数是官方给出来的参数啊,这个不是随便写的啊,是官方给的一个参数。
59:46
好,那么写好之后咱们继续往下。嗯,继续往下的话。
60:02
嗯,咱们接下来的话,需要去定义2个计数器啊,定义2个计数器。定义啊,一个11位的一个。H再定义一个十位的一个count v.定义两个计数器啊,定义好之后,接下来呢,咱们来写一下这个计数器的一个驱动。
61:08
啊,首先的话,我们去判断复位是否有效啊,如果复位有效,我们给一下初值。啊,等于11撇D0。然后呢,判断。Count h如果说是小于1-1的话。那么咱们的count h是要加1的。否则抗H要清0啊,这是咱们的这个计数器的一个驱动啊,大家先把这个计数器写一下。
65:11
好,那么写好之后,接下来呢,咱们写下一个计数器啊,下一个呢,就是咱们的CV。判断啊,如果复位的话,咱们的count v啊,给一个初值啊,咱们给一个0,然后呢,我们需要呢,去判断,就是我们一整行的点有没有扫描完,当我们一行的点扫描完了之后,我们才能去换行,所以呢。我们这个在这儿先要去判断我们的抗H是否等于he-1啊,如果满足的话,在此条件下,我们再去判断我们的count v是否数到最大值。
66:15
啊,如果满足条件,那么看到V。等于count+1。否则。看看微。等于0。啊,这是咱们的第二个计数器啊。大家在写的时候啊,一定要注意啊,这个地方这一行是CH,其他的地方都是count v啊,大家不要写错了啊。
69:54
大家写完之后打个1啊。
71:11
好,那么写好之后咱们继续往下。那咱们的两个计数器啊,现在的话都已经写完了,那么写完之后呢,接下来咱们写一下咱们输出的一个驱动,咱们的输出呢,是要在这个A段的时候拉低,所以呢,咱们直接写这样的一句话就是。VGA的HS。等于。括号count h<ha。如果条件满足等于0,否则等于1啊,写上这样的一句话,然后咱们的VS啊,也是一样的写法啊,Count v<V,满足条件等于0,不满足等于1。
72:04
啊,这是咱们的两个信号啊。
75:21
好,那么写好之后,呃,接下来的话,咱们来划分一下咱们的一个显示区域,那在画完之前呢,首先咱们需要去定义几个参数啊,首先的话啊,定义一个en nh和en nv啊这两个参数,然后呢,再定义一个en。Display啊,这个呢,是咱们的一个显示的一个有效信号。给大家写一下注释啊,这上面的话是分别是这个。
76:03
列了一个有效区域。列的显示区域。还有行的一个显示器。下面的话是整个的一个显示区。屏幕的显示区域。啊,这是这两个信号的一个含义啊。把这个信号啊,给它定义出来。
77:48
好,那么定义好之后。接下来咱们先写一下第一个显示区域啊,就是en n h等于。括号,嗯,Count要大于A+B,小于A+B+C啊,所以呢,它是要大于HHA+HB。
78:14
啊,这个地方可以等于啊。这地方可以等于啊,就大于等于A+B。然后与上count h.小于ha+B+HC。满足条件等于1,否则等于0。这是咱们的第一个有效区域啊。
80:59
好,那么这个写好之后,接下来是咱们的in v啊,因V呢等于count v啊大于等于va+VB。
81:15
雨上。C为小于。Va+VB+VC。满足条件等于1,否则等于0啊,这是咱们的行和列的一个有效区域啊,行和列的一个有效区域。
83:48
好,那么写好之后,呃,接下来呢,还有咱们的最后的一个显示区域。In display它呢,等于咱们的en nh和env这两个信号呢,同时有效。
84:05
啊,这两个信号呢,同时有效,同时有效的话,它就有效啊,否则它为0。否则它为零,这是咱们的这个这个最终的一个显示区域啊。
86:59
好,那么写好之后呢,最后是咱们的一个颜色数据,这个颜色数据的话,大家在给的时候可以按照自己的想法去给啊,你想显示什么颜色都可以啊。
87:16
比如说咱们给一个红色。啊,咱们给一个红色,因为咱们的颜色呢,是按照这个332的格式来的,所以呢,这个数据的前三位咱们一般的话是分配给这个红色,中间三位呢是绿色,后两位的话是蓝色,那按照咱们现在的这个数值去给值的话,那么待会儿咱们,嗯,这个会看到现象呢,就是显示屏显示的颜色呢,是红色。啊,是红色。如果大家想要显示其他颜色啊,就按照自己的意愿去给值就可以了。
88:03
那比如说呃,红色和绿色它俩混合呢,出来的是黄色,那么红色和蓝色混合出来的颜色呢,是紫色。是这样的一个。嗯,颜色啊,当然了,其他颜色的话,大家可以呃自行的去实验一下啊。好,那么写好之后在左边的话有一个。运行这个。同设计的一个选项啊,我们点一下。然后呢,点击OK。就是这个选项啊,点一下,然后呢,等它运行完,看一下大家有没有报错的啊。
91:41
嗯,我这个地方呢,已经编译已经成功了啊,已经成功了,大家看一下有没有报错的同学啊,如果有报错的话,大家把你们的报错的内容啊截个图,然后发一下。啊,如果没有报错的话,大家打个1。
92:56
啊,然后稍等一下啊,我一个一个来看一下啊。
93:03
二十四二十四的位置显示的25。24的位置显示25是。是指的是哪个地方?嗯,这个。这个同学啊,这个同学他这个地方报错了,说这个在这个always附近有一个错误啊,这个错误的话是因为你这个前半个括号是中文的括号。啊,前半个括号是中文的,你把它改成英文的就可以了啊。这是这个错误。
94:01
然后。嗯,这个的话是正确的啊,这个是已经成功了,没啥问题。然后。嗯。这个错误,你看一下你这个代码当中。代码当中这个哪个地方有标红的啊,有这个下面有红色的波浪线,你把那个红色波浪线的部分给我截个图,让我看一下啊。因为你这个你这个图的话,这个也看不出来,也看不出来是什么错啊,他只是说有错,但是这个错误信息没有啊,所以你要把那个错误信息截出来啊。
95:13
嗯,循环。哪段循环?咱们这里面没有循环呀。你就你你说你可以说一下是大概第几行的位置。没有红色波浪线啊,没有的话,你看一下这个。呃,你点开这个message message这个窗口,这个窗口在这个窗口里面,你去找一下,找一下这个有这个L的一个选项啊,你找一下那个L的报错。
96:01
啊,你看一下他报错信息说的是什么。你点开这个,然后看一下。嗯,我看一下啊。
97:09
这个你看一下这个,你把这个鼠标放到这个红色这个这个横线这个位置,你看一下它它的一个报错信息,它提示的是什么,可以看一下啊。这个地方它波浪线改完之后应该是没啥错了啊。呃,你这个的话报错,你这个明显这个地方是有中文的啊,路径是有中文的,你这个整个的工厂以及这个代码存放的位置都不行啊,都不行,你需要去重新的去换一下这个路径。不能有中文的啊,不能有中文的,你这个有有这个不认识这个火星文这些字,就是因为你的路径是有中文。啊,因为路径有中文,它不识别啊,所以它编译报错。
98:02
你这个的话,呃,你可以把这个文件夹里面的内容给它复制粘贴出去啊,找一个没有中文路径的地方去存放,然后再进行编译啊,你这个路径不行。
99:14
老师。喂,老师你好,诶你好。嗯,就是我还是那个27 27号那个出问题了,就是always我重新打了,然后那个就是符号也没错,它还是会出问题,然后他的那个问题就是对对对。嗯。那那你这样,那你把你这个这一页代码啊,给我发过来。把那个文件给我发一下。嗯。行,嗯,这个文件你能找到位置不。
100:02
就是你打开你的代码文件夹是这个样子,然后有一个SRCS的一个文件夹。你看一下能不能找到。这个SRCS。是。你的文件夹打开应该就是啊,应该就能看到。咋发呀,我是不是还得电脑上登一下,我忘记关了。
101:18
如果你找不到的话,你可以看一下你工程的这个路径啊,你的代码应该就在这个路径里面。
103:30
这个文件夹看一下找到了没有。老师我找到了,找到之后,然后发那个微信群里了,发群里了是吧?嗯。好,稍等一下,我登一下微信。
104:12
呃,这个。嗯,刘一楠这个你这个怎么去打开仿真了,咋还没有做仿真呢。咱没有还没有写仿真文件呢,所以你打开之后波形是啥都没有的。
105:36
这个代码里面这部分应该是没问题的,但是你这一部分应该写的是有问题,这一部分应该是写错了,少写的有有内容啊好,嗯,可以再看一下啊,这部分的话是。这块啊。
106:01
这块少写了。你把它这个补上啊,补上去之后你看看他有没有,呃,先补完之后保存一下,然后呢,再点这个运,运行这个内容,运行这个编译啊,如果还一直有问题的话啊,然后咱们再再说这个怎么去解决,好好的老师,嗯嗯。嗯。这个。刘一楠,你是不是点错了啊,咱们点的是这个啊,咱们点的是这个运行这个仿真,呃,运行这个编译啊,不是点的这个仿真啊。
107:13
你是自己写了仿真吗?然后去看仿真的吗?还是怎么回事?咱们点的是这个编译啊,因为咱现在仿真文件还没写啊,所以没法去看仿真。
108:24
其他同学看一下还有没有什么问题?如果没有问题的话啊,打个1。
110:19
嗯,你把这个图发到微信群吧,然后。在微信群我看一下,嗯,在这儿我打不开啊。啊,这个圈,这个圈没关系啊,这个圈无所谓的。他没有任何影响,它只是一个标志啊,没事的。
111:23
重复驱动count。嗯,这个的话应该就是你在打代码的时候应该打错了啊,你就看一下这个地方,嗯,是这些内容呢,都是count v,你我估计你应该有些地方打成count h了。啊,你可以看一下你是不是哪个地方打错了,你再对比一下。
112:37
啊,这个提示编译成功啊,就说明没有语法错误啊,是没什么问题的。
113:58
对这个界面直接点OK就行啊,这个啥都不用管。
114:42
嗯,不是没有反应啊,它是右上角,你可以看到右上角它应该有个圈在转啊,它是在后台进行这个编译呢,啊不是不是没有反应啊。你需要等待一会儿啊,等待它编辑完,它都会给你提示。
115:21
好,那如果,呃,如果没有什么疑问的话,嗯,咱们先课间休息一下啊,然后待会儿回来咱们再继续往下说。
我来说两句