- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
首先是关于这个问题的一些背景故事。在我当前的项目中,我正在尝试创建一个使用 FPGA 优化的 Mandelbrot 计算器。在这一点上,我试图在 nios 处理器和 FPGA 之间建立一座桥梁(遗憾的是一直没有运气)。
我正在尝试使用 Avalon 总线了解 nios 和 FPGA(运行 VHDL)之间的通信。我已经使用 VHDL 超过 15 周了,过去 5 周开始使用 nios 2 处理器。现在我想要完成的事情如下: 因此,我想创建一个设置,在该设置上我可以测试发送两次 64 位值,在 VHDL 中记住这个值,然后他们尝试读取它,以便它返回到 Nios 2 处理器(C 代码)。
当然,在尝试自己解决这个问题之前,我并没有把这个问题放在这里。这是我迄今为止所做的工作。
在 nios 上,我在 main 中创建了一个简单的设置,它将两个 64 位值写入 FPGA,然后检索它们并在红色和绿色 LED 上显示输出,顺便说一句:我在 Altera DE2 板上运行它。 C代码看起来像这样
int main (void)
{
//Reset the green and red leds to off
IOWR(REDLEDS_BASE, 0, 0x0);
IOWR(GREENLEDS_BASE, 0, 0x0);
//Write the 64 bit x coordinate
IOWR(MANDELBROT_CORE_BASE, 0x0, 0xAAAAAAAA);
IOWR(MANDELBROT_CORE_BASE, 0x4, 0xAAAAAAAA);
//Write the 64 bit y coordinate
IOWR(MANDELBROT_CORE_BASE, 0x8, 0xEEEEEEEE);
IOWR(MANDELBROT_CORE_BASE, 0x12, 0xEEEEEEEE);
//Read the 64 bit x coordinate
double x = IORD(MANDELBROT_CORE_BASE, 0);
//Read the 64 bit y coordinate
double y = IORD(MANDELBROT_CORE_BASE, 8);
//Write the values to the leds
IOWR(REDLEDS_BASE, 0, x);
IOWR(GREENLEDS_BASE, 0, y);
while(bRunning == true)
{
}
return 1;
}
我知道这个代码可能不正确,因为 IQRD 只能检索 32 位值。但我无法找到一次性读取 64 位地址的解决方案。我从 this question 中获得了有关如何执行此操作的大部分技术。 .所以我不知道这是否正确。
其次是用 VHDL 编写的 FPGA 端。该组件是一个 64 位组件,它在 QSYS 中与 nios 的 avalon 总线连接。应该处理传入和传出请求的组件是 avalon_mandelbrot 组件(如下所示)。
entity avalon_mandelbrot is
port (
avs_s0_read : in std_logic := '0'; -- s0.read
avs_s0_readdata : out std_logic_vector(63 downto 0); -- readdata
avs_s0_write : in std_logic := '0'; -- write
avs_s0_writedata : in std_logic_vector(63 downto 0) := (others => '0'); -- writedata
avs_s0_waitrequest : out std_logic; -- waitrequest
avs_s0_address : in std_logic_vector(7 downto 0) := (others => '0'); -- address
avs_s0_byteenable : in std_logic_vector(7 downto 0) ; -- byte enable
clk : in std_logic := '0'; -- clock
reset : in std_logic := '0'; -- reset
);
end entity avalon_mandelbrot;
architecture rtl of avalon_mandelbrot is
begin
process(clk)
variable data_in : std_logic_vector(63 downto 0):= (others => '0');
variable data_temp_x : std_logic_vector(63 downto 0):= (others => '0');
variable data_temp_y : std_logic_vector(63 downto 0):= (others => '0');
begin
if rising_edge(clk) then
if avs_s0_write = '1' then
if avs_s0_byteenable(0) = '1' then
data_in(7 downto 0) := avs_s0_writedata(7 downto 0);
end if;
if avs_s0_byteenable(1) = '1' then
data_in(15 downto 8) := avs_s0_writedata(15 downto 8);
end if;
if avs_s0_byteenable(2) = '1' then
data_in(23 downto 16) := avs_s0_writedata(23 downto 16);
end if;
if avs_s0_byteenable(3) = '1' then
data_in(31 downto 24) := avs_s0_writedata(31 downto 24);
end if;
if avs_s0_byteenable(4) = '1' then
data_in(39 downto 32) := avs_s0_writedata(39 downto 32);
end if;
if avs_s0_byteenable(5) = '1' then
data_in(47 downto 40) := avs_s0_writedata(47 downto 40);
end if;
if avs_s0_byteenable(6) = '1' then
data_in(55 downto 48) := avs_s0_writedata(55 downto 48);
end if;
if avs_s0_byteenable(7) = '1' then
data_in(63 downto 56) := avs_s0_writedata(63 downto 56);
end if;
end if;
--Master wants to write to slave
if avs_s0_write = '1' then
case avs_s0_address is
when "00000000" => -- ADDR 0
data_temp_x(31 downto 0) := data_in(31 downto 0);
when "00000100" => -- ADDR 4
data_temp_x(63 downto 32) := data_in(63 downto 32);
when "00001000" => -- ADDR 8
data_temp_y(31 downto 0) := data_in(31 downto 0);
when "00001100" => -- ADDR 12
data_temp_y(63 downto 32) := data_in(63 downto 32);
end case;
end if;
--Master wants to read from slave
if avs_s0_read = '1' then
case avs_s0_address is
when "00000000" =>
avs_s0_readdata <= data_temp_x;
when "00001000" =>
avs_s0_readdata <= data_temp_y;
when others =>
avs_s0_readdata <= (others => '0');
end case;
end if;
end if;
end process;
end architecture rtl;
在我看来,此设置应该有效是合乎逻辑的,但当我尝试测试整个过程时,它似乎无法正常运行。显然我在这里做错了什么,也许有更多经验的人可以看一下。希望很快有人能够帮助我解决这个问题。
最佳答案
我没有专门与 NIOS 通信,但我使用过 Altera 的 Avalon 总线接口(interface)。
如果您还没有这样做,我会阅读他们的引用资料。 www.altera.com/literature/manual/mnl_avalon_spec.pdf
特别是第 3.5.1 节给出了典型传输的示例。
在你的例子中,你没有指定你正在为这个特定的 Avalon 接口(interface)使用固定的等待状态时间。我不确定这是否可以在 NIOS 上配置,但通常固定等待状态不是 Avalon 总线的默认操作。这意味着您需要使用 avs_s0_waitrequest
信号在读/写完成时向主机 (NIOS) 发出信号。该端口在您的设计中未连接。
在您的情况下,它可能就像在写入操作期间将 avs_s0_waitrequest
连接到 avs_s0_write
一样简单,在读取期间将 avs_s0_read
连接为您的读取延迟为 1。
关于c - 如何使用 avalon 总线将两个 64 位从 nios 传输到 VHDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744843/
我一直在做一些关于测量数据传输延迟的实验 CPU->GPU 和 GPU->CPU。我发现对于特定消息大小,CPU->GPU 数据传输速率几乎是 GPU->CPU 传输速率的两倍。谁能解释我为什么会这样
我将 ElasticSearch 用作我的 Post 模型的 Rails pet 项目应用程序的全文引擎。在我的 posts_controller.rb 索引操作中: def index
概述 流经网络的数据总是具有相同的类型:字节,这些字节如何传输主要取决于我们所说的网络传输。用户并不关心传输的细节,只在乎字节是否被可靠地发送和接收 如果使用 Java 网络编程,你会发现,某些时候当
我正在编写一些代码,以便将共享点从该页面转移到另一个页面: Server.Transfer("/DefectManagement/DefectList/default.aspx") 但是我遇到了这个问
我有这个泄漏,任何猜测?这个类有一些奇怪的引用。我的代码的任何地方都没有 contentobserver In com.example:1.5.0:27. com.example.ui.record
我听说过点对点内存传输并阅读了一些关于它的内容,但无法真正理解与标准 PCI-E 总线传输相比它的速度有多快。 我有一个使用多个 GPU 的 CUDA 应用程序,我可能对 P2P 传输感兴趣。我的问题
ftping 文件时,Transmit 中是否有忽略或过滤器列表?我希望它忽略上传 .svn 文件等。 最佳答案 是的。转到首选项并选择 Rules标签。在那里您可以定义要跳过哪些文件的规则。实际上,
我有以下片段来生成声音,在 while 循环中,我想动态更改它,以便它在声音生成期间创建不同频率的声音。 for(uint16_t i = 0; i < sample_N; i++) { da
我正在尝试使用 Delphi 2010 和 Indy 对 Web 服务进行概念验证。我此时的代码是: procedure TForm1.Log(const sEvent, sMsg: String);
我有一个 ActiveMQ JMS 代理,在端口 61616 上使用默认的 openwire TCP 传输公开。 我有许多远程客户端可以绑定(bind)到此代理来监听他们的消息。 如果我想打开 kee
reconnection strategies文档仅使用 JMS 示例,但是 FTP transport documentation确实说明了重新连接策略的使用,但没有任何细节或示例。 进一步,如果你
我有 2 个 TreeView,第一个填充有项目。 try { CheckBoxTreeItem treeRoot = new CheckBoxTreeItem("Root"); tr
在我为学校开发的一个网站上,用户输入他们的学校电子邮件和密码,如果他们已注册,则登录。如果没有,则会显示登录的第二部分,要求输入笔名称并确认密码。正因为如此,以及我复杂的业余 Django 编程,我有
我正在开发一个 Web 服务,我们在其中使用 LINQ-to-SQL 进行数据库抽象。当客户使用我们的网络服务时,对象被序列化为 XML,一切都很好。 现在我们希望开发我们自己的使用本地数据类型的客户
我应该创建一个名为“Backwards”的方法,该方法将列表从尾部横向到头部,但是当我运行代码时,它出现说(第 88 行)它找不到光标 = cusor.prev;象征。我需要在循环中再次设置上一个链接
给定像 Uint8Array 这样的类型化数组,似乎有两种方法可以通过 worker 传输它们。 选项 1 直接发送缓冲区并在接收端进行转换: 发件人:postMessage({fooBuffer:
在 PHP + jQuery 环境中,我和我的 friend 无法得出最佳解决方案。我们正在使用 Ajax 从数据库中获取数据。 解决方案 1 - Ajax 应该只传输数据,而不是 HTML 好处:我
大家好,非常感谢您的宝贵时间。 有一个 std::stringstream 需要传输到远程机器。网络库允许我用以下方法构建数据包: CreatePacket( const void * DATA, s
我正在使用 libcurl 通过 FTP 传输二进制文件 (.exe),并将其保存到本地文件。问题是文件传输后,它已被更改,不再是有效的 Win32 应用程序,因此无法运行。这是我的做法: CURL
各位程序员, 当我将它上传到我的 FTP 时,我的网站出现此错误:资源被解释为样式表,但使用 MIME 类型文本/纯文本传输 BlahBlahi
我是一名优秀的程序员,十分优秀!