这是我第一次写学习笔记,旨在记录工作过程,方便以后查阅。同时也希望得到前人指点,或对后人有所帮助。学习笔记只会包括大致思路及基本知识,详细内容不便透露。
我这个夏天的其中一个项目是测试microsemi公司的risc v processor。Risc V 作为一款著名开源架构, 好处无需赘述。我们目前想实现的是在microsemi的MPF300 video kit FPGA上,用其自带的摄像头传输视频信号,并把信号传到搭建的risc V进行测试。本次学习笔记要做的是要把双目摄像头的MIPI CSI2格式的信号通过某种途径传输至AXI格式的处理器上。由于我之前从未接触过相关领域,所以学习笔记将从零开始,学习相关基本知识。
MIPI CSI2广泛应用于手机摄像头传送至处理器,但本笔记主要基于Libero的IP core,可能稍有不同。
Microsemi Libero有两个相关ip:receiver 和 transmitter。我的理解是Tx是编码出与csi相应的pixel data, 而Rx是将视频像素解码成我们想要的MIPI CSI2信号。因此目前我们只需要了解RX这个ip core。
该ip有两种模式:High speed mode & Low power mode. 在High speed mode下,传输形式有short packet and long packet. Short packets provide frame synchronization and line synchronization information. Long packets provide the pixel information. 我理解信息应该包含在long packet, short packet相当于起止作用。
Frame start (short packet)Line start (optional)Few image data packets (long packets)Line end (optional)Frame end (short packet) 该ip必须与PolarFire® MIPI IOD generic interface blocks 和PLL结合使用,如图所示: 其中,IOD的输出RX_CLK_R由PLL连接至RX的输入。PLL的parallel clock由以下公式计算:其源代码生成后可在以下路径找到: .\component\Microsemi\SolutionCore\mipicsi2rxdecoderPF\2.2.3\Obfuscated 主要由以下两部分组成:
Embsync_detect 这部分给我感觉就是个整理的过程,它从IOD接收信号后把数据整理归置,供以后使用。mipi_csi2_rxdecoder 这部分就会由之前提到的long & short packet得到输出:frame_start_o, frame_end_o, frame_valid_o, line_start_o, line_end_o, word_count_o, line_valid_o, and data_out_,其工作原理可由FSM表示出来:有限状态机在数字电路和microprocessor的课上都学过,所以很好理解,基本上就是一行一行传输图像,直至整个frame传输完毕。
*更多有关参数设定的内容请参考datasheet。
UG0763 User Guide MIPI CSI-2 Receiver Decoder link