00:11
咱们这个拈的话,现在的话,呃,大致呢。都给大家画完了。然后的话还剩一个模块。啊,还剩一个模块没有给大家画啊,接下来的话,咱们就把这个控制的这个模块给大家画一下。第4点啊,我们要做一个寄存器配置。
01:08
这个寄存器配置模块的话,我们是要把每个模块的,呃,寄存器的里面的数据呢,通过咱们SAB的端口呢,往外进行输出,呃,所以呢,接下来的话,咱们把这一部分呢,给大家来画一下。这个模块的话,呃,需要呢,咱们有一个呃配置文件,这个配置文件呢,刚才已经给大家发到群里了。
02:12
这个配置文件咱们刚才给大家发群里的,呃,发群里之后啊,大家可以看一下那个文件的名字啊叫什么。啊,咱们这个文件的名字呢,叫做。RA config.RA config这样的一个文件。这个文件的话,它会它总共呢是有两个端口啊,总共是有两个端口,这两个端口的话,呃,一个呢,是咱们的输入的一个地址,然后输出的话是一个数据。好,那么接下来的话,咱们呢,给它。
03:03
画一下。第一个呢,嗯,咱们可以打开咱们的代码看一下啊,咱们的输入。啊,咱们的输入是叫做rag的index。这个的数据的位宽是一个巴比特的啊,是一个巴比特的,然后它会有一个输出,这个输出呢叫做rag,这个位宽是16位啊,位宽是16位。
04:03
是这样的一个信号啊,上面这个信号的话,它是一个。输入。啊,它是一个输入,然后的话,咱们呢,需要有一个写模块。啊,咱们有一个写模块,这个呢,是SCB的一个写啊,SCB的一个写。嗯,这两个模块。它之间呢有一个信号啊,它这个信号呢,是给进来的一个斜视能。啊,一个斜视能,然后的话有一个写数据,这个写数据的话也是16位的。啊,写数据也是16位的。啊是这样的一个信号,然后的话还得有一个写的一个档信号啊,就是写的结束信号。
05:10
啊,写了一个结束信号。然后除了这两个信号之外啊,还得有什么呢?还得有咱们的一个SDB的一个串行接口。就是。OV7670的SCCB的C。还有一个双端口。是STB的D。啊,是这样的一个信号。然后呢,咱们左边还得有一个。控制。啊,左边的话还得有一个控制,这个是。Config的一个。这个叫做的驱动吧。
06:04
啊,Config的一个driver。啊,这样的一个模块啊,他们呢之间呢,共同然后协调这两个模块呢,一起去工作啊,一起去工作,然后这个模块的话还有一个。端口啊,还有一个端口,这个端口呢,叫做咱们的config的en。Conig en,然后呢,他还要去输出一个config的大。啊,输出一个con档这个信号的。方向啊是输出啊是输出。那么我们呢,在这个模块的外边还得有一个顶层啊,还得有一个顶层,就是咱们上在上面那个图里面所看到的那个。
07:09
呃,那个模块。啊,是这样的一个形式啊,这样的一个形式。这个的话是咱们的。Config.呃,一个。控制。啊,这样的一个模块。啊,这个呢,是咱们的一个信号啊,当然这个模块里面肯定还得需要咱们的时钟和复位啊,这个信号是必须要有的。
08:30
啊,时钟和复位,这是咱们的两个必要的两个端口啊。那么这个呢,整体啊设计啊,就大概呢,就是这样的一个模块。就是这样的一个配置过程啊,嗯,那么咱们要做的任务就是把这些模块的话,呃,一个一个的给它做出来啊,一个一个的做出来。这是咱们今天下午以及下周日这个的一个任务吧,啊,下周日的一个任务。
09:15
好,大家看一下对于这个模块划分啊,大家有没有什么疑问啊,可以看一下。
10:59
大家可以看一下有没有什么疑问啊,有疑问的话大家可以提一下啊。
14:46
大家看一下啊,如果没啥问题的话,大家打个1啊,咱们就继续往下。
16:09
好,那么。没啥问题的话,咱们就继续往下啊。咱们就一个模块一个模块来做啊。首先的话,咱们先从第一个模块开始啊,先从第一个模块开始,咱们先把这个模块,呃,顶层模块啊,先给大家呢做一下。咱们打开软件去创建一下工厂。啊,大家打开软件创建一下工程把这个路径啊,再看一下这个路径千万不能有中文。
17:24
没问题,之后我们继续往下,这个芯片型号,咱们仍然还选择上午同样的。同样的这一款啊。
18:22
选择好之后。啊,我们往下。然后点击完成。
19:07
那么咱们建好工程之后,首先第一步我们呢,先去创建一下我们的顶层原文件,这个原文件的话,就根据刚才咱们画的那个示意图,把这个端口呢给它写一下。好,那么接下来的话,我们写一下这个端口。
20:11
输入时钟和复位。这是我们必须要的两个端口啊,然后呢。其他的是我们的这个摄像头的这一部分,这部分端口,这部分端口的话,我们就按照我们图上所画的啊,一个一个来写,首先的话是我们的输出。输出OV7670的叉CLK啊OV7670的CLK,然后。然后往下。啊,是咱们的这个h ref啊,是一个输入信号。
21:14
然后输入还有VSYNC。然后还有输入咱们的PC。然后输出reset-N。然后输出PWDN。然后。输出。
22:03
OV7670的SCCB的C。然后输出。OV7670的SCB的D啊,那这个的话呃,端口比较特殊啊,我们把它写成in out的类型。啊,写成in out类型。这个端口的话,我们再给大家去画这个示意图的时候,给大家说过,这个端口的话是一个双端口,就是说它可以作为输入,也可以作为输出啊,是一种比较特殊的类型。呃,在这的话,我们直接给它做成双端口,然后呢,在子模块当中,我们要对它做一下特殊的处理啊特殊的处理,呃,这个处理方法的话就是。呃,把这个。嗯,把这个信号啊,用三台门做一下驱动啊,用3台门做一下驱动。
23:05
然后再往下。啊,再往下是一个输入信号,输入进来的一个摄像头数据,这个数据的话是一个巴比特的。OV7670的一个date。然后还有两个输出,一个是。Capture的wallet。还有一个是capture的data。啊,这个数据的话是一个16比特的一个数据。啊,是一个16比特数据。这是咱们的所有端口啊,大家把这个端口写一下啊。
24:12
大家写完之后啊,在这个聊天界面呢,打个1啊,然后的话咱们就继续往下。
25:03
大家在写的时候一定要注意啊,如果说你写在哪写在写到哪一行的时候,下面有这个红色波浪线,那就说明当前这一句,这一句话呢,可能是报错了,那么大家就需要去对比一下,看看是不是自己有写的错别字或者什么样的。
27:10
写完之后啊,大家这个在聊天界面打个1啊。
28:57
好,那么写好之后呢,咱们进行下一个模块。
29:03
啊,下一个模块的话,咱们仍然,嗯,是要进行这个新建文件的。新建文件啊,这是咱们的。呃,顶层模块的下面的一个子文件啊,下面一个子文件,这个顶层模块。啊,这个做好之后,咱们就按照这个子模子模块这个顺序啊,一个一个来做啊,一个一个来做,咱们呢,先从这个复位这个控制模块开始啊,先从复位控制模块开始,然后呢,按照顺序依次往下啊,然后呢,最后咱们再来写这个控制模块。嗯,然后接下来的话,咱们就写一下。这个复位的控制control。
30:04
然后这个模块呢,我仍然从从头给大家去写一下。开是咱们的固定格式,然后呢的。啊,然后咱们的端口按照咱们示意图上所画的这个内容,然后呢,给大家去写一下啊,那么这个端口呢,要有这个时钟和复位,然后的话是两个输出啊,总共是这4个端口,所以输入。始终。输入复位,然后输出。Reset down.然后输出。还有咱们的呃,OV7670的reset-N。
31:07
啊,总共试着4个信号啊,总共4试着4个端口。大家先把这4个端口写一下啊。选完之后啊,大家打一个1,然后咱们就继续往下。
33:02
咱们这个复位的这个模块,按照咱们这个所写的这个步骤里面,它是要先拉低2ms时间,然后再拉高2ms,所以呢,待会儿咱们呢,要去按照这个时间去做这个波形。那么去做这个波形的时候呢,我们要根据我们的时钟呢,去计算这个计数的次数啊,所以呢,待会儿我们要写一个计算的一个过程。好,接下来的话,我们。这个先定义一个常量。
34:04
啊,定义一个常量,这个常量呢,是咱们的系统时钟的频率。嗯,系统时钟的频率,然后呢,嗯。还有就是咱们这个输入的这个时钟的一个频率,这个是输入这个始终的话,嗯,这个不一定是50兆啊,不一定是50兆,那咱们这个始终可以按多少来做呢?呃,大家呢可以。自由的去选择,可以用50兆啊,也可以用24兆啊,这个都是可以的啊,都是可以的。假如说呃,我们这个拈块的话,呃,用我们的24兆吧,因为我们的摄像头,摄像头的驱动时钟系动时钟就是24兆的,那么我们可以呢,跟它保持一致,然后这个24兆的话,我们在用的时候可以从顶层的锁向环直接输出,如果说我们用这个50兆的话,在塞林斯呃芯片里面呢,有这样的一个要求,就是锁向环的输入时中不能作为其他模块的。
35:21
其他模块的输入啊,就不能给到其他模块,所以呢,呃,这样的话我们还需要做另外的一些操作啊,这样的话会麻烦一些,所以在这儿的话,我们就用24兆来做啊,24兆来做。那如果是24兆的话,我们呢,需要去算一下时间啊,算一下什么时间呢?就是咱们2ms的时间,2ms除以这个。时钟的周期算出来的次数就是我们所要计数的一个,呃,最高值,最大值啊,那这个周期是多长呢?我们来看一下手册里面所给出来的数据。
36:08
那我们可以看到啊,我们在这儿这个地方给大家给出来了啊,这个周期的话,这个频率的话,如果说我们按照24兆来算的话,人家给出来的频率呢,是42ns啊,是42ns,那这样的话,我们这个就按42ns来算啊,42ns来算,这样的话,算出来的这个参数这个T是42。啊,纳秒,那么我们统一一下单位啊,我们来算一下这个值。啊,算一下这个值就是。这是2ms啊,然后除以42ns等于。啊,等于这个值。
37:00
啊,等于这个值,那么我们就把这个值呢,定义成咱们的常量,啊,定义成咱们的常量,那比如说。比如说我定义一个参数T,这个参数T我给多少呢?我就按照我刚才计算出来的那个数值,然后呢,给它负值,这个值呢是等于47619啊,算出来的是这个数,那么我给值的话,就按照这个数值去给啊就可以了。那这样的话,我上面就不需要了啊,上面这个参数就不需要了,因为这个数值我已经算出来了啊,就已经算出来了。然后这个数值的位宽啊,位宽我们来算一下。47619。乘以2,因为咱们前面是两,那2ms,后面是2ms,所以总共是两倍的一个时长,那么乘以2之后得出来是95238,那么它的位宽是1234啊,十六十七位啊,总共是17位,所以呢,咱们在这儿需要去定义一个定一个17位的一个计数器count。
38:26
啊。然后啊,接下来呢,我们来写一下我们的计数器。计数器啊,首先的话,复位判断是否等于0,如果等于0,计数器count=0,给个初值,然后判断我们的计数器是否数到最大值,这个最大值呢,是2×T-1啊这样的一个值,如果说满足条件,也就是说咱们的计数器没有数到最大值的时候,咱们的计数器count是等于count+1的,那如果数到了最大值,那么count就等于0。
39:25
啊,那么看就等于0是这样的一个计数关系啊。好,大家呢,先把这个计数器啊,先写一写啊,写完之后咱们再继续往下。
40:20
大家先把这个代码先写一下啊,写完之后大家在聊天界面呢,打一个1。
42:32
好,那么写好之后咱们往下,那么往下的话,需要去生成一下咱们的呃,Reset-N这个信号,这个信号怎么去生成呢?我们可以这样去写啊,这样去写嗯,OV7670啊,然后reset-N这个信号等啊等于什么呢?等于count<T的时候。
43:01
看到小于T的时候,让它等于0,否则等于1。啊,否则等于1。嗯,然后咱们的档信号。啊,当信号等于等于什么呢?等于count是否等于2×T-1,如果。如果条件满足等于1啊,不满足等于0。啊,这样一句话就可以了。
45:11
那么这两句话写好之后呢,有一个地方呢,咱们需要去做一下修改啊,什么地方呢,就是咱们这个count的赋值啊,Count的赋值就是嗯,第一。呃,首先的话,咱们的档信号在数到最大值的时候会拉高一次,如果说咱们的抗清零的话,咱们的档信号呢就会拉低,这个呢,虽然对我们后续模块没有任何影响,但是呢,咱们这个reset-N就会有影响啊,什么影响呢?如果看到清零,那么咱们set-N这个信号呢就会拉低。啊,就会拉低。它一旦拉低咱们的摄像头的初值。咱们摄像头所有负的值就会恢复到初始态,那这样的话,咱们摄像头就等于没有配置,这样的话就不会就不能正常使用啊,所以呢,咱们这个地方呢,把这个清零给它改成保持原值。
46:08
啊,给它改成保持原值。把这一步啊,给他改一下啊。呃,这一页代码大家如果写好了啊,大家就打个1。
47:42
好,写好之后呢,大家编译一下,看有没有报错的啊。
48:34
咱们来看一下啊。嗯,这个地方呢,有一个报错啊,说在else附近,呃,有一个有问题啊,在else附近,这个问题的话,就是你的上一行第17行后边少一个分号啊,少一个分号。第17行最后边啊,给它加上一个分号就可以了。
49:42
其他同学看看还有没有什么问题。有问题的同学,把你的问题啊截个图发出来啊。
51:02
咱们一个一个来看啊。嗯,首先的话是。这个这个这个问题啊,这个问题的话,原因是第14行后边是没有逗号的啊,第14行的后边是没有逗号的。这个是,呃,孙新杰是吧,孙新杰同学,这个14行的后边是没有号的,然后你把这个写的这个control这个代码了,也打开,它里面也有错啊,你可以看一下。可以看一下他这个报错的位置。啊,在这的话,你没有截图啊,所以我也看不到。嗯,然后的话是这个问题。
52:02
嗯,说是这一行报错了,那如果说是这一行报错的话,那你看一下你的这个,嗯,ST-N这个单词是不是打错了啊。看是不是打错了,你看一下你上面这个端口啊,看一下这个上面这个端口,这个端口名跟你下面写的这个名字是不是一样的,看他俩是不是一样,我估计可能是这个地方打错了啊,哪个地方打错了。然后是。顶层设计是空的,呃,这个这个你应该是点错了啊,应该点错了,咱们点的是这个选项。点的是这个选项,这个是,呃,这个编译的一个选项,你你应该是点成下面这个了,下面这个的话是综合,因为咱的代码还没有写完,它综合不出来电路啊,所以这个不能点啊,这个不能点点上面这个。
53:16
啊,这个的话应该是少一个model啊,最后的话,最后少一个model这个单词。啊,最后的结尾也没写,应该是。啊,大家看一下这个刚才有问题的同学,改完之后有没有这个还有没有错误了,如果改完之后没有错误的话啊,打个1啊。
55:04
好,如果改完之后没有问题,那么咱们把这个模块。啊,稍等一下啊。还有一个问题。嗯。嗯。这个设计为空啊,这个的话应该也是一样的问题啊,你应该是点错了啊,咱们点的是这个编译啊,是点的这个选项,你点成应该是点成下面这个了。你点上面这个咱们。哦,点上面也是这个错是吧。那不应该呀,那你那你把这个代码发到群里,让让我来试一下。
58:42
这个编译没有问题啊。这个是不是还是你因为你点错了,或者是怎么样。
59:10
在这儿的话给大家呢,截一个图。给大家截个图。啊,是点击这个选项啊。给大家发群里了。呃,这个的话,他报的是这个license啊,没有找到啊,这个是是变异的时候license有问题,那么我想这个就是问几个问题啊,首先第1个你电脑的系统是不是WIN11的系统。啊,这是第一个问题。
60:02
然后第二个问题,你电脑的名字是不是中文的?嗯,是文是一对吧,然后你电脑的名字,用户名是不是中文的。就比如我这个,我这个地方的这个用户名是就是一个英文的,我不知道你那个地方是不是中文的,一般的话你这个。
61:00
呃。你这个错误啊,你这个错误。啊,可能是因为这个这个问题啊,可能是因为这个问题。再确认一下,看是英文的还是中文的。这个一样的错啊,看一下,看一下群里我发的那张图,你是不是点的那个选项。
62:21
这个用户名如果是英文的话,呃,如果是英文的话,那你就再看一下,呃,这个咱们昨天在群里给大家发的那个安装,安装的教程里面是有一个破解的过程的。就是有一个license需要大家去添加啊,看一下内部有没有进行操作啊,如果没有的话,需要把软件的license添加一下。啊,应该就没问题了。呃,马三应该是点了OK了啊,这个的话是有可能的啊,是有可能的,为什么这么说呢?因为啊,我们可以看一下啊,它编译完之后,它会弹出来一个窗口。
63:10
啊,它会弹出来一个窗口。嗯,他点完第一个,第一个的话是咱们的综合的一个步骤,然后呢。啊,如果说咱们要去下板的话,综合完之后是要进行这个布局布线的啊,是要进行这个布局布线的,呃,这个大家呢,可能这个如果说刚才弹出那个界面直接点OK的话,可能就是他直接选的就是这个选项啊,就直接运行了。啊,这个地方等他编译完啊给大家说一下。
64:01
啊,上午还正常呢,对吧,上午如果正常的话,那应该,呃不是软件的问题啊,应该不是软件的问题啊,那你刚才所说两方面你再看一看啊,如果有问题的话,后续你可以再单独来找我,然后我给你解决。好,然后呢,咱们看一下这个编译完之后,虽然点了这个选项,编译完之后我会弹出这个界面,这个界面它默认选中的就是第一个选项,第一个选项就是咱们这边呃,这个要点的这个选项,但是呢,这个选项咱们目前呢,是没有配置管角的代码没有写完,所以这个选项呢是不再进行的,这个界面呢,就不要再去点OK了啊,不要再点OK了,直接点上面的叉或者是cancel都可以啊,都可以不要点OK啊。好,其他同学看有没有其他问题了,有没有啥问题。
66:16
好,如果大家没啥问题的话啊,大家没啥问题的话,嗯。这个。打就打一个1啊,没啥问题的话,打一个1。好,那如果都没啥问题的话,嗯,那么。咱们今天的话就先说到这儿啊,咱然后咱们下周的话,呃,把这个文档的其他模块啊给大家呢,去做一下啊,因为这个时间不太够了,咱们其他模块的话留到下周,然后给大家说。
67:07
啊,稍后的话,我会把这个文档呢给大家发一下啊。好,没啥问题的话,大家就呃,下课了啊。
我来说两句