最近一段时间的关于FPGA的工作总结

1、生成MAC的IP核产生,让其自动添加crc32的时候,我将IP核的相关参数设置好,输入原始数据tx_axis_tdata,tx_axis_tvalid,tx_axis_tlast,tx_axis_tkeep;之后,一直都生成不了CRC32,就是连IP核自身都不工作,之后使用modelsim仿真(之前都没用过,趁此也稍微学习了一下),也还是一样的效果。(现在认为modelsim要编译有点麻烦,可能是一直都是用ise的缘故吧)。然后把机子重启了一下,并且把.xco替换为.v文件(xco才是真正的Core文件,v和vhd只是接口方式),尽然就好了
,然后又用.xco换回去,发现结果有好了,但过了一段时间又不行了,最后还是添加.v文件比较靠谱些。觉得有点不可思议。。。我分析是因为使用.v时产生结果留给了后续吧。
2、其实ISE中有很多bug,这在华为调试时更明显,当加了比较多的信号时,自动报err,而加更少的信号时可以正常工作
3、实例化10GMAC的时候对IP核的一些配置:
wifi_axis_1 xgmii_tx_rx_1 (
.reset(rst), // input reset
.tx_axis_aresetn(!rst), // input tx_axis_aresetn IP核中以低电平复位,与实际的逻辑系统刚好相反
.tx_axis_tdata(tx_axis_tdata), // input [63 : 0] tx_axis_tdata
.tx_axis_tvalid(tx_axis_tvalid), // input tx_axis_tvalid
.tx_axis_tlast(tx_axis_tlast), // input tx_axis_tlast
.tx_axis_tuser(1'b0), // input tx_axis_tuser
.tx_ifg_delay(8'd0), // input [7 : 0] tx_ifg_delay
.tx_axis_tkeep(tx_axis_tkeep), // input [7 : 0] tx_axis_tkeep
.tx_axis_tready(tx_axis_tready), // output tx_axis_tready
.tx_statistics_vector(), // output [25 : 0] tx_statistics_vector此信号未用到
.tx_statistics_valid(), // output tx_statistics_valid 此信号未用到
.rx_axis_aresetn(!rst), // input rx_axis_aresetn
.rx_axis_tdata(rx_axis_tdata), // output [63 : 0] rx_axis_tdata
.rx_axis_tvalid(rx_axis_tvalid), // output rx_axis_tvalid
.rx_axis_tuser(rx_axis_tuser), // output rx_axis_tuser
.rx_axis_tlast(rx_axis_tlast), // output rx_axis_tlast
.rx_axis_tkeep(rx_axis_tkeep), // output [7 : 0] rx_axis_tkeep
.rx_statistics_vector(rx_statistics_vector), // output [29 : 0] rx_statistics_vector
.rx_statistics_valid(rx_statistics_valid), // output rx_statistics_valid
.pause_val(16'h0), // input [15 : 0] pause_val  IP核的控制信号
.pause_req(1'b0), // input pause_req            IP核的控制信号
.tx_configuration_vector(80'h2), // input [79 : 0] tx_configuration_vector
.rx_configuration_vector(80'h2), // input [79 : 0] rx_configuration_vector
.status_vector(), // output [1 : 0] status_vector 此信号未用到
.tx_clk0(clk), // input tx_clk0
.tx_dcm_lock(1'b0), // input tx_dcm_lock
.xgmii_txd(xgmii_txd), // output [63 : 0] xgmii_txd
.xgmii_txc(xgmii_txc), // output [7 : 0] xgmii_txc
.rx_clk0(clk), // input rx_clk0
.rx_dcm_lock(1'b0), // input rx_dcm_lock
.xgmii_rxd(xgmii_rxd), // input [63 : 0] xgmii_rxd
.xgmii_rxc(xgmii_rxc) // input [7 : 0] xgmii_rxc
);


4、常用的关键字有“RADIX”(非存储器,如滤波器内核所使用的基数)、“MEMORY_INITIALIZATION _RADIX”(存储器内核所使用的基数)及“MEMORY_INITIALIZATION_VECTOR”(分布式和块存储器的变量)。
5、NGC文件:设计实现后的二进制网表文件。
6、V文件:仿真生成的Verilog源代码文件。
7、在调试时,不要轻易改变代码。如果真的有必要改变时,多想想这对前后的影响,不要一为的凑数据跟仿真波形,做逻辑的只有对错(1、0)。
8、代码在复位的时候,要把复位之后的变量归为‘0’。因为板子之间的初始化状态位‘0’。不然板子复位之后,很难重现之前的结果。
9、在写常量时,要指明数据的位宽。如  10'd0.并且不要写成10'b0或者10'h0的形式.
10、在写代码之前,自己先要有一个自己的时序图,而不是针对不同的数据进行凑时序。
11、RAM跟RAM之间为了避免时序过紧,之间互联的信号要打一拍。
12、a*382要写成{{a,8'd0}} + {{a,6'd0}} + {{a,5'd0}} + {{a,4'd0}} + {{a,3'd0}} + {{a,2'd0}} + {{a,1'd0}}  
13、a/8 要写成 a>>2'd3  ; a/4 要写成 a>>2'd2.
14、当有多个条件一起决定下一个寄存器的结果时,在逻辑上是有优先级之分的,但在实际上版测试的时候,这个优先级不是那么明显。所以在写代码的时候最好加括号,更明显的显示其优先级,避免不必要的干扰因素。
15、复位条件分开写当有一个条件和复位之后的结果是一样的,最好要将复位和这个条件分开写。如if(flag | rst) 要分开写。
16、模块之间的信号输出时,最好使用reg型。
17、信号使用声明时,最好注释其含义,代表的什么意思,便于自己或他人之后看代码。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值