串行接口是数据线一根线,通过串行协议传输数据,比如uart
并行接口是一个数据在多根数据线并行传输,比如rgb888、rgb565等等
核心:多个设备共用数据线
4种,CPHA CPOL
分别是 scl默认电平低电平、高电平两种
sda在时钟的第一个时钟沿、第二个时钟沿数据生效两种
I2c通过呼叫应答方式,i2c每帧数据都会先发设备地址指明数据发给谁的,读谁的;
Spi通过片选信号,spi通信前先拉低对应从机的片选,然后和收发数据
同步就是有时钟信号,实现每位数据的有效位置如spi异步,没有时钟信号标定数据的位置
单工,只能发或者收数据
半双工,可以发也可以收,但是收发不能同时进行
全双工,可以发也可以收,收发可以同时进行
Start addr ack data ack data nack stop
Start addr ack data ack data nack stop
按字节,8bit
低位先发
一个计数器产生波特率时间,一个计数器产生发送第几bit,使用移位或者case发送对应位
高电平可以被低电平拉低,发送的时候拉低对方设备能检测的到低电平,不能用高电平起始,高电平不能拉高低电平
总线默认一般是开漏,需要上拉电阻设置默认高电平
发送接收是同一数据,应用层协议做好收发应答
发送数据发不出去,接收方一个字节为0x00
会接收到一个字节0x00,收不到对方发送数据
Txd断开,发送数据对方不能收到,对方发数据可以收到
Rxd断开,发送数据,对方能收到,对方发数据不能收到
需要,电气上的电平是对gnd做参考0电压
奇校验:让所有这个字节的数据中出现奇数个1,比如,1000110(0)则必须添0,
这样原来有3个1已经是奇数了,所以添上0之后1的个数保持为奇数
偶校验:让所有这个字节的数据中出现奇数个1,比如,1000110(1)则必须添1,
这样原来有3个1已经是奇数了。所以添上1之后1的个数保持为偶数。
两个设备只有一个启动的话,读写数据都是错误没有用的,
两个设备都启动的话,无法建立通信
从机无法收到数据,主机无法读出数据
排查:示波器、逻辑分析仪、quartus自带的signaltap任意一种都行
从机无法收到数据,主机无法读出数据
排查:万用表、示波器、逻辑分析仪、quartus自带的signaltap任意一种都行
收发数据相同
排查:万用表打短路
主机发送设备地址的情况下,看设备是否应答,无应答说明设备不存在或者通信线路异常或者器件损坏
设置超时时间,在时间内没有应答通信失败
128
Read到数据都是0x00
排查:万用表打短路
高速模式3.4M,不能都用,i2c通信时钟频率是从机决定的,如果一个总线上有不同时钟频率的从设备,需要切换时钟频率通信
暂存数据
摄像头采集图像的时候,缓存用sdram
因为fpga内部的ram区域不足以存储图片的大小,所以需要一个存储区域作为缓存
黄金参考工程是厂商出厂自己做的一个参考工程
1).根据avalon总线时许,编写avalon接口读写pwm寄存器
2).添加到quartus在quartus II platform designer上面添加新的compnement修改输出接口
通过c语言编写逻辑模块和测试模块,验证功能,观察波形图,查看html报告,通过hls编译器编译生成ip,添加到quartus上面,
mm slave、 mm master、 流接口
1. 映射avalon总线的地址
2. 计算ip的地址
3. 映射接口地址
4. 操作
Avalon mm slave接口
Hps自己的外设是固核,不用也不可以拿来做其他的逻辑
Avalon外设是软核,不用的话逻辑资源可以拿来做其他的
软核:综合之前的寄存器传输级(RTL) 模型,灵活性高、可移植性强,但预测性低有不确定风险
硬核:经过验证的设计版图,设计人员不能对其修改与软核实现方式相比,硬核可以把功耗降低5~10 倍, 节约将近90% 的逻辑资源
固核:带有平面规划信息的网表,通常以RTL 代码和对应具体工艺网表的混合形式提供。
固核的设计灵活性稍差,但在可靠性上有较大提高
使用虚拟内存映射,主要是mmap函数将总线地址拿到,通过avalon桥偏移地址找到avalon桥地址,通过hps0.h文件里面的外设偏移地址计算外设地址,通过接口定义的顺序和接口类型直接把接口地址计算出来,通过指针直接访问接口
可以不用
优化面积、优化执行时间
read、write、try_read、try_write
start、done、busy、stall
使用ac数据类型减小位宽,从而优化面积,减小位宽相应做计算也会增快
面积换时间:使用hls循环展开,复制循环内部的电路
时间换面积:将大部分相同电路的做成一个,使用循环,然后每次传入不同的参数
灰度化:将图片像素点提前出来,拆分成红绿蓝三个分量,用Gray = R*0.299 + G*0.587 + B*0.114公式分别代入,R红色分量G绿色分量B蓝色分量,Gray对应输出灰度值,然后将Gray分别填充三个分量合成像素点,合成图片;
二值化:将图片像素点提前出来,拆分成红绿蓝三个分量,用y= gray > b? 255:0公式分别代入,b设定阈值,gray灰度值,y是输出,然后将y分别填充三个分量合成像素点,合成图片
将图片像素点提前出来,拆分成红绿蓝三个分量,用y=ax+b公式分别代入,a对应对比度,b对应亮度,x对应分量,y对应输出,然后合成像素点,合成图片
1. 通过python神经网络工程提取权重和偏置,修改为h文件
2. 用python工程里的读取图片程序,将图片转换成h文件,数组形式
3. 通过全连接神经网络算法编写c程序,封装成mm slave接口
4. 添加权重、偏置、图片的h文件编写mian测试
5. HLS编译器编译windows平台运行程序验证结果
6. HLS编译器编译生成quartus可识别的ip
1. 时间上的优化加速
2. C语言里面存在循环可以展开减少执行时间
3. 里面的变量使用ac数据类型,减少数据位宽优化面积和执行时间
4. 复杂的计算换成简单的计算,比如除以2换成右移1位
5. 函数参数接口使用avalon接口减少位宽,优化面积
6. 接口使用稳定参数优化寄存器级数减少时间
html报告里面的循环报告
复制电路的个数
简单来讲就是将接口优化成wire线型变量,减少寄存器传入级数,从而优化时间
存储的时候记录存储写操作次数,每5000次写之后,将存储位置切换到另一个位置
flash是按扇区读写,一次必须读写一个扇区,速度较快,一般用于大数据量存储;
e2prom是按字节读取,一次可以只读一个字节,速度较慢,一般用于小数据量存储
Ram是随机存储器,是一个通称,掉电数据丢失
Sram静态随机存储器,加电情况下数据不丢失,掉电数据丢失,不需要刷新
Dram动态随机存储器,需要不停的刷新数据,因为是电容存储要不停的充电,掉电数据丢失
Sdram同步的dram,需要不停的刷新数据,掉电数据丢失,需要同步的时钟读写,读写速度较快
Ssram,同步的sram,不需要刷新,掉电数据丢失,需要同步时钟,速度较sdram快
Ddr ddr sdram,双倍速度sdram,就是sdram的升级版,在时钟的上升沿和下降沿都读取数据
先进先出,队列的形式
ram读写速度快,rom读写速度慢,
ram掉电数据丢失,rom掉电数据不丢失
先排查模块,再排查模块内部寄存器,逐级排查
逻辑分析仪测量硬件波形,对应返回排查是哪个模块,再排查模块内部寄存器,如果程序比较混乱直接重写
时序逻辑电路按照输入输出关系有两种状态机,摩尔状态机、米莉状态机;
摩尔状态机就是输出与输入无直接联系,米利状态机是输出与输入有直接联系
机械按键在按键按下和弹起的瞬间,本身因为弹性作用会产生机械抖动,机械抖动会造成电路上通断不稳定出现多次通断,进而导致输入电平变成带毛刺的信号
如果不消抖,会因按键异常而产生多次按键按下的结果
当按键功能只有一个单一功能的时候,比如一个按键就是开,输入几次都是开,那就可以不需要消抖
消抖方法可以分为状态机、延迟计数法、
功能定义-->设计输入-->功能仿真-->综合优化-->综合后仿真-->布局布线-时序仿真-->板级仿真与验证-->调试
仿真模块的逻辑在设定输入下输出是否正确
仿真模块的时序在设定输入下输出是否正确
仿真模块的逻辑在非设定输入下输出是否异常
不可以,hdl 语言最后会生成电路,多个 always 同时赋值会造成硬件冲突,甚至编译器会报错
1.仿真工具上面可以设置
2.testbench 里面可以直接写 `timescale 1ns/1ps 基准时间 1ns,精度 1ps
Num = $random;
$display("at time %d duty is %d\n",$time,duty);
Verilog 是复制电路,循环是并行执行
C 语言是重复执行一段代码,循环是串行执行
万用表主要用来测试电压、电流、通断、电阻、电容等,缺点只能看有效值,不能看实时值示波器主要测量模拟信号实时值,如频率、周期、幅值等,缺点是通道较少没有协议解析
逻辑分析仪主要抓取多路通道的波形,解析编码协议,缺点是只能看数字信号,不能看模拟信号
有效值,1.65v
实时值,测量出来是一个幅值为 dac 基准电压的正弦信号
低端逻辑分析仪是以 ttl 电平,默认 0.7v 以下低电平,1.5v 以上高电平,中间保持
高端的逻辑分析仪有电平设置功能,自己设置高低电平的电压阈值
输入正弦信号软件中为方波
答:输入电源电压,所有芯片电压电压,
万用表或者示波器
Sof
Fpga 内部 ram,外部 epcs,还有 soc 的话可以从 sd 卡配置
1.管脚较少的情况下可以使用 Quartus 上面的 pin planner 手动修改
2.管脚较多的情况下可以编写 tcl 脚本,使用 tcl scripts 运行脚本
1 用低电平加高电平上升沿表示 ;0 用高电平加低电平下降沿表示
双方约定好波特率异步收发
1 用电平跳变表示 0 用电平保存表示
双方约定号波特率异步收发或者同步时钟收发
通信上面,大部分都是串行,编码的目的是实现一个字节在串行上面的数据传输,不同的编码
有不同的侧重点,比如无线编码的一般都侧重考虑干扰的情况,普通的有线串口只考虑收发速度