xilinx vivado zynq vdma仿真及应用详解(一)

来源:互联网 发布:js隐藏table 编辑:程序博客网 时间:2024/06/06 01:19

很多人用zynq平台做视频图像开发,但是对vdma了解比较少,上手起来稍微有些困难,我针对这一现象,做了一个基于vivado和modelsim的仿真和应用测试工程,并写篇文章做些介绍,希望能对大家有帮助。 
一:xilinx vdma IP例化以及接口介绍 
这里写图片描述
上面图片就是在vivado2015.4中例化vdma的界面,首先对参数做些介绍: 
Frame Buffers :选择vdma缓存几帧图像,这里默认是写通道和读通道都设置相同的缓存帧数,具体设置多少帧合适一般根据应用来定,比如读写带宽相同,想用ddr作为一个乒乓buffer,那就可以设置成2帧,写第一个地址,读第二个地址,写第二个地址,读第一个地址。这里面设置几帧,就要在vdma寄存器配置的时候设置几个帧起始地址。 
Memory Map Data Width:代表数据到达AXI4总线上的位宽,比如这里设置成64,那就代表M_AXI_XX总线上的数据位宽是64bit,这时候如果stream上的数据是32bit,那vdma内部会有一个带宽转换模块,把数据拼成64bit。 
Burst Size : AXI总线上突发传输的长度,一般设置为16 
Stream Data Width:vdma与pl逻辑部分通过axi stream协议交互数据,这里代表stream数据位宽 
Line Buffer Depth:vdma内部会有一个行缓存fifo,stream数据会先写入fifo,然后AXI总线逻辑会读出到总线上,这个深度就代表fifo的深度。设置原则(个人理解):如果AXI总线数据带宽是stream总线数据带宽的1.5倍以上,这个fifo深度可以设置的小一点,如果AXI总线带宽小于1.5倍的stream总线带宽,那fifo的深度至少要是图像一个有效行的一半。 
Advanced : 这里面只说一下Fsync Options,这个信号是什么意思呢,就是告诉vdma什么时候开始运行,一般s2mm通道选择tuser,就是说在tuser 拉高的时候开始传输。mm2s通道,可以选择none,也可以选择 mm2s_fsync,这里介绍一下这两个的区别。 
none : 就是没有同步信号,但这并不是说没有开始信号,而是只要mm2s_stream通道tready拉高,就开始传输,相当于free模式 
mm2s_fsync:当这个信号发生一个下降沿的时候开始传输,如果没有这个下降沿,即使mm2s_stream通道tready拉高也不会传输 
下面是接口介绍: 
M_AXI_XX : axi4总线接口,用来与ddr交互数据 
M_AXIS_XX , S_AXIS_XX : axi stream接口,用来与pl交互数据 
S_AXI_LITE :控制总线,接到ps的gp口或者写一个axilite master总线去配置 
其他接口不做介绍 
二:下面开始一步步的详解如何搭建一个vdma的仿真工程 
FPGA的开发,离不开仿真,很少有人能直接写好代码上板就成功的,仿真必不可少。但是有些应用要用到vdma,vdma又要和ddr做数据交互,这样做起来就很麻烦了,我这里就实现了一个简单的方法,可以测试vdma,又不用去例化MIG搞什么ddr。下面开始! 
系统框图: 
这里写图片描述
(1)因为是要仿真vdma,vdma顾名思义就是video dma,那肯定要先做一个视频模块,注意,我这里除了vdma和fifo用xilinx的ip。其他的都不用ip,这样更通用性。 
我这里就把这个视频发生模块叫做sensor,可以理解为xilin的tpg模块,sensor模块的接口如下:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">sensor</span> </span>(     input rst,     input clk,     output reg vsync,     output reg hsync,    output reg de,    output reg vblank,    output reg[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]pix_out);parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_ACT_W</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>;parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_ACT_H</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_WIDTH</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>;parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_HEIGHT</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>;parameter <span class="hljs-constant" style="box-sizing: border-box;">H_START</span>       = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>; parameter <span class="hljs-constant" style="box-sizing: border-box;">V_START</span>       = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">60</span>; </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

我这里构建了一个图像传感器,总像素数是600*800,有效像素是 480*640,水平有效像素开始位置是80,垂直有效像素开始位置是60,这个模块会读取一个本地图像数据,rgb格式,这里为了测试方便,直接把像素输出位宽设置为32bit。 
(2)video转axis模块,相当于 xilinx的vid in to stream模块,接口如下:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">video2axis</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#</span></span>(    parameter <span class="hljs-constant" style="box-sizing: border-box;">DW</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">WIDTH</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">HEIGHT</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>)(    input axis_clk,    input axis_aresetn,    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> axis    input              reg_axis_s2mm_start,    output [<span class="hljs-constant" style="box-sizing: border-box;">DW</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] m_axis_tdata,    output  [<span class="hljs-constant" style="box-sizing: border-box;">DW</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] m_axis_tkeep,    output reg         m_axis_tvalid,    output             m_axis_tlast,    output             m_axis_tuser,    input              m_axis_tready,    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> video data    input              video_clk,    input              video_rst,    input              video_hsync,    input              video_vsync,    input              video_hblank,    input              video_vblank,    input              video_de,    input  [<span class="hljs-constant" style="box-sizing: border-box;">DW</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    video_data);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>

这个模块主要用到一个fifo来做数据缓存,只要注意一下stream协议的握手操作即可,由于stream协议比较简单,这里就不多说了。至此,video数据就转换到了stream数据。 
(3)axis转video模块,接口如下:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">axis2video</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#</span></span>(    parameter <span class="hljs-constant" style="box-sizing: border-box;">DW</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">WIDTH</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">HEIGHT</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>)(    input axis_clk,    input axis_aresetn,    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> axis    input             reg_axis_mm2s_start,    input [<span class="hljs-constant" style="box-sizing: border-box;">DW</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    s_axis_tdata,    input             s_axis_tvalid,    input             s_axis_tlast,    input             s_axis_tuser,    output reg        s_axis_tready,    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> video data    input              video_clk,    input              video_rst,    input              video_hsync_i,    input              video_vsync_i,    input              video_hblank_i,    input              video_vblank_i,    input              video_de_i,    output             video_hsync_o,    output             video_vsync_o,    output             video_hblank_o,    output             video_vblank_o,    output             video_de_o,      output  reg[<span class="hljs-constant" style="box-sizing: border-box;">DW</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]   video_data);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>

这个模块相当于xilinx的vid out模块,我这里是简化版的,xilinx的ip写的太复杂了,而且不容易用起来,其实也就是用一个fifo做数据缓存,然后根据外部video时序从fifo读出到输出。 

(4)video timing gen模块,接口如下:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">video_timing_gen</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#</span></span>(    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_ACT_W</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_ACT_H</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_WIDTH</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_HEIGHT</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_HSYNC_START</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_HSYNC_STOP</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">40</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_VSYNC_START</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,    parameter <span class="hljs-constant" style="box-sizing: border-box;">SENSOR_VSYNC_STOP</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)(     input rst_n,     input video_clk,     input  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]reg_h_start,    input  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]reg_v_start,    output reg vsync,     output reg hsync,    output reg de,    output reg vblank,    output reg hblank);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>

此模块产生视频时序,提供给 axis2video模块,相当于xilinx的vtc模块。 
(5) axi slave模块,接口如下:

<code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">`define C_S_AXI_ADDR_WIDTH 32module axi_slave #(  parameter integer C_S_AXI_ID_WIDTH = 6,  parameter integer C_S_AXI_DATA_WIDTH = 32) (  input  wire S_AXI_ACLK,  input  wire S_AXI_ARESETN,  input  wire [C_S_AXI_ID_WIDTH-1:0] S_AXI_AWID,  input  wire [`</span>C_S_AXI_ADDR_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_AWADDR,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_AWLEN,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_AWSIZE,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_AWBURST,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_AWVALID,  output <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_AWREADY,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [C_S_AXI_DATA_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_WDATA,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [C_S_AXI_DATA_WIDTH/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_WSTRB,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_WLAST,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_WVALID,  output <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_WREADY,  output <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [C_S_AXI_ID_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_BID,  output <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_BRESP,  output <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_BVALID,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> S_AXI_BREADY,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [C_S_AXI_ID_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] S_AXI_ARID,  input  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">wire</span> [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">`C_S_AXI_ADDR_WIDTH-1:0] S_AXI_ARADDR,  input  wire [7:0] S_AXI_ARLEN,  input  wire [2:0] S_AXI_ARSIZE,  input  wire [1:0] S_AXI_ARBURST,  input  wire S_AXI_ARVALID,  output wire S_AXI_ARREADY,  output wire [C_S_AXI_ID_WIDTH-1:0] S_AXI_RID,  output wire [C_S_AXI_DATA_WIDTH-1:0] S_AXI_RDATA,  output wire [1:0] S_AXI_RRESP,  output wire S_AXI_RLAST,  output wire S_AXI_RVALID,  input  wire S_AXI_RREADY);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul>

这块模块是根据xilinx官方提供的参考设计基础上修改而来的(xapp1168),协议部分完全没有改动,这里拿他当做ddr,具体修改是这样的, 
reg [31:0] mem [32’h01000000:0]; 
用寄存器组来模拟ddr 
此模块会根据axi master的时序来计算出要读写的地址 
assign write_mem_address = axi_awv_awr_flag ? axi_awaddr: 0; 
assign read_mem_address = axi_arv_arr_flag ? axi_araddr: 0; 
写操作:mem[write_mem_address>>2] <= #1 S_AXI_WDATA; 
读操作:mem_data_out <= mem[read_mem_address>>2]; 
做此修改以后,这个模块就可以当做ddr来用,为仿真提供了很大的方便 
(6)vdma模块,这个就用xilinx的vdma ip,注意,我这里不是在block design里面例化,所以端口需要自己在hdl里面做连接的。 
这里还有一个模块是 axi lite master模块,作用是用来配置vdma的寄存器,这个模块也是xilinx提供的,只需要做小量修改即可

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">always @(write_index)  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> (write_index)       // AXI VDMA <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> Set Up       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43000030</span>;        <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c000ac</span>;         <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c000b0</span>;         <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c000a8</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c000a4</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c000a0</span>;   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43000000</span>;        <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c0005c</span>;         <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>:  awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c00060</span>;        <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>: awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c00058</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>: awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c00054</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>: awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h43c00050</span>;       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>: awaddr <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000000</span>;     endcase   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(write_index)  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> (write_index)       // AXI VDMA <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> Set Up       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000003</span>;          <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00800000</span>;           <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000000</span>;        <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000003</span>;          <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000000</span>;           <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00800000</span>;          <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>: wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>:  wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>: wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>: wdata <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span><span class="hljs-attribute" style="box-sizing: border-box;">'h00000000</span>;     endcase  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li></ul>

我这里是把ddr作为一个乒乓buffer,所以vdma缓存帧数选择2帧,寄存器配置里面就配置两个传输地址。这样就完成了对vdma的寄存器配置。 
编写test bench top文件,把这些模块连接起来,至此,仿真工程就全部写好了。 
三:仿真 
(1)vdma工作流程介绍 
第一步,对vdma寄存器进行配置,并打开使能,这时候vdma处于待命状态,什么时候开始传输呢,下面详细介绍 
对于S2MM通道:之前在讲vdma配置的时候有一个Advanced选项,里面有Fsync Options选项,可选none,s2mm_fsync,s2mm_tuer,三种同步模式。 
none就是只要vdma就绪,就立马准备接收数据,不需要同步信号。 
s2mm_fsync,当选择此模式时,vdma 模块会有一个s2mm_fsync引脚,一般情况下是把视频帧同步信号连到这上面,当检测到s2mm_fsync引脚有一个下降沿的时候,vdma正式进入传输状态。 
s2mm_tuer,这个信号和s2mm_fsync这个信号类似,但他是在stream协议里面的,vdma检测到s2mm_tuer拉高以后(tuser只在一帧数据的第一个像素位置拉高),正式进入传输状态 
对于MM2S通道,同样在vdma配置的Advanced选项里面有 none,mm2s_fsync两种选择模式。 
none不需要同步信号,只要axis_mm2s通道的tready拉高,就开始从ddr读取数据进行传输,选择这种模式一般主要是把ddr里面的数据读到pl里面进行处理,而不是转成视频 
mm2s_fsync,选择此同步模式,一般是把ddr的数据转成视频数据,注意,这里重点讲这个同步模式,当vdma的读通道选择此同步模式的时候,vdma模块会有一个mm2s_fsync信号,这个信号在读操作中非常重要。当vdma寄存器配置完成并开启传输,mm2s通道进入等待过程,一直等到mm2s引脚信号出现一个下降沿,这时候vdma启动读操作,会从ddr预读一些数据到内部linebuffer,等到axis_mm2s通道的tready信号拉高,数据就开始传输,进入axis2video模块的fifo,当axis2video内部fifo满了以后,会拉低tready,这时候就会反馈到vdma,暂停读操作,一直等到axis2video模块的视频时序输入数据有效信号,这时候视频开始输出,axis2video内部fifo数据减少,axis_mm2s通道开始恢复传输,继续从vdma读出数据,vdma再通过axi总线从ddr读取数据,如此反复,完成ddr数据到video数据的转换 
(2)仿真实践 
首先在vivado平台例化一个vdma ip,然后添加进上述的各个模块,代码层级如下: 
这里写图片描述 
在tb_top里面对各个模块做连接,这部分源码如下:

<code class="hljs fsharp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">`timescale <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ns / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ps<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//////////////////////////////////////////////////////////////////////////////////</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// </span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Engineer: EEPROM</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// </span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//////////////////////////////////////////////////////////////////////////////////</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> tb_top();reg reset = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b1;reg video_clk = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b0;reg axis_clk = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b0;reg axi_clk = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b0;wire axi_lite_clk = video_clk;wire sensor_vsync;wire sensor_hsync;wire sensor_de;wire sensor_vblank;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]sensor_data;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axis_s2mm_tdata;wire axis_s2mm_tvalid;wire axis_s2mm_tlast;wire axis_s2mm_tuser;wire axis_s2mm_tready;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axis_mm2s_tdata;wire axis_mm2s_tvalid;wire axis_mm2s_tlast;wire axis_mm2s_tuser;wire axis_mm2s_tready;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//axi lite</span>wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_araddr;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_arprot;wire axi_lite_master_arready;wire axi_lite_master_arvalid;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_awaddr;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_awprot;wire axi_lite_master_awready;wire axi_lite_master_awvalid;wire axi_lite_master_bready;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_bresp;wire axi_lite_master_bvalid;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_rdata;wire axi_lite_master_rready;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_rresp;wire axi_lite_master_rvalid;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_wdata;wire axi_lite_master_wready;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]axi_lite_master_wstrb;wire axi_lite_master_wvalid;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// axi</span>wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]   S_AXI_awaddr ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awburst;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awcache;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awid   ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awlen  ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awlock ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awprot ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awqos  ;wire            S_AXI_awready;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_awsize ;wire            S_AXI_awvalid;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_bid    ;wire            S_AXI_bready ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_bresp  ;wire            S_AXI_bvalid ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]   S_AXI_wdata  ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_wid    ;wire            S_AXI_wlast  ;wire            S_AXI_wready ;wire   [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_wstrb  ;wire            S_AXI_wvalid ;wire            S_AXI_arready;wire            S_AXI_rlast;wire            S_AXI_rvalid;wire  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]     S_AXI_rresp;wire  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    S_AXI_rdata;wire  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]     S_AXI_rid;wire            S_AXI_arvalid; wire            S_AXI_rready;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arburst;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arlock;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arsize;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arprot;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]     S_AXI_araddr;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arcache;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arlen;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arqos;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]      S_AXI_arid;initial <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>#<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>;reset=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always # <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> video_clk = ~video_clk;always # <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> axis_clk = ~axis_clk;always # <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> axi_clk = ~axi_clk;sensor u_sensor(     .rst     (reset),     .clk     (video_clk),     .vsync   (sensor_vsync),     .hsync   (sensor_hsync),    .de      (sensor_de),    .vblank  (sensor_vblank),     .pix_out (sensor_data));video2axis u_video2axis(    .axis_clk       (axis_clk),    .axis_aresetn   (!reset),    .reg_axis_start (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b1),    .m_axis_tdata   (axis_s2mm_tdata ),    .m_axis_tkeep   (axis_s2mm_tkeep ),    .m_axis_tvalid  (axis_s2mm_tvalid),    .m_axis_tlast   (axis_s2mm_tlast ),    .m_axis_tuser   (axis_s2mm_tuser ),    .m_axis_tready  (axis_s2mm_tready),    .video_clk      (video_clk),    .video_rst      (reset),    .video_hsync    (sensor_hsync),    .video_vsync    (sensor_vsync),    .video_hblank   (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b0),    .video_vblank   (sensor_vblank),    .video_de       (sensor_de),    .video_data     (sensor_data));wire vid_hsync_i;wire vid_vsync_i;wire vid_hblank_i;wire vid_vblank_i;wire vid_de_i;wire vid_hsync_o;wire vid_vsync_o;wire vid_hblank_o;wire vid_vblank_o;wire vid_de_o;wire [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] vid_video_o;video_timing_gen #(    .SENSOR_ACT_W       (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>),    .SENSOR_ACT_H       (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>),    .SENSOR_WIDTH       (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>),    .SENSOR_HEIGHT      (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>),    .SENSOR_HSYNC_START (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> ),    .SENSOR_HSYNC_STOP  (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">40</span>),    .SENSOR_VSYNC_START (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> ),    .SENSOR_VSYNC_STOP  (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> ))u_video_timing_gen(     .rst_n       (!reset),     .video_clk   (video_clk),     .reg_h_start (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>),    .reg_v_start (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">60</span>),    .vsync       (vid_vsync_i),     .hsync       (vid_hsync_i),    .de          (vid_de_i),    .vblank      (vid_vblank_i),    .hblank      (vid_hblank_i));axis2video u_axis2video(    .axis_clk            (axis_clk),    .axis_aresetn        (!reset),    .reg_axis_mm2s_start (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b1),    .s_axis_tdata        (axis_mm2s_tdata),    .s_axis_tvalid       (axis_mm2s_tvalid),    .s_axis_tlast        (axis_mm2s_tlast),    .s_axis_tuser        (axis_mm2s_tuser),    .s_axis_tready       (axis_mm2s_tready),    .video_clk           (video_clk),    .video_rst           (reset),    .video_hsync_i       (vid_hsync_i),    .video_vsync_i       (vid_vsync_i),    .video_hblank_i      (vid_hblank_i),    .video_vblank_i      (vid_vblank_i),    .video_de_i          (vid_de_i),    .video_hsync_o       (vid_hsync_o),    .video_vsync_o       (vid_vsync_o),    .video_hblank_o      (vid_hblank_o),    .video_vblank_o      (vid_vblank_o),    .video_de_o          (vid_de_o),        .video_data          (vid_video_o));axi_lite_master u_axi_lite_master (   .M_AXI_ACLK    (axi_lite_clk           ),    .M_AXI_ARESETN (!reset ),    .M_AXI_AWADDR  (axi_lite_master_awaddr  ), <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//[8:0]</span>   .M_AXI_AWPROT  (                 ),   .M_AXI_AWVALID (axi_lite_master_awvalid ),   .M_AXI_AWREADY (axi_lite_master_awready ),   .M_AXI_WDATA   (axi_lite_master_wdata   ),   .M_AXI_WSTRB   (                 ),   .M_AXI_WVALID  (axi_lite_master_wvalid  ),   .M_AXI_WREADY  (axi_lite_master_wready  ),   .M_AXI_BRESP   (axi_lite_master_bresp   ),   .M_AXI_BVALID  (axi_lite_master_bvalid  ),   .M_AXI_BREADY  (axi_lite_master_bready  ),   .M_AXI_ARADDR  (axi_lite_master_araddr  ), <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//[8:0]</span>   .M_AXI_ARPROT  (                 ),   .M_AXI_ARVALID (axi_lite_master_arvalid ),   .M_AXI_ARREADY (axi_lite_master_arready ),   .M_AXI_RDATA   (axi_lite_master_rdata   ),   .M_AXI_RRESP   (axi_lite_master_rresp   ),   .M_AXI_RVALID  (axi_lite_master_rvalid  ),   .M_AXI_RREADY  (axi_lite_master_rready  ),   .DDRX_PHY_INIT_DONE(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b1),    .DONE_SUCCESS  (                   ));axi_vdma_test u_axi_vdma_test (  .s_axi_lite_aclk(axi_lite_clk),   .m_axi_mm2s_aclk(axi_clk),        .m_axis_mm2s_aclk(axis_clk),      .m_axi_s2mm_aclk(axi_clk),        .s_axis_s2mm_aclk(axis_clk),      .axi_resetn(!reset),              .s_axi_lite_awvalid(axi_lite_master_awvalid),   .s_axi_lite_awready(axi_lite_master_awready),   .s_axi_lite_awaddr (axi_lite_master_awaddr[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]),  .s_axi_lite_wvalid (axi_lite_master_wvalid),     .s_axi_lite_wready (axi_lite_master_wready),     .s_axi_lite_wdata  (axi_lite_master_wdata),      .s_axi_lite_bresp  (axi_lite_master_bresp),      .s_axi_lite_bvalid (axi_lite_master_bvalid),     .s_axi_lite_bready (axi_lite_master_bready),     .s_axi_lite_arvalid(axi_lite_master_arvalid),    .s_axi_lite_arready(axi_lite_master_arready),    .s_axi_lite_araddr (axi_lite_master_araddr[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]),   .s_axi_lite_rvalid (axi_lite_master_rvalid),     .s_axi_lite_rready (axi_lite_master_rready),     .s_axi_lite_rdata  (axi_lite_master_rdata),      .s_axi_lite_rresp  (axi_lite_master_rresp),      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//.s2mm_frame_ptr_in(),                          </span>  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//.s2mm_frame_ptr_out(),                         </span>  .m_axi_s2mm_awaddr (S_AXI_awaddr),     .m_axi_s2mm_awlen  (S_AXI_awlen),      .m_axi_s2mm_awsize (S_AXI_awsize),     .m_axi_s2mm_awburst(S_AXI_awburst),    .m_axi_s2mm_awprot (S_AXI_awprot),     .m_axi_s2mm_awcache(S_AXI_awcache),    .m_axi_s2mm_awvalid(S_AXI_awvalid),    .m_axi_s2mm_awready(S_AXI_awready),    .m_axi_s2mm_wdata  (S_AXI_wdata),      .m_axi_s2mm_wstrb  (S_AXI_wstrb),      .m_axi_s2mm_wlast  (S_AXI_wlast),      .m_axi_s2mm_wvalid (S_AXI_wvalid),     .m_axi_s2mm_wready (S_AXI_wready),     .m_axi_s2mm_bresp  (S_AXI_bresp),      .m_axi_s2mm_bvalid (S_AXI_bvalid),     .m_axi_s2mm_bready (S_AXI_bready),     .m_axi_mm2s_araddr (S_AXI_araddr),     .m_axi_mm2s_arlen  (S_AXI_arlen),      .m_axi_mm2s_arsize (S_AXI_arsize),     .m_axi_mm2s_arburst(S_AXI_arburst),    .m_axi_mm2s_arprot (S_AXI_arprot),     .m_axi_mm2s_arcache(S_AXI_arcache),    .m_axi_mm2s_arvalid(S_AXI_arvalid),    .m_axi_mm2s_arready(S_AXI_arready),    .m_axi_mm2s_rdata  (S_AXI_rdata),      .m_axi_mm2s_rresp  (S_AXI_rresp),      .m_axi_mm2s_rlast  (S_AXI_rlast),      .m_axi_mm2s_rvalid (S_AXI_rvalid),     .m_axi_mm2s_rready (S_AXI_rready),     .s_axis_s2mm_tdata(axis_s2mm_tdata),      .s_axis_s2mm_tkeep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>'b1111),              .s_axis_s2mm_tuser(axis_s2mm_tuser),      .s_axis_s2mm_tvalid(axis_s2mm_tvalid),    .s_axis_s2mm_tready(axis_s2mm_tready),    .s_axis_s2mm_tlast(axis_s2mm_tlast),      .m_axis_mm2s_tdata(axis_mm2s_tdata),    .m_axis_mm2s_tkeep(),    .m_axis_mm2s_tuser(axis_mm2s_tuser),    .m_axis_mm2s_tvalid(axis_mm2s_tvalid),  .m_axis_mm2s_tready(axis_mm2s_tready),  .m_axis_mm2s_tlast(axis_mm2s_tlast),    .mm2s_fsync(!vid_vsync_i),  .s2mm_introut()                         );axi_slave u_axi_slave(  .S_AXI_ACLK      (axi_clk),  .S_AXI_ARESETN   (!reset),  .S_AXI_AWID      (S_AXI_awid   ),  .S_AXI_AWADDR    (S_AXI_awaddr ),  .S_AXI_AWLEN     (S_AXI_awlen  ),  .S_AXI_AWSIZE    (S_AXI_awsize ),  .S_AXI_AWBURST   (S_AXI_awburst),  .S_AXI_AWVALID   (S_AXI_awvalid),  .S_AXI_AWREADY   (S_AXI_awready),  .S_AXI_WDATA     (S_AXI_wdata  ),  .S_AXI_WSTRB     (S_AXI_wstrb  ),  .S_AXI_WLAST     (S_AXI_wlast  ),  .S_AXI_WVALID    (S_AXI_wvalid ),  .S_AXI_WREADY    (S_AXI_wready ),  .S_AXI_BID       (S_AXI_bid    ),  .S_AXI_BRESP     (S_AXI_bresp  ),  .S_AXI_BVALID    (S_AXI_bvalid ),  .S_AXI_BREADY    (S_AXI_bready ),  .S_AXI_ARID    (S_AXI_arid   ),  .S_AXI_ARADDR  (S_AXI_araddr ),  .S_AXI_ARLEN   ({<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>'b0,S_AXI_arlen}  ),  .S_AXI_ARSIZE  (S_AXI_arsize ),  .S_AXI_ARBURST (S_AXI_arburst),  .S_AXI_ARVALID (S_AXI_arvalid),  .S_AXI_ARREADY (S_AXI_arready),  .S_AXI_RID     (S_AXI_rid    ),  .S_AXI_RDATA   (S_AXI_rdata  ),  .S_AXI_RRESP   (S_AXI_rresp  ),  .S_AXI_RLAST   (S_AXI_rlast  ),  .S_AXI_RVALID  (S_AXI_rvalid ),  .S_AXI_RREADY  (S_AXI_rready ));integer file_fd;reg vblank_o_r;reg [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] frame_cnt=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;always @(posedge video_clk) vblank_o_r <= vid_vblank_o;always @(posedge video_clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((~vblank_o_r) & vid_vblank_o)        frame_cnt <= frame_cnt + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>'b1;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>initial <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    file_fd = $fopen(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"output.rgb"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"wb"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge video_clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(frame_cnt == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> && vid_de_o)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        $fwrite(file_fd,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%c%c%c%c"</span>,vid_video_o[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>],vid_video_o[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>],vid_video_o[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>],vid_video_o[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(frame_cnt == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        $fclose(file_fd);        $stop;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>endmodule</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li></ul>

接下来,就要准备仿真用数据了,我这里用matlab将一副图片的图像数据取出来,写成rgb文件,当做视频数据源

<code class="hljs matlab has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">image=imread(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'test.bmp'</span>);image=imresize(image,<span class="hljs-matrix" style="box-sizing: border-box;">[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>]</span>);imshow(image);w=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>;h=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;fd=fopen(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'input.rgb'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'wb'</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">i</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:h    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">j</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:w        pix=<span class="hljs-matrix" style="box-sizing: border-box;">[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,image(i,j,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>),image(i,j,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>),image(i,j,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)]</span>;        fwrite(fd,<span class="hljs-transposed_variable" style="box-sizing: border-box;">pix'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'uint8'</span>);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>fclose(fd);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

接下来在sensor模块里面读出这个图像数据,然后根据视频时序发出 
sensor.v代码

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">`timescale <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ns / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ps`timescale <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ns / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>ps//////////////////////////////////////////////////////////////////////////////////// // Engineer: EEPROM// //////////////////////////////////////////////////////////////////////////////////module sensor (     input rst,     input clk,     output reg vsync,     output reg hsync,    output reg de,    output reg vblank,    output reg[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]pix_out);parameter SENSOR_ACT_W = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>;parameter SENSOR_ACT_H = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;parameter SENSOR_WIDTH = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>;parameter SENSOR_HEIGHT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>;parameter H_START       = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>; parameter V_START       = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">60</span>; parameter DATA_SIZE = SENSOR_WIDTH*SENSOR_HEIGHT;reg [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] hcnt;reg [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] vcnt;reg  [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] raw_array [DATA_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">integer</span> i;<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">integer</span> file_hdl;initial  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    file_hdl = $fopen(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"input.rgb"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"rb"</span>);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> ( i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i<DATA_SIZE; i=i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        raw_array[i][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] = $fgetc(file_hdl);        raw_array[i][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>] = $fgetc(file_hdl);        raw_array[i][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>] = $fgetc(file_hdl);        raw_array[i][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">31</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>] = $fgetc(file_hdl);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>         $fclose(file_hdl);        $display(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"read raw data ok\n"</span>);  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        hcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span><span class="hljs-attribute" style="box-sizing: border-box;">'d0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hcnt == SENSOR_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        hcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span><span class="hljs-attribute" style="box-sizing: border-box;">'d0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>         hcnt <= hcnt + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        vcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span><span class="hljs-attribute" style="box-sizing: border-box;">'d0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hcnt == SENSOR_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> && vcnt == SENSOR_HEIGHT-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        vcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span><span class="hljs-attribute" style="box-sizing: border-box;">'d0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hcnt == SENSOR_WIDTH-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        vcnt <= vcnt + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        hsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span><span class="hljs-attribute" style="box-sizing: border-box;">'d40</span>)        hsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b1</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        hsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        de <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hcnt >= H_START && hcnt < H_START+SENSOR_ACT_W && vcnt >= V_START && vcnt < V_START+SENSOR_ACT_H )        de <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b1</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        de <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        vblank <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b1</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(vcnt >= V_START-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> && vcnt <= V_START+SENSOR_ACT_H )        vblank <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        vblank <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b1</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(rst)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">begin</span>        vsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(vcnt <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)        vsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b1</span>;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        vsync <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-attribute" style="box-sizing: border-box;">'b0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>always @(posedge clk) pix_out <= (hcnt >= H_START &&hcnt < H_START+SENSOR_ACT_W && vcnt >= V_START && vcnt < V_START+SENSOR_ACT_H) ? raw_array[(vcnt-V_START)*SENSOR_ACT_W+hcnt-H_START]:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;endmodule</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li></ul>

视频数据源有了,那么为了验证vdma工作正常,即视频数据读写ddr正常,就需要把读回来的数据也存储一下,代码在tb_top最后有写,至于为什么要等fram_cnt为1的时候开始写,那是因为我做的是一个乒乓buffer,vdma读出来的第一帧数据是无效数据,第二帧开始才是有效数据。 
代码都准备完毕,开始仿真,我这里调用的modelsim,vivado如果使用modelsim仿真,这里不做介绍,网上搜一下资料还是比较多的 
仿真关键信号时序: 
这里写图片描述
这里面是做两帧的仿真,牢骚一句,仿真真的太慢了 
仿真结束以后,会把从DDR读回来的视频数据存储到output.rbg文件里面,还是用matlab对这个数据做处理:

<code class="hljs matlab has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">w=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">640</span>;h=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">480</span>;dst = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">zeros</span>(h,w);fd=fopen(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'output.rgb'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'r'</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">i</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:h    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">j</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:w        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%pix=[0,image(i,j,1),image(i,j,2),image(i,j,3)];</span>        pix=fread(fd,<span class="hljs-matrix" style="box-sizing: border-box;">[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>]</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'uint8'</span>);        dst(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">i</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">j</span>)=pix(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>);        dst(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">i</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">j</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)=pix(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);        dst(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">i</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">j</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)=pix(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>fclose(fd);figureimshow(uint8(dst));</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

下面是输入图片和输出图片对比: 
这里写图片描述
可见vdma工作正常 
四:总结 
通过对vdma的仿真,可以更深入的了解vdma的工作原理,工作流程,给实际应用做好准备工作。同时,这么做也有更多的意义,对于一些需要DDR缓存才能完成的图像算法,比如视频3D降噪,运动物体检测帧差法,HDR图像合成等等,完全可以在此基础上进行仿真,能更大程度的模拟FPGA实际工作状况,提高算法移植效率。

这篇主要是针对仿真,下一篇将重点介绍vdma的实际应用,也就是上板测试。

欢迎加入zynq FPGA图像算法交流群:296633958 
本人QQ:707200828


0 0
原创粉丝点击