1 流水线乘法器
实现4bit无符号数流水线乘法器设计。
4bit乘法器,最终结果不超过八位。
(
input clk,
input rst_n,
input [size -1:0] mul_a,
input [size -1:0] mul_b,
out reg [size*2-1:0]mul_out);
//寄存器暂存
reg [7:0] addr01,addr2;
//暂存每位的乘法结果
reg [7:0] temp0,temp1,temp2,temp3;
assign temp0 = mul_b[0] ? {4'b0,mul_a} : 'd0;
assign temp1 = mul_b[1] ? {3'b0,mul_a,1'b0} : 'd0;
assign temp2 = mul_b[2] ? {2'b0,mul_a,2'b0} : 'd0;
assign temp3 = mul_b[3] ? {1'b0,mul_a,3'b0} : 'd0;
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
addr01 <= 'd0;
addr23 <= 'd0;
end
else begin
addr01 <= temp0 + temp1;
addr23 <= temp2 + temp3;
mul_out <= addr01 + addr23;
end
endmodule
2 APB
1 低成本
2 低功耗
3 低带宽
4 无流水线
5 所有信号在时钟上升沿有效
6 进行一次数据传输至少需要两个时钟周期
读写共用地址总线。
读写 数据通道分开。
3 序列检测
module det_moore(
input clk ,
input rst_n ,
input din ,
output reg Y
);
// 定义状态变量 5个状态,第四个状态可以等价于第一个状态
// 采用独热码,每个状态只有一位表示
parameter S0 = 5'b00001,
S1 = 5'b00010,
S2 = 5'b00100,
S3 = 5'b01000,
S4 = 5'b10000;
//定义状态寄存器 state next_state
reg [4:0]state,next_state;
//三段式状态机
//当前状态寄存器描述
always@(posedge clk or negedge rst_n)
if(!rst_n)
state <= S0;
else
state <= next_state;
//下一状态的状态寄存器描述
always@(*)
case(state)
S0: next_state <= din?S1:S0;
S1: next_state <= din?S2:S0;
S2: next_state <= ~din?S3:S2;
S3: next_state <= din?S4:S0;
//为1,下一状态跳转到S1,否则跳转到S0
S4: next_state <= din?S1:S0;
default:next_state <= S0;
endcase
//状态输出
always@(posedge clk or negedge rst_n)
if(!rst_n)
Y <= 1'b0;
else if(state == S4)
Y <= 1'b1;
else
Y <= 1'b0;
endmodule
4 通信协议
UART全双工,异步通信。 异步通信是指发送方发送数据后,不等待接受方发回响应,就可以发送下一个数据包。
RS232开始位,八个数据位,一个停止位,没有奇偶检验位。
SPI 全双工,同步传输发送数据的同时也可以接受数据。四线制,MOSI主输出从输入,MISO主输入从输出,SCLK时钟信号,CS片选信号。
IIC 半双工同步通信,某一时刻只允许数据在一个方向上传输,两线制,scl时钟线,sda数据线。
SCCB类似IIC,SCCB读操作中写之后需要stop信号。
5 权重读取
训练 量化 量化后再验证精度,然后导出模型,导出计算的中间数据。
权重是通过$readmemh将txt文件中的数据,加载verilog中的多维数组中。
6 Vitis环境下的软硬件协同
Vitis™ HLS是一款高级综合工具,允许 C、C++ 和OpenCL™函数硬连线(hardwired)到器件逻辑结构和 RAM/DSP 块上。
Xilinx Vitis HLS工具将C/C++方法综合(synthesize)成RTL代码,以加速可编程逻辑。
-
软件部分(host program):使用 C/C++ 开发,可在 x86 或嵌入式处理器上运行,并调用 OpenCL™ API 来与加速器交互
-
硬件部分(kernel):可以使用 C/C++、OpenCL C 或 RTL 进行开发。
7 ALU
ALU: 算术逻辑单元
包括五个模块,普通ALU模块,地址生成单元模块,分支预测解析模块,CSR读写控制模块,多周期乘/除模块。
普通ALU模块,组合逻辑组成。
地址生成单元模块
分支预测解析模块
多周期乘/除模块
8 状态机
状态机代码写法有一段式、二段式、三段式(一段式指的是在一段状态机中使用时序逻辑既描述状态的转移,也描述数据的输出;二段式指在第一段状态机中使用时序逻辑描述状态转移,在第二段状态机中使用组合逻辑描述数据的输出;三段式指在第一段状态机中采用时序逻辑描述状态转移,在第二段在状态机中采用组合逻辑判断状态转移条件描述状态转移规律,在第三段状态机中描述状态输出,可以用组合电路输出,也可以时序电路输出)。
优劣:(1)一段式状态机不利于维护(简单状态机可以用);
(2)两段式状态机是常见写法,时序逻辑进行状态切换,时序逻辑实现各个输入、输出以及状态判断,利于维护,不过组合逻辑容易出现毛刺等常见问题;
(3)三段式状态机推荐写法,代码易维护,时序逻辑输出解决了两段式写法种组合逻辑的毛刺问题,但是耗费资源多一些且第三段 always 如果判断条件是 cs 从输入到输出比一段式和两段式会延时一个时钟周期。
三段式:
有三个always block,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。
Moore状态机:时序逻辑的输出只与当前状态有关。
Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;
9 异步fifo使用格雷码的原因
由于异步fifo的读指针和写指针分别属于不同的时钟域,这样指针在进行同步的过程中容易出错,采用格雷码,相邻每位只有一位发生变化,这样在进行指针同步时候,就会产生同步正确。 即使同步出错,出错的结果也是写指针的跳变不变。对于读空判断,最多导致fifo在不是真空的时候产生,而不会出现读空。 格雷码保证即使读写指针同步后出错,也不影响fifo功能的正确性。
10 跨时钟域的常用方法
1.单bit:两级触发器同步(高频采低频) 慢时钟域到快时钟域
2.多bit:采用异步FIFO,异步双口RAM
3 .脉冲扩宽,加握手信号(低频采高频)
4.格雷码转换
单bit同步时钟域:从慢时钟域到快时钟域,两级触发器(延迟打拍)
单bit同步时钟域:从快时钟域到慢时钟域,引入异步握手机制,保证每个脉冲都同步成功,同步成功后再进行下一个脉冲。 扩宽脉冲宽度
多bit: 握手机制 异步fifo 双口ram
11 wire类型的变量用来连接结构化模块。缺省值是z(高阻状态)
12 产生锁存器的条件
所以在时序逻辑中,不完整的 if…else… 结构并不会生成锁存器,而组合逻辑中不完整的 if…else… 结构就会生成锁存器。
只有在组合逻辑中的case结构才有可能产生锁存器,而在时序逻辑电路中,即使case结构中的分支不完整,也不会产生锁存器,
13 7020
图像采集模块的寄存器配置以及图像帧存储基于PS实现。
去雾和显示模块基于PL。 通过AXI总线实现数据交互。
XIlinx ZYNQ7020 PS端和PL端通过AXI总线进行数据交互。
DDR3 RAM外设。 PS端挂载容量为1GB,数据位宽为32位。
以太网接口
USB串口
HDMI输入输出接口
异步处理
资源:
逻辑单元CLB: 85K
查找表LUTs: 53200
触发器FF: 106400
Block RAM: 140
DSP:220
PL端资源占用率: DSP 220 占用了137,占用率63.2% 。
PLL DLL
14 激光雷达
neuvition M系列 700线。百米精度
Jetson Xavier NX
无人打靶距离受限
主要是因为目标检测模型失效,图像特征不够。
部署:yolov5s
-
pt文件 -->wts文件–>tensorrt 等部署平台 --> jetson部署--在linux环境下
-
下载官方的jetpack_v4.4.1
生成wts文件 -- build 生成部署引擎 --缩小宽度和深度来达到剪裁模型,加快运行速度的作用 --通过tensorrt生成了基于C++的engine部署引擎文件 -- 使用python调用
15 森林火灾
NVIDIA Jetson TX2
RealSense D435i RGBD深度摄像头
Beitian BN-880GPS模块
ATK1218-BD北斗导航卫星
DS18B20温度传感器
SIM800C GSM
串口2 和串口3 GSM和GPS, GSM需要独立供电
DS18B20 温度传感器 单总线