我的FPGA学习笔记 1. 针对Vivado在开展SDK操作之前需重新生成hardware文件。2. 若在软件开发工具包SDK中生成项目时提示缺少IP则需回溯检查赛灵思集成设计环境Vivado中地址编辑器Address Editor模块的地址并进行自动分配操作。3. 若系统提示报错显示缺少DCP文件则删除MIG并重新生成。4. 当系统提示存在约束文件缺失情况时需对管脚分配进行检查。5. 当出现如 clk 管脚分配与 MCM 冲突的提示时移除不必要的位置约束交由软件进行自动分配。6. 当软件开发工具包SDK提示程序所需的只读数据空间超出了 MicroBlaze 处理器本地块随机存取存储器BRAM的容量限制时需回溯检查地址编辑器Address Editor中的内存Mem范围并对其进行扩大处理。若调整后问题仍未解决则重新生成 MICBLAZ或检查链接脚本.ld 文件中的堆栈Stack和堆Heap大小。microblaze_0_local_memory_ilmb_bram_if_cntlr_Mem_microblaze_0_local_memory_dlmb_bram_if_cntlr_Mem overflowed by 94360 bytes若需将大小修改至超出规定范围则进行手动分配assign操作。首先分配MEM大小随后分配两个top及自定义的 IPreg接着assign all最后assign尚未分配的部分。7.若不慎删除bd文件重新添加该文件即可。8. 核查top文件与模块之间的引脚映射情况9. clk_wiz时钟输出情况若未产生时钟输出需对复位信号展开检查当该问题无法通过检查复位信号排除时设置为常数。10. 当对引脚实施修改后若进行重新映射操作模块中的 top 文件亦需进行相应修改。11. 完成重新管脚映射操作后dcp 文件再度缺失。在重新生成 mig 文件之后.v 文件读取出现故障遂重启系统并重新开展测试。12. 若反复提示 DCP 文件缺失需重新执行“Generate Output Products”操作。13. 每次对Block Design如添加/删除IP、调整时钟参数进行修改后均需重新Generate Output Products。14. 若反复提示 MIG 的 DCP/XDC 文件缺失可在 Tcl 控制台中执行“reset project”操作重置工程随后运行实现流程run implementation。15. 若出现引脚约束出错提示应首先核查bd文件中的引脚与约束文件中的引脚名称是否一致。16. 核查top文件、实例化情况以及模块间的引脚映射关系17. 若在生成比特bit流文件时失败且仍出现引脚约束错误需对引脚位置定义进行检查。若该引脚为时钟输入则需检查是否存在冲突情况。若存在冲突应将时钟管理器clk_wiz的输入引脚连接至存储器接口控制器mig的输出时钟引脚并对顶层top文件内容进行修改。18.在集成开发环境IDE中若需进行串口输出显示可依次选择“Window”→“Show View”→“Other...”在搜索框中输入“Terminal”随后添加串口。19. 当 IDE 串口输出呈现乱码时需对 AXI - UARTlite 的波特率一致性进行检查。20.完成调试debug后点击三角形resume按钮21.对自定义 IP 的源码进行修改选定模块后右键选择“Edit in ip Packager”22.添加用户IP设置IP-Repository参数完成目录添加后系统将自动检索子目录IP地址。23. MIG需经由AXI Interconnect挂载至Microblaze的M_AXI_DP之上。24. 若模块内部存在文件缺失情况可点击错误报告随后将缺失文件放置于报错文件所在的文件夹内。25. AXI Interconnect主从时钟S_aclk与M_aclk需与主从IP的工作时钟保持一致。26.工作时钟 是整个 控制和数据处理部分 的基准节拍比如1MicroBlaze 处理器 的运行时钟2AXI 总线AXI4 / AXI4-Lite 的传输时钟3DMA、MIGDDR 控制器、外设控制逻辑 的时钟它决定了 控制逻辑的运行速度比如 CPU 执行指令的速度、寄存器配置的速度、数据块搬移的速度。vdma这种高速传输ip需要的工作时钟需要大于像素时钟27配置时钟处理器配置ip的时钟小于等于cpu时钟配置时钟 是专门用于 配置 IP 核寄存器 的时钟信号通常是低速时钟。它是 AXI4-Lite 接口 的时钟用于 CPU 写 / 读 IP 核的控制寄存器。1初始化外设设置分辨率、启动 / 停止 DMA 等2实时修改参数调整亮度、切换通道等3读取状态寄存器查看中断标志、就绪信号等28.像素时钟 是 视频输出接口 的基准节拍直接决定 每秒钟显示多少个像素。1视频时序控制器VTC 生成 HSYNC、VSYNC、DE 信号的频率2HDMI / VGA 输出 的像素刷新速度3AXI4-Stream 视频流 的传输速率每个像素时钟周期传输一个像素数据像素时钟 ≈ 水平总像素 × 垂直总行数 × 帧率像素侧带宽Pixel_BW Pixel_Clock × (TDATA_WIDTH / 8)VDMA 工作时钟侧的带宽 ≥ 像素时钟侧的带宽最好留 20%~50% 余量29.于src目录下若文件未被定义需检查库的完整性对Platform库进行更新之后在application上右键选择properties—paths and symbols—include添加相应库。30.针对未定义的变量需定位其定义之处并核查目标文件是否存在于库中。31.进行Vitis移植操作并明确各个IP的地址以及变量地址32.针对简单彩条发生器的输出显示Vdma与vtc需进行初始化操作。33.在每次开展 Vitis 调试工作之前需确保完成编译操作。34.在使用 IP 时每次使用前宜深入探究 IP 设置里各参数设置的具体功能。对于需修改的参数应明晰其修改内容及其所产生的作用。35.对于video_out模块直接输出active_video等同于de36.自定义ip添加/编写文件后run syn/impltool—create and package Newip37.视频输出的多个信号合成总线于“端口与接口ports and interfaces”中点击[I]图标搜索“vid_io_rtl”并添加随后双击对应添加相关信号。38.若出现提示 “The debug port micblz_vid_i/ila_0/probe6 has 1 unconnected channels (bits). This will cause errors during implementation.” 既ILAIntegrated Logic AnalyzerIP 核的某一探针probe6存在未连接通道位的情况。此状况将在实现过程中引发错误。针对该问题需对 probe6 端口执行如下操作右键点击该端口选择 “Disconnect” 后重新进行连接以此确保所有位均绑定至有效信号。39.就信号抓取而言输入信号与输出信号通常不存在显著关联。40.针对 IP 时钟若存在多个时钟需关注每个时钟的用途及连接方式避免盲目连接。41.针对VDMA在连接DDR时钟时需加以甄别。42.System ILA对数据总线进行检测时首先需明确引脚的数据类型随后于ILA IP设置里设定接口类型interface type。43..ld文件与程序无法对应地址出现错误会致使程序脱离预期运行轨迹即未遵循程序逻辑运行44.若无法通过 ILA集成逻辑分析仪检测到 VTC输出信号则需对初始化情况进行检查。45.每次对axi连接进行修改后需对模块地址进行检查随后方可运行。46.于BD中对内存大小进行修改时需在Vitis更新XSA文件之后于ld文件中同步修改其size大小。47.将ILA添加至代码中通过“ip catalog”搜索IP双击并命名确认后即可将其纳入工程。双击文件修改IP可对参数进行调整需留意手动位宽的设置随后进行例化操作。48.当某一 IP 无法正常运行时首先对其复位情况进行检查。若自定义 IP 通过源码审核随后检查时钟再对各个引脚展开检查。49.当某一模块出现运行异常时可构建一个测试模块以检验该模块功能的准确性。50.在对下级模块中的子模块开展信号抓取工作时将待测信号赋予预先定义的另一信号之后输出该信号逐层进行输出操作。在此过程中需关注位宽的设置。需特别说明的是reg 信号不可作为输出信号除非该信号在 always 或 initial 语句块中被赋值。51.在数据传输进程中当WE信号处于高电平状态时START信号处于低电平状态待DONE信号转变为高电平之后START信号可再次转变为高电平。52.Concat ip 作为数据拼接 IP将 ln0 低位至 ln1 高位进行拼接。若拼接后的 ln0 为 000则将数据乘以 8此操作主要用于位与字节的转换。 字节数 位宽 / 8使用*_bits或*_width表示位宽以位为单位使用*_bytes表示字节数位宽(bits) 字节数 应用场景8 1 字节数据、ASCII字符16 2 短整数、RGB565像素32 4 单精度浮点数、整数64 8 双精度浮点数、长整数128 16 SIMD指令、高速接口256 32 加密算法、高速总线53.非8倍数的位宽 字节数 位宽7 / 854.若出现[Synth 8-3302] “unable to open file 4k_edid.vhd in r mode”报错需将“4k_edid.vhd”文件复制到报错文件显示的文件eeprom_8b目录下。此问题在每次执行reset_project操作后均会出现。55.若对 ILA 引脚连接予以修改在完成相关操作之后若发现引脚检测结果呈现为修改前的信号那么需将 ILA 删除并重新进行连接。56.在对 IP 地址进行修改后通过精细编译elaborated操作对模块予以更新。57.Hold信号作为准备信号holda信号则为数据传输控制信号。当请求方将hold信号拉高时意味着其已准备就绪而响应方将holda信号拉高则表示数据开始传输。数据传输过程于hold信号与holda信号同步期间发生。58.在 axi_to_jpeg 模块中需对输出的 length 和 addr 等进行初始化处理此过程中应重点关注位宽要求。根据所需位宽利用 slv_reg 进行位宽补齐逐一添加。若 slv_reg 的数量无法满足位宽需求则增加其数量并对 case 条件作出相应调整。之后按照 spi_slave-spi_reg_list 中的初始值进行赋值具体情形如图所示为每个 slv_reg 赋予等宽度的值。59.针对RAM模块需关注ENA、ENB使能情况。若未接入使能信号则应将端口选项Port options中的启用端口类型enable port type设置为始终启用always enabled。60.针对写入内存时出现的信号丢失问题例如存在输入信号但无输出信号的情况首先需核查是否在地址编辑器Address Editor中进行了地址赋值以及Axi_Master中读写信号与基地址是否一致其次要检查是否存在控制信号缺失的情况。61.在Vitis环境中执行程序时于Debug设置里的Target Setup中添加bit文件随后运行该程序。62.在进行数据读取操作时于调试阶段需精准明确读取操作的地址范围以及地址构成。例如(1)burst_address {base_addr, pic_addr, img_reqrow, img_reqcol};(2)其中[0:2]需置为零值img_reqcol[113]的取值区间为 0 - 0x1E0即 1920/4img_reqrow[2212]的取值区间为 0 - 0x438pic_addr[2423]表示四帧的帧号其取值区间为 0 - 3。采用 Vitis 向该区域写入单色图像以此对读取功能的正常性进行测试。 。63.#define FRAME1_ADDR_L 0x80000000 #define FRAME1_ADDR_H 0x80438000#define FRAME2_ADDR_L 0x80800000 #define FRAME2_ADDR_H 0x80c38000#define FRAME3_ADDR_L 0x81000000 #define FRAME3_ADDR_H 0x81438000#define FRAME4_ADDR_L 0x81800000 #define FRAME4_ADDR_H 0x81c38000亦可针对每一帧图像展开单独测试为各帧赋予不同颜色。其中ADDR_H的值为ADDR_L地址在img_reqrow上叠加最大值0x438所得而ADDR_L的值则通过帧号加1计算得出。 64.针对单像素与双像素情况首先需定位初始化模块如 hdmi_loop/hdmi_confige从中确定分辨率以及单双像素的配置信息。例如 “10d11 : lut_data {8h98,16h03,8h40}” 关键确认点在于寄存器 0x03 的值决定了像素模式具体而言当该寄存器值为 0x40 时对应单像素模式当值为 0x54其中 bit6:5 10时对应双像素模式。在对像素模式进行修改之后需留意对视频输入引脚分配进行相应调整。双像素模式下视频输入引脚为 48 位单像素模式则为 24 位。可依据 “assign vout1_data {vin1_data_d2[35:28],4d0,vin1_data_d2[23:16],4d0,vin1_data_d2[11:4],4d0};//24 - Bit SDR” 进行输入引脚配置采用 slice 和 concat 引脚完成切割与分配操作。65.当图像呈现显示不全的状况时需重点关注WR_FIFO_WE/RD_FIFO_WE的变化情况。此值为1920×2÷81080p480 个 beat3840字节每行其中2代表YUV4224:2:2格式下亮度 Y 每像素 1 字节色度 U/V 每 2 像素共享 1 字节总字节数 1920Y 960U 960V 3840 字节每个像素平均占用 2 字节同时要留意length的变化。66.在进行拼位操作时需关注低位的位宽。若位宽设置有误将对高位数值产生影响。67.突发拆分操作将每行 480 拍beat进行拆分拆分为 FF255与 DF223地址未发生跳变。此过程共计产生 438×2 876 次突发。在 AXI 协议中ARLEN/AWLEN突发长度的定义为“beat 数 - 1”。同时AXI 的 8 位 LEN 寄存器的最大值为 255这意味着单次突发最多可传输 256 个 beat此为硬件上限。68.LEN由各个模块传递所得其取值对WE的宽度起着决定性作用。69.在时钟配置有问题的情况下屏幕会出现撕裂和花屏甚至会出现斜条70.在开展 Modelsim 仿真时需关注 VHDL 的顺序编译。具体而言应首先编译包文件随后依次编译基本组件、ROM 组件、数学组件、控制与处理模块、FIFO 模块、RLE_TOP、接口与控制模块、顶层模块以及其他 FIFO 和 RAM。71.在ModelSim中添加库时若库显示为“unavailable”或“empty”则表明库地址存在错误。此时需检查在添加ModelSim.ini文件时所设置的地址是否准确。72.在进行仿真操作时当测试推进至FIFO模块若该模块未呈现数据及信号需对其位宽设置展开检查并对状态机进行核查。73.应尽可能确保相关信号中不存在 z 和 x否则将引发数据传输问题。74..ch_burst_len ({{16d480,16d480,16d480,16d480},{16d480,16d480,16d480,16d480},{16d480,16d480,16d480,16d480},{16d480,16d480,16d480,16d480}})在分屏情形下该值为 16’d240此时 half_en 1在非分屏情形下该值为 480此时 half_en 0。75.针对FIFO模块若出现空Empty异常可对AXI_master模块开展仿真工作。当无法排除错误时可实施强制操作对读预取read_pre置高条件进行修改调整 “读预取的触发阈值”。read_pre是 “读预取触发信号”—— 置高后会通过read_one触发fifo_rd_reqFIFO 读使能把 FIFO 里的数据提前读出来给下游img_dataparameter THRESH 256; //定义 “读预取触发门槛”只有 FIFO 里攒够 256 个数据才允许触发预读不可运行期修改的常量else if( state_cur ! IDLE wrusedwTHRESH) // Empty 1b0 模块处于 “工作状态”比如视频数据传输 / 处理而非空闲 —— 避免空闲时误触发预读wrusedw是 FIFO 的 已写数据量已用深度表示 FIFO 中 “已写入但未读出” 的数据个数≥256begin 满足wrusedw≥256时FIFO 必然非空Empty0避免 “空读 FIFO” 的错误read_pre 1b1; //置高 “读预取触发信号”最终触发fifo_rd_reqFIFO 读使能把 FIFO 数据提前读给下游如 img_dataEnd76.当出现白条闪屏现象时可对 THRESH 的数值予以调大处理。 【下游读取 FIFO 数据的速度 上游往 FIFO 里写数据的速度 → FIFO 被读空下游比如显示模块拿不到数据就会出现 “无数据区域”表现为白条空异常时有时无就会导致 “闪屏”】调大 THRESH 增大 FIFO 数据缓冲池 → 避免被读空 → 消除白条闪屏77. 乒乓结构的核心价值并行读写 跨时钟域隔离 数据流连续适配 “低速写、高速读” 的视频处理场景解决的核心问题读写速率不匹配、跨时钟域冲突、数据断流白条 / 闪屏、读写操作互斥为什么用双 RAM 而非单 RAM单 RAM 无法同时满足 “低速连续写” 和 “高速无等待读”乒乓结构是视频数据流处理的 “标配方案”。78.总结两者的关联与使用策略1核心关联乒乓结构是 “基础盘”解决数据流连续的根源问题调大 THRESH 阈值是 “优化项”解决乒乓结构下偶发的 “短暂写速波动→FIFO 空→白条” 问题两者是 “架构 参数” 的互补关系而非替代。2推荐使用策略第一步先搭建乒乓结构解决跨时钟域、读写并行、数据流连续的核心问题第二步若仍偶发白条闪屏说明 FIFO 仍有少量空读调大 THRESH 阈值比如 256→512兜底消除空异常极端情况若乒乓结构设计完善切换逻辑无瑕疵THRESH 只需设为 “下游单次突发长度”比如 64即可无需过大。简单来说乒乓结构像 “两个水桶交替接水和倒水”保证 “总有水可倒”调大阈值像 “要求水桶必须接满 256 升水才允许倒”即使接水速度偶尔变慢也不会倒空水桶。两者结合既能保证 “持续有水”又能保证 “水桶不会空”是视频数据流处理的 “黄金组合”。79.在对 de 信号或其他信号实施延时操作时向 rd_umpi 模块输入延时前的信号上层模块的输出端 de_o 则输出延时后的信号。若均给予延时后的信号那么对于 de 信号的波形将不产生延时效果。80.在进行 Vitis 移植操作时地址应当依据寄存器的大小进行递增。例如若寄存器为 32 位那么地址需按照 4 字节的幅度递增注意进制转换。81.当需要向内存进行申请操作时所申请的长度不可为零。换言之只要hold信号处于高电平状态length值不得为零。82.以十六进制形式查看JPEG格式的图片文件时其起始标识通常为FFD8结束标识则为FFD9。83.VITIS内存数据导出打开 Memory Browser 窗口菜单栏 → Window → Show View → Memory Browser在 Memory Browser 中输入要导出的内存起始地址如 0x80000000选择数据宽度8/16/32/64 位匹配你的数据类型右键点击内存数据区域 → 选择 Export配置导出参数选择导出范围指定地址范围 / 已显示的所有数据选择文件格式支持 *.txt/*.csv/*.bin/*.hex推荐 bin 或 txt指定保存路径点击 Finish 完成导出84.若Length未减至零有效valid信号holda置低则需核查Length赋值语句的正确性。85.针对JPEG压缩初始化代码或COE文件设置FFD8与FFD9数据。双击hander_ram文件可实现coe文件的添加。86.当进行管教连接时若提示“invaild placement site”可在“window——package”中找到相应管脚将鼠标移至该管脚处查看相关信息。若“site type”为“mrcc”或其他则需检查代码中是否将该信号分配给了“BUFG”。