- 博客(30)
- 收藏
- 关注
原创 设计一个UART接口的AXI_LITE_MASTER之一 总体介绍
这样实际操作的时候我们可以在PC电脑上运行ADI官方提供的DEMO程序,当需要通过AXI_LITE总线控制时候,就调用串口发送规定好的数据包实现对IP内部寄存器的读写。受限于串口速率,这里进行配置控制的速度确实慢了好多,但是好在配置不要求实时,并且数据流都在FPGA内部产生并消化,所以可以符合带宽和灵活性的要求。我们知道PS通过内存映射方式方式用户的IP,具体是将用户的逻辑做成AXI_LITE_SALVE外设,PS做为AXI_LITE_MASTER去控制。比如下图【上截图】。
2025-04-02 13:59:35
186
原创 一个计算频率的模块
原理是我们已知频率为FRQ的时钟clk每1/20秒翻转一次,这样得到的每次上升边缘就是1/0秒。被测试的时钟meas_clk在1/10秒内数数,数到到多少,之后再传到clk时钟域,输出出来。另外设置了1/4秒的看门狗,当时meas_clk丢失,超过1/4秒没有更新,就触犯看门狗电路自动更新输出0.当外部meas_clk有频率信号接入时,每1/10秒就会输出更新一下时钟计数,这里的计数是输入meas_clk的1/10。可以在编译时候有跨时钟区域的警告,可以通过设置虚假路径来解决。
2024-11-22 23:58:56
403
原创 生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
用户使用这个三个文件生成BOOT.BIN时候往往用SDK的用户界面,分别选择这三个文件之后生成。其实这种方法实际上是先生成了一个.BIF文件,这个BIF记录了上述三个文件的路径,以及处理器的型号等。这里我们可以用文本打开.BAT文件和BIF文件,修改文件路径,设置输入文件和输出文件boot.bin的路径。另外在批处理文件里看到的ping指令,实际就是延迟几秒,让用户看到运行结果。另外bootgen.exe的运行需要用到一些动态库,我也挨个挑选出来放在bootgen.exe所在目录。
2024-11-22 23:43:45
378
原创 驱动学习之12 控制pcie_ram_to_wr的模块
这里看到逻辑还是很简单的,首先是请求,之后状态机运转允许开始写操作后,就读RAM将数据读走发出。从这篇就开始正式写自己的驱动代码。这个BLOG写一段将FIFO里面内容根据指令写到指定的PC内存地址的代码,调用的是pcie_ram_to_wr这个代码。2,要接收上面模块给的传输命令,上面模块给出要传输的开始地址和长度,这个控制模块将大的数据块分成小的一点点传输给PCIE。1,首先是有要发送的数据接口,我们这里不用RAM接口用FIFO接口。3,要有控制这个pcie_ram_to_wr的接口。
2024-07-23 23:50:45
265
原创 PCIE驱动学习11 尝试实现DMA从板卡写PC操作
之前已经实现到了BAR0寄存器的读写。PC对PCIE板卡的控制就是以BAR0的寄存器作为窗口的。我们接下来分析驱动中从FPGA写到PC的实现。简单写一下自己之前就总结出来的几个知识点:1,PC访问板卡通过BAR0寄存器。2,板卡自主的搬运数据。3,板卡搬运数据用的地址是32位,用户空间地址64位,这需要在驱动程序里面对应起来。4,我们在驱动里获取的32位的地址,通过对bar0寄存器的写操作告知FPGA。我们实验中读动作的产生也是通过操作BAR0寄存器来产生。
2024-07-19 16:01:27
504
原创 PCIE驱动学习 最基本的一个PCIE驱动项目
在GITHUB上搜PCIE驱动找到这个最简单的,也可以编译过的。里面只有一个C文件和一个makefile。下载下来直接make就可以编译过。可以基于这个驱动做些练习。
2024-07-17 14:19:39
481
原创 PCIE驱动学习之8 对几个基本的verilog模块的分析
PCIE模块出来的是AXIS接口,这里面转成了UL接口。这个UL接口是FPGA逻辑内部反复出现大量使用的,我琢磨UL应该是作者规定的USER LOCAL 的缩写:用户本地接口。注意这个模块是双向的:从PCIE收数据也发数据跟PCIE,发数据给用户也从用户那里收数据给PCIE发出。第二个时钟域的输出就是第一个时钟域计数器的输出,这个输出保证了使用格雷码进行了时钟域的穿越。这里模块管理着接收的处理。可以发送给PC数据请求,也可以收到数据输出,带地址的形式输出出去(在这个设计中给了fifo_mem_tx模块)。
2024-07-05 12:20:45
573
原创 PCIE驱动学习之7
五 7月 5 11:00:41 2024] xtrx: buf[11]=ffb40000 [virt 000000001fae67c0] => ffb40fff。[五 7月 5 11:00:41 2024] xtrx: buf[15]=ffb00000 [virt 00000000cf0d6251] => ffb00fff。[五 7月 5 11:00:41 2024] xtrx: buf[17]=ffae0000 [virt 00000000b1ca9eba] => ffae0fff。
2024-07-05 11:03:10
732
原创 PCIE驱动学习之6 FPGA中相关中断相关接口的分析
在驱动学习之4,一起看了在驱动层中断的设置以及处理中断处理函数的设置。这里我们简单看看FPGA中关于中断部分。上图是用户模块的接口。这里面的输入对应的PCIE模块的输出,上面的输出对应PCIE模块的输入。上面的模块就是PCIE的模块具体的介绍我们看看UG477。首先我们看RTL图,找到中断相关的接口。
2024-07-05 10:44:44
178
原创 PCIE驱动学习之5
rx在申请缓冲区时候还调用了xtrx_update_rxdma_len这个函数,我们看到实际就是写入了长度给FPGA的寄存器。这里看到根据硬件GP_PORT_RD_HWCFG寄存器确定版本号并确定是进行单独一个长度寄存器的设置还是甚至全部的长度寄存器。上述分析似乎能看到驱动和FPGA之间的交互,但是没有看到用户的应用程序是如何跟驱动交互的。我们要在FPGA里面实现FPGA自主的收发,就要告诉它一组收发的地址和长度。这里的 xtrx_readl和xtrx_writel是读写FPGA内部的寄存器的。
2024-07-04 11:18:12
453
原创 一个频率估计的模块
这是一个根据现有始终估计输入数值的频率,基本原理是数1秒时间,作为计数区间,统计被测频率的计数。之后穿越时钟域输出。代码写好了 还没有进行仿真和实际运行,应该没啥问题了。
2024-07-02 11:42:31
136
原创 PCIE驱动学习之3
上面代码判断中atomic_read返回数不等于0作为condition,我们按照静态来看,就是说将atomic_read的操作的对象在调用wait_event_interruptible_timeout之前就要初始化成非0数值,否则是0的话(0!在上面截图代码里面我们看到,atomic_read,atomic_xchg,另外也可以看到atomic_inc。我们在这个xtrx这驱动里面找到的关于等待函数是wait_event_interruptible_timeout()。关于PPS的注册这里先留个疑问。
2024-07-01 17:47:22
341
原创 ZC706P+ADRV9009连接RADIOVERSE详解之三
打开软件界面我们看到,板子默认的地址为192.168.1.10 端口号为55555.我们一定也设置跟板子连接的以太网口处于192.168.1网段,并且子网掩码是255.255.255.0,另外也可以先暂时关闭掉其他网络接口,比如无线网卡等。之后会有更新进度条,大约几十秒后,会提示板子将从新启动,我们再次等待板子的LD0~LD3闪烁完毕,板子能ping通状态下,就可以再次connect. 再次强调每个SD卡只需这样更新一次。对这个软件的进一步的操作,我们尝试在接下来的blog继续探究。步骤3 :更新固件。
2022-12-26 18:14:49
1603
2
原创 ZC706P+ADRV9009连接RADIOVERSE详解之二
上一个BLOG我们在WIN上安装了RADIOVERSE软件以及做好了SD卡映像。这里看到USB UART串口是可选的,主要是用来查看启动的系统logo。6,ADRV9009射频子卡插在FMC_HPC上。上述连接完成之后,就可以通电。5,30.72M的外接参考时钟。2,上一篇文章中做好的SD卡。4,1000M 以太网口。7,设置为SD卡启动方式。
2022-12-26 15:04:28
1857
原创 ZC706P+ADRV9009连接RADIOVERSE详解之一
其中ADRV9371-SDCARD内有1G多,是一个SD卡映像文件,内有EXT4和FAT32两个文件系统,我们将此映像烧写到SD卡(具体步骤下面介绍)之后,再将ADRV9009这个盘压缩包(只有若干启动文件,无EXT4文件系统)拷贝到烧写好的SD卡的FAT32分区覆盖之前ADRV9371启动盘的内容就可以。之后使用WIN32 DISK IMAGER,找到解压缩的IMG文件,之后点WRITE ,用这个工具烧写ADRV9371的映像文件。第一步是:制作SD卡启动盘。至此SD卡映像文件做好了。
2022-12-26 12:15:14
707
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人