问题标签 [zynq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1925 浏览

vhdl - 使用 Zynq 将数据写入 SD 卡

我正在使用 ZedBoard(具有 Xilinx Zynq FPGA)开发应用程序。该板将连接到多个 SD 卡。一张 SD 卡用于启动和编程 FPGA(这里没问题)。一旦结束,FPGA 将不得不进行一些数据处理并使用 SDIO 协议将内容写入第二张 SD 卡。我没有遇到任何有用的文档/教程等来展示如何直接使用 VHDL 逻辑或通过 PS 使用 AXI4 - DMA 将数据写入 SD 卡。此外,没有用于 SD 卡读/写访问的免费 Xilinx 或第 3 方 IP 块。有人可以为我提供一些关于此的提示/帮助吗?

谢谢。

0 投票
1 回答
314 浏览

arm - ARM Cortex A9 中的内核数

我正在使用带有 Zynq 芯片的 Zedboard。我想知道每个 CPU 的内核数(板上有两个,CPU0 和 CPU1,但没有指示内核数!)。谢谢。

0 投票
1 回答
2027 浏览

xilinx - 在 AMP(非对称多重处理)模式下使用 Zynq

有应用笔记 XAPP 1078 和 XAPP 1079 等在 AMP 模式下使用 Zynq。

在本应用笔记中,我们使用存储库 sdk_repo 在独立放大器模板中配置 FSBL。

我想知道普通的“Zynq-FSBL”模板和修改后的“Zynq FSBL for AMP”模板有什么区别。

提前致谢

0 投票
1 回答
1197 浏览

zynq - 无法在 Xilinx SDK 中创建 Petalinux BSP

我正在尝试按照 UG978 文档中给出的步骤在 Xilinx SDK 中构建 Petalinux BSP,但出现以下错误。

错误:EDK - petalinux () - 无法读取“env(PETALINUX)”:没有这样的变量

制作:*** [ps7_cortexa9_0/lib/libxil.a] 错误 2

ERROR:EDK - 运行 DRC 时出错。

make:由于错误,目标“全部”未重新制作。

这些错误的原因可能是什么?提前致谢

0 投票
1 回答
9097 浏览

vhdl - 简单的 axi lite 从应用程序

我正在使用 Vivado 2015.3 和 Zybo 板,我正在尝试实现一个非常简单的 AXI lite IP,它从 PS 接收字符并返回相同的值 +1。

我刚刚从 planahead 切换到生成的 IP 的 vhdl 文件非常简单(在我看来),现在我找不到任何有用的教程来解决这个问题。

我的问题是我应该在 2 个生成的 vhdl 文件(my_ip_0_v1_0_S00_AXI 和 my_ip_0_v1_0)中的哪个位置添加“+1”?

谢谢 :)

my_ip_0_v1_0_S00_AXI.vhd:

my_ip_0_v1_0.vhd :

0 投票
3 回答
1004 浏览

vhdl - VHDL - 综合结果与行为不同

我必须用 VHDL 编写程序,使用牛顿法计算 sqrt。我编写的代码在我看来还可以,但它不起作用。行为模拟提供了适当的输出值,但后期合成(并在硬件上启动)没有。程序被实现为状态机。输入值是一个整数(使用的格式是 std_logic_vector),输出是定点(为了计算目的,输入值乘以 64^2 所以输出值有 6 个 LSB 位是小数部分)。
我使用函数将 vhdl 与 vhdlguru blogspot 分开。在行为模拟中计算 sqrt 大约需要 350 ns (Tclk=10 ns),但在后期合成中仅需要 50 ns。

使用的代码:

下面是行为和综合后仿真结果的屏幕截图:

行为模拟

综合后模拟

我对 VHDL 的经验很少,我不知道我能做些什么来解决问题。我试图排除其他用于计算的过程,但它也不起作用。

我希望你能帮助我。平台:Zynq ZedBoard IDE:Vivado 2014.4

问候, 迈克尔

0 投票
4 回答
2187 浏览

linux-kernel - Need help mapping pre-reserved **cacheable** DMA buffer on Xilinx/ARM SoC (Zynq 7000)

I've got a Xilinx Zynq 7000-based board with a peripheral in the FPGA fabric that has DMA capability (on an AXI bus). We've developed a circuit and are running Linux on the ARM cores. We're having performance problems accessing a DMA buffer from user space after it's been filled by hardware.

Summary:

We have pre-reserved at boot time a section of DRAM for use as a large DMA buffer. We're apparently using the wrong APIs to map this buffer, because it appears to be uncached, and the access speed is terrible.

Using it even as a bounce-buffer is untenably slow due to horrible performance. IIUC, ARM caches are not DMA coherent, so I would really appreciate some insight on how to do the following:

  1. Map a region of DRAM into the kernel virtual address space but ensure that it is cacheable.
  2. Ensure that mapping it into userspace doesn't also have an undesirable effect, even if that requires we provide an mmap call by our own driver.
  3. Explicitly invalidate a region of physical memory from the cache hierarchy before doing a DMA, to ensure coherency.

More info:

I've been trying to research this thoroughly before asking. Unfortunately, this being an ARM SoC/FPGA, there's very little information available on this, so I have to ask the experts directly.

Since this is an SoC, a lot of stuff is hard-coded for u-boot. For instance, the kernel and a ramdisk are loaded to specific places in DRAM before handing control over to the kernel. We've taken advantage of this to reserve a 64MB section of DRAM for a DMA buffer (it does need to be that big, which is why we pre-reserve it). There isn't any worry about conflicting memory types or the kernel stomping on this memory, because the boot parameters tell the kernel what region of DRAM it has control over.

Initially, we tried to map this physical address range into kernel space using ioremap, but that appears to mark the region uncacheable, and the access speed is horrible, even if we try to use memcpy to make it a bounce buffer. We use /dev/mem to map this also into userspace, and I've timed memcpy as being around 70MB/sec.

Based on a fair amount of searching on this topic, it appears that although half the people out there want to use ioremap like this (which is probably where we got the idea from), ioremap is not supposed to be used for this purpose and that there are DMA-related APIs that should be used instead. Unfortunately, it appears that DMA buffer allocation is totally dynamic, and I haven't figured out how to tell it, "here's a physical address already allocated -- use that."

One document I looked at is this one, but it's way too x86 and PC-centric: https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt

And this question also comes up at the top of my searches, but there's no real answer: get the physical address of a buffer under Linux

Looking at the standard calls, dma_set_mask_and_coherent and family won't take a pre-defined address and wants a device structure for PCI. I don't have such a structure, because this is an ARM SoC without PCI. I could manually populate such a structure, but that smells to me like abusing the API, not using it as intended.

BTW: This is a ring buffer, where we DMA data blocks into different offsets, but we align to cache line boundaries, so there is no risk of false sharing.

Thank you a million for any help you can provide!

UPDATE: It appears that there's no such thing as a cacheable DMA buffer on ARM if you do it the normal way. Maybe if I don't make the ioremap call, the region won't be marked as uncacheable, but then I have to figure out how to do cache management on ARM, which I can't figure out. One of the problems is that memcpy in userspace appears to really suck. Is there a memcpy implementation that's optimized for uncached memory I can use? Maybe I could write one. I have to figure out if this processor has Neon.

0 投票
1 回答
13885 浏览

linux-kernel - 了解 U-Boot 内存占用

我不明白加载 U-Boot 时 RAM 中发生了什么。我正在开发 Xilinx Zynq ZC702 评估套件,并尝试使用 U-Boot 在其上加载 Linux 内核。于是我使用 Xilinx 工具 Vivado 和 SDK 生成了一个 BOOT.bin 文件,一步步写在 SD 卡上:

  • 使用 Vivado 创建一个硬件项目,
  • 使用 SDK 生成 FSBL 和 FPGA 比特流,
  • 创建一个包含 FSBL + 比特流 + U-Boot 的引导映像(我从 xilinx Git 存储库下载了 U-Boot 源)。

简而言之,我遵循了赛灵思用户指南中描述的所有步骤。

但是现在,在加载内核之前,我想了解发生了什么,但我做不到。根据文档,U-Boot 如果从闪存加载,会将自身复制到 RAM 中,并从那里执行自身,但是在哪里?

我在网上搜索,发现 U-Boot 提取自身的地址是由CONFIG_SYS_TEXT_BASE在include/configs/zynq-common.h中定义的,似乎是 0x400_0000。

但在另一个网站上我看到我们可以在调试模式下打印重定位地址,所以我修改了文件common/board_r.c并重写了函数“ init_announce ”来打印“ gd->relocaddr ”字段。这次似乎 U-Boot 使用了偏移地址 0x3FF3_7000。

当我使用 U-Boot 命令“md”检查内存时,我看到使用了两个偏移量,并且在两个位置都看到了一种幻数“be00_00ea”:

为什么 U-Boot 需要这两个偏移量?U-Boot 的真正内存占用是多少?更一般地说,我可以将内核放在哪里以确保它不会覆盖某些内容?

0 投票
1 回答
36 浏览

networking - 以确定的方式连接 Zynq 板

我正在尝试使用 Zynq-7010 板创建一个集群以用于实时应用程序。其中一个将是主控,它将控制八个客户端板。主板也会从客户那里收集数据。我尝试使用 100Mbit 以太网连接来连接节点,但它没有我需要的那么快。此外,由于 switch 的不确定性行为,它不是确定性的。你能给我一些关于如何以快速和确定的方式连接它们的想法吗?

0 投票
1 回答
1187 浏览

fpga - Zynq7 / Zedboard:Xil_in32 在从 DRAM 读取时改变数据

我在 PL (FPGA) 中有一个具有以下设置的 Zedboard:

自定义 AXI(全)主 -> 互连 -> Zynq_PS(HP0 从端口)

  • 自定义 AXI 主机产生数据(简单计数器,写入 DRAM,从 0x00000000 开始)。
  • 数据写入 DRAM(根据 XMD 控制台 -> mrd 0x00000000 10)
  • 当 PS 想要读取数据时(main.c -> 调用“Xil_in32(0x00000000)”),数据被改变了!!!

问题:在某些情况下调用函数 Xil_in32(用于从 DRAM 读取数据)是否会改变数据本身?(何时以及为什么?)

除非调用 Xil_in32,否则数据不会更改。这可以通过在从 main.c 调用 Xil_in32 之前从 XMD 控制台读取数据来证明

C代码:

XMD 读取数据:这显示了我停止读取内存的位置,然后计数器继续: