苏州高端模板建站,购物网站建设项目策划书,wordpress 主题安装教程,青海建设厅官方网站 第1个虚拟项目
前言 点灯开启了我们的FPGA之路#xff0c;那么我们来继续沙盘演练。 用一个虚拟项目#xff0c;来入门练习#xff0c;以此步入数字逻辑的… 第1个虚拟项目
前言 点灯开启了我们的FPGA之路那么我们来继续沙盘演练。 用一个虚拟项目来入门练习以此步入数字逻辑的大门。 Key WordsFIFO 、SOF 、EOF、计数器、缓存、时序图、方案设计
一、项目要求
输入报文长度64~2048字节输入报文之间最小间隔为两拍输出报文的前两拍添加16bit报文长度信息第1拍为报文长度高8位第2拍为报文长度低8位第3拍开始为输入报文 信号 I/O 位宽 描述 系统接口信号 i_sys_clk I 1 系统时钟125Mhz i_rst_n I 1 硬复位低有效 输入接口信号 i_sop_in I 1 输入报文头指示信号高有效 i_eop_in I 1 输入报文尾指示信号高有效 i_vld_in I 1 输入报文数据有效信号高有效 i_data_in I 8 输入报文数据 输出接口信号 o_sop_out O 1 输出报文头指示信号高有效 o_eop_out O 1 输出报文尾指示信号高有效 o_vld_out O 1 输出报文数据有效信号高有效 o_data_out O 8 输出报文数据
输入接口时序 输出接口时序 二、项目方案设计
2.1项目需求
输出报文输出报文长度报文与报文长度输出满足时序要求
2.2项目方案
1. 要求输出报文且报文输出在报文长度输出之后所以需要先对输入报文进行缓存根据输入报文的位宽和长度范围此处选择合适的同步FIFO即可如果是IC那么就需要自己写FIFO可以参考本博客的FIFO介绍 这里项目提出了第1个要求掌握FIFO的使用。
2. 要求输出报文长度所以需要对输入报文长度进行计数并将其缓存 此处有坑若只用寄存器对长度进行缓存存在被后续报文长度覆盖的风险故需要第2个FIFO对报文长度进行缓存。
3. 要求先输出报文长度然后紧跟着输出报文此处需要对时序进行设计需要掌握FIFO的读写时序需要理解fpga的时钟沿采样。 理解时钟沿采样及数据下一时钟沿变化。
2.3项目代码
module zmj0001(input sys_clk,input rst_n,input sop_in,input eop_in,input vld_in,input [7:0] data_in,output sop_out,output eop_out,output vld_out,output [7:0] data_out);
当然这不是唯一的设计方案可以先自行考虑设计及验证。
若需完整代码工程搜索“zmj0001”
项目重难点
FIFO的使用及时序的设计考虑包间隔2 clk cycle考虑长包超短包的情况
时序设计可以用TimingDesigner软件简单易用需要的可以下载。
三、仿真验证
可以使用计数器来产生数据源data_in;
timescale 1ns / 1psmodule zmj0001_tb();reg sys_clk ;
reg rst_n ;
reg [7 :0] data_in ;
reg vld_in ;
reg sop_in ;
reg eop_in ;
reg [11 :0] cnt ;
wire sop_out ;
wire eop_out ;
wire vld_out ;
wire [7:0] data_out ;initial
beginsys_clk 0;rst_n 0;#100rst_n 1;
end
always #5 sys_clk ~sys_clk; //100Mhz
//用计数器来产生data_in
always (posedge sys_clk or negedge rst_n)beginif(~rst_n)cnt 12b0;else if(cnt 2048)cnt cnt;elsecnt cnt 12b1;
end
always (posedge sys_clk or negedge rst_n)beginif(~rst_n)begindata_in 8b0;sop_in 1b0;eop_in 1b0;vld_in 1b0;endelse begindata_in 8b0;sop_in 1b0;eop_in 1b0;vld_in 1b0;if((cnt d10 cnt d60)|(cnt d68 cnt d668))begindata_in data_in 1b1;vld_in 1b1;endif((cnt d11)|(cnt d69))sop_in 1b1;if((cnt d60)|(cnt d668))eop_in 1b1;if((cnt d62) | (cnt d63))begin //63 66data_in data_in 1b1;vld_in 1b1;sop_in 1b1;eop_in 1b1;endend
end zmj0001 u_zmj0001(.sys_clk (sys_clk ), .rst_n (rst_n ),.sop_in (sop_in ),.eop_in (eop_in ),.vld_in (vld_in ),.data_in (data_in ),.sop_out (sop_out ),.eop_out (eop_out ),.vld_out (vld_out ),.data_out (data_out ));endmodule具体modelsim使用及与vivado的联合仿真脚本编写请参考其他博文后续FPGA其他专栏再考虑写相关内容。 验证时重点关注边界情况。
输入 共4包数据长包超短包超短包长包包间隔均为2clk cycle data_in : 第1包1-50的累加数第2包1第3包1 输出 若包间隔2 clk
输入 输出 可以看到本设计甚至支持背靠背的超短包输入。
四、项目收获
方案设计的重要性任何项目都是始于方案设计前期需要花大量的功夫去理清思路方案设计完成代码实现只不过是水到渠成的事情。仿真的学习通过本项目完成了testbench的编写仿真验证是对自己设计的一次检验是实际项目缩短调试时间的最佳利器。对xilinx IP的使用对datasheet的阅读学习。对时序的理解时钟是FPGA的心跳任何时序操作都是发生在时钟的跳变沿。当采样发生在当前上升沿时刻数据变化是发生在下一时刻的上升沿。绘画时序图TimingDesigner的使用。有了时序图代码就很容易实现了。 五、进阶考虑
本次虚拟项目旨在用最简单的例子带大家了解数字逻辑设计的一些基本概念所以很多东西是没有考虑的。比如
如果包间隔小于2个时钟周期怎么办 -----握手与反压如果输入数据有错误怎么办 -----CRC校验如果需要跨时钟域传输呢 -----CDC处理报文只是简单转发如果需要做处理呢-----数据处理... 所以下一篇将沿着这个思路展开进阶版的虚拟项目同样可以作为公司的入职培训。
咱们下期见