"欢迎各位大佬在评论区发表你们的调试问题与解决方式"
一、Vivado报错
【labtools 27-3403】
原因:JTAG频率过高。
解决:连接调试器时降低JTAG频率。
【DRC REQP-1619】
原因:没接管脚,造成没有IOB来驱动GT。
【DRC REQP-1712】
输入信号clk不是来自普通的单端时钟信号。
解决:
方法1.IP核中将PLL的clk_in1的source参数修改为Global buffer。
方法2.修改Compensation:The Clocking Wizard-> Re-custom IP->PLLE2 Settings tab->“Allow Override Mode” check->Compensation set to BUF_IN.
方法3.PLL --> MMCM
二、硬件调试
RS233、SPI等串口数据传输问题:
1.波特率不匹配、时钟频率不匹配。
2.RX、TX接反。
3.发送端与接收端未共地。
4.数据大小端
5.命令间隔时间太短
6.协议错误
7.需要先输入密码再发控制指令(真的是有毒,艹)
三、IP coe配置
rom:
memory_initialization_radix=16; %进制格式 (去掉注释)
memory_initialization_vector= %初始化后的数值
xx,
xx;
fir: 滤波器系数需要归一化到最大值(16位归一化到 [±2^15)),不然带外的抑制能力会降低。
Radix = 16;
Coefficient_Width = 16;
CoefData =
7fff,
0007; % 16进制前面需要补0(去掉注释)
四、程序调试
1、200MHz时钟5ns的时钟周期控制信号定时发射时,需要将样点数据(200MHz时钟2x2相数据,2x32位)从200M的时钟域同步到100M的SerDes传输时钟域(100MHz时钟1x4相数据,1x64位),会造成时间刻度从5ns增加到了10ns。通过移动一个样点的方式可以将时间刻度恢复到5ns。
2、FPGA在软件打开后工作异常,调试器抓取时显示未找到时钟。原因是打开软件后将时钟切换为了外参考时钟,而外参考时钟不稳定造成时钟无法锁定,FPGA无工作时钟无法工作。需要自适应时钟在外参考时钟无法锁定时自动切换为内参考时钟。
3、算法实现时先在matlab中进行仿真,再使用verilog编写算法,再将verilog的实现步骤在matlab中实现,对比仿真的结果,结果完全匹配后再进行实现。对比时将verilog仿真结果的数据保存后导入到matlab中进行分析。
4、dds输出的频率不精确时需要频偏校正,比如驱动时钟是204.8MHz需要产生1MHz的正弦波形时如果相位的精度是32位,则每个时钟的相位增量就是(1M/204.8M)*(2^32) = 20,971,520 是一个整数,dds产生的正弦波频率为1MHz。如果驱动时钟是200MHz要产生1MHz的正弦波,则每个时钟的相位增量就是1/200*2^32=21,474,836.48 是一个小数,此时相位增量只能设置为21,474,836就会造成产生的正弦波频率约为0.9999999776MHz。此时就需要将丢失0.48的相位补偿回来补偿的周期为0.48与1的最小公倍数25(0.48*25=1*12),也就是第25时钟时相位的增量21,474,8367+12 (21,474,836.48*25==21,474,836*24+21,474,848*1)。
5、PCIE链路偶尔掉链逻辑无问题。
电源问题:In the TRD demonstration section connect an external 12V wall power supply to the board instead of the ATX power supply.
主机已经建链完成不再与FPGA建链:The FPGA configuration time on the board is large and does not meet the PCIe specification. By the time the FPGA configures, PCIe enumeration on the host system is complete.
6.empty控制读信号会使fifo多读出数据,需要使用prog_empty来控制读信号,或者使用组合逻辑来控制读信号。注意rom、ram、fifo读出数据需要几个时钟。
7.烤机后上位机使用卡顿,采集卡传输数据丢包,内存条损坏。
8.i<NUM 或 i<=NUM-1 写成 i<NUM-1。
9.截位造成数据溢出。自适应截位。统计一段时间内最高有效位的数量来控制截位的窗口。
10.iq数据错位或者搞反。
11.接口名称寄存器名称,要差异化防止搞混接错增加试错成本。
12.充分利用ready 与 valid信号在模块间数据交互的控制,防止不必要的丢数,多读。
13.数据输入有效要与时钟匹配,例如IP核数据速率是100M,时钟速率是200M,则输入到IP核的数据不能连续输入,需要前级缓存一下,每两个时钟输入一个数据,如果有ready信号,则ready有效时开始更新输入。
14.数据直接截位会引入直流。截位需要四舍五入。
always @(posedge clk, negedge rst_n) begin
if(!rst_n) begin
carry <= 1'b0;
round <= 16'd0;
dat_cut <= 16'd0;
end else begin
carry <= dat[23] ? dat[7]&(|dat[6:2]) : dat[7];
round <= dat[23:8];
dat_cut <= round + carry;
end
end