移位寄存器(如何在C代码中插入移位寄存器)

移位寄存器
上期内容:AI Engine到底是什么?
众所周知,标准C或C++代码是没有HDL代码的并行性和时序性的,那么如何在C代码中插入寄存器呢?Vivado HLS提供了IP库,这些IP库使得HLS可直接从相应的C代码推断出对应的Vivado中的IP。其中,这个IP库里就包含了移位寄存器。移位寄存器本质上就是多个D触发器级联构成的触发器链,具体在RTL综合时如何映射到Xilinx FPGA上,可查看这篇文章(Vivado综合属性:SRL_STYLE)。 在C代码中插入寄存器时,需要添加头文件ap_shift_reg.h,如下图所示。这个案例中移位寄存器的深度为4(由DEPTH确定),这可以理解为4个寄存器级联。输出q取0号寄存器(由ADDR确定)输出。
定义移位寄存器时,需要声明其为static,这使得移位寄存器初始值为0。ap_shift_reg的第一个参数为数据类型,第二个参数为移位寄存器的深度,如下图第5行代码所示。在第8行代码中,使用了移位寄存器类型的方法shift,该方法同时实现移位寄存器的写入、移位和读出功能。在这里,将d[i]写入移位寄存器、移位、将0号寄存器的值输出给q[i]是同时执行的。
为进一步理解,我们看下面这张图。由上至下三部分分别对应数组d、深度为4的移位寄存器和不同ADDR值时数组q获得的数据。可以得出结论,数组q中一定包含ADDR+1个0。
结合C/RTL协同仿真,如果ADDR为1,仿真波形如下图所示。注意看图中的q_V_we0信号,其高脉冲表明了数据有效。可见仿真结果与上图的结果是一致的。
最后,我们看看生成的Verilog代码的关键部分,如下图所示。第29到第33行是对移位寄存器进行初始化,初始值为0;第35到第43行,移位寄存器执行写入和移位功能;第45行,执行读出功能。这是很规范的移位寄存器的描述方式。
ACAP不可不知的几个基本概念
HLS IP Library?HLS Math Library:csim ?C/RTL co-sim(2)HLS Math Library:csim ?C/RTL co-sim(1)如何复用关键寄存器的位置信息
部分可重配置都生成哪些.bit文件
VIO你用对了吗Device视图下能看到什么
Schematic视图下能看到什么学习笔记:神经网络模型
学习笔记:ReLU的各种变形函数
学习笔记:神经元模型(2)
学习笔记:神经元模型(1)
学习笔记:深度学习之“深”
学习笔记:深度学习之“学习”学习笔记:人工智能、机器学习和深度学习
都是pin,有什么区别
都是net,有什么区别
如何快速查找目标cell
2019文章汇总
文 | Lauren 图 | Lauren
Copyright @ Lauren的FPGA
转载事宜请私信 | 获得授权后方可转载

移位寄存器相关文章

版权声明