刚刚助教告诉我上一届有留经验,我没动力了。等我心情好再写8。
告诉大家,vgg16 15级有留代码,大家可以去git上找。
入门的时候就是特别乱,后期就好了,大家要挺住!杨老师给分还是不错的(实话)。
文中没有技术细节,建议大家看着大思路,然后配合具体的教程学习。
2016级各lab任务如下:
矩阵向量乘仿真(约3周),矩阵向量乘上板(2周),lenet(3周?),vgg16(6天(因为和编译、考期撞了,实际上应该是一个月左右)),没有团队作业。
我基本上都没写完,主要是知识太杂,前两周没怎么分时间,后面的调试又因为经验少花了很多多余的时间。但是相信大家看完我的总结后都能写完。
我掌握的情况大概有:vivado开发流程;高效调试的经验;PS端SD卡读写、中断控制、DMA的demo;AXI-lite总线slave端的两种改法。
一、vivado软件本身的学习
开发的基本流程:仿真、综合、布线、生成比特流、导出到SDK、SDK导出到开发板。
可以这么理解:想要一个程序在板子上运行,需要硬件(因为是fpga)和软件两部分。
在硬件上,如何让板子知道自己的电路被编成什么样了呢?用的就是vivado导出的比特流。比特流是根据verliog代码综合、布线得出的。其中,综合时把verliog代码转成硬件,这个大家计组已经学过了。布线,我个人理解是把综合出来的电路映射到开发板上,想一下烧板子的思路。最后根据布线的结果生成比特流,硬件看见简单粗暴的比特流就知道自己应该怎么烧了。
在软件上,用到的是SDK软件编程。这个方面我不是很熟悉。基本上是编写c代码的程序,然后SDK软件给你编译成mips,导出到板子上的arm的代码区。这个过程大家学过计组也很熟悉了,就是往内存里写汇编指令。
硬件部分称为PL部分,软件部分称为PS部分。
vivado除了verliog文件外,还有一个叫约束的东西。约束就是指定你自定义的信号对应到物理的哪个部分。比如有个信号a想控制led等亮,如何让vivado知道a控制的是led呢?就要用约束文件,将led与a信号连接起来。这部分比较偏硬件,实验中基本用不上,可以跳过去。
vivado中编写verliog的方法除了徒手编程外,还有一个拖拽连线的方法,diagram。画板就是把已经编好的模块摆到一起,然后将模块间的线连好。加入system(后面会说)的过程也是在画板上完成的。然后verliog可以自动根据连线生成verliog代码。
二、硬件开发部分
(1)diagram
在哪里:
本质:就是一个画布,可以像logisim那样手动连线和加模块(ip(类似库函数)和model(还没有封装成ip的,自己编写的verliog模块))。连完线后,vivado可以将画布转成verliog代码,后面用这个verliog代码完成后续的仿真等工作。
小技巧:连线(按ctrl取消连续连线);删线(可以单独删去某端口的线,不用整体关联的都删)
添加ip(就是已经编好的模块,后面会讲)
添加model:
(2)ip
IP:vivado中的ip就是已经编好的模块,可以直接用(天知道我第一节课听杨老师讲了一节课的ip有多迷茫。。。)。有别人编好的自带的ip,如加法器,乘法器,bram(存储器)。自己编好的verliog也可以制作成ip(相当于封装了一个硬件“函数”),下面是一些ip的使用事项
BRAM:双口bram有两个时钟的延迟。设计的时候要看一下深度和宽度,防止存不下(前期应该都没问题)。
乘法器:可以调延迟周期。会根据输入有推荐的延迟周期。
system:
自定义ip:
方法:
IP的修改:
经验:不要急着封装成ip,因为改起来麻烦,还难保证正确性。使用add model。
注意:IP和model更改后vivado会自己检测和更新接口等,不用手动删了重新加。
(3)仿真
想办法仿真,每一步都是可以仿真的。
子模块仿真:
顶层仿真(数据通路,实际实现需要ps控制的):
三、建议每个lab完成的思路
(1)弄明白网络结构,可以先看一下我对应的博客:
(2)设计(最好避开中断,太麻烦了):
(3)测试单个模块(尤其是设计PS端的协同,一定要设计demo):
(4)数据通路
(5)顶层仿真
(6)编写PS
四、调试经验