Vhdl 写入avalon从属模块时出现问题
我正在从事一个辅助项目,我需要能够将数据写入avalon从属模块,以便从DE0板上运行的nios系统上的两个不同输入中选择数据。经过大量的工作,我无法将运行在nios内核上的C应用程序中的数据写入avalon从机。我已经通过使用一些硬编码值验证了我能够从从从机读取数据。我还验证了我的应用程序正在运行,因为我在jtag uart上看到了我期望的消息,并且按钮、LED和LED显示屏工作正常 我简化了我的从机,这样我写入它的数据就可以直接读回来。VHDL代码为:Vhdl 写入avalon从属模块时出现问题,vhdl,fpga,intel-fpga,nios,Vhdl,Fpga,Intel Fpga,Nios,我正在从事一个辅助项目,我需要能够将数据写入avalon从属模块,以便从DE0板上运行的nios系统上的两个不同输入中选择数据。经过大量的工作,我无法将运行在nios内核上的C应用程序中的数据写入avalon从机。我已经通过使用一些硬编码值验证了我能够从从从机读取数据。我还验证了我的应用程序正在运行,因为我在jtag uart上看到了我期望的消息,并且按钮、LED和LED显示屏工作正常 我简化了我的从机,这样我写入它的数据就可以直接读回来。VHDL代码为: library ieee; use i
library ieee;
use ieee.std_logic_1164.all;
USE IEEE.NUMERIC_STD.ALL;
entity FIFO_Control is
port (clk : IN std_logic;
reset : IN std_logic;
read : IN std_logic;
readdata : OUT std_logic_vector(7 DOWNTO 0);
write : IN std_logic;
writedata : IN std_logic_vector(7 DOWNTO 0);
din1 : in std_logic_vector(4 DOWNTO 0);
din2 : in std_logic_vector(4 DOWNTO 0)
);
end FIFO_Control;
architecture FIFO_CTRL of FIFO_Control is
signal int_data : std_logic_vector(7 DOWNTO 0) := "00000000"; -- a hard coded test value to check the read works
begin
with (write) SELECT
int_data <= writedata when '1',
"01010101" when others;
readdata <= int_data;
end FIFO_CTRL;
C代码是
#include "sys/alt_stdio.h"
#include <altera_avalon_timer_regs.h>
#include <altera_avalon_pio_regs.h>
#include <system.h>
#include "Sch51.h"
#include "serial.h"
#include "seven_seg.h"
#define SEVEN_SEGMENT_0_BASE 0x1001080
#define LED_BASE (0x01001070)
#define LED0_pin (0x01)
#define LED1_pin (0x01 << 1)
#define LED2_pin (0x01 << 2)
#define LED3_pin (0x01 << 3)
#define PIO_1_BASE 0x0
#define BUTTON_BASE PIO_1_BASE
#define BUTTON0 0x01
#define BUTTON1 0x02
#define FIFO_CTRL_0_BASE 0x1001090
void LED_Flash_Update(void)
{
static count = 0;
alt_u8 read;
IOWR_8DIRECT(FIFO_CTRL_0_BASE, 0, 0);
read = IORD_8DIRECT(FIFO_CTRL_0_BASE, 0);
Serial_Printf("FIFO1: %d\r\n", read);
IOWR_8DIRECT(FIFO_CTRL_0_BASE, 0, 1);
read = IORD_8DIRECT(FIFO_CTRL_0_BASE, 0);
Serial_Printf("FIFO1: %d\r\n", read);
// Change the LED from OFF to ON (or vice versa)
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,
IORD_ALTERA_AVALON_PIO_DATA(LED_BASE) ^ LED3_pin);
if (count < 10)
{
count++;
}
else if ((count >= 10) && (count < 100))
{
count += 10;
}
else if ((count >= 100) && (count < 1000))
{
count += 100;
}
else if ((count >= 1000) && (count < 10000))
{
count += 1000;
}
else
{
count = 0;
}
seven_seg_store_number(SEVEN_SEGMENT_0_BASE, 0, 9999, 10, count);
if ((IORD_ALTERA_AVALON_PIO_DATA(BUTTON_BASE) & BUTTON0) == 0)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,
IORD_ALTERA_AVALON_PIO_DATA(LED_BASE) | LED0_pin);
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,
IORD_ALTERA_AVALON_PIO_DATA(LED_BASE) & ~LED0_pin);
}
if ((IORD_ALTERA_AVALON_PIO_DATA(BUTTON_BASE) & BUTTON1) == 0)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,
IORD_ALTERA_AVALON_PIO_DATA(LED_BASE) | LED1_pin);
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,
IORD_ALTERA_AVALON_PIO_DATA(LED_BASE) & ~LED1_pin);
}
}
int alt_main()
{
alt_u8 read;
SCH_Init_T0();
serial_Init();
SCH_Add_Task(serial_Update, 0, 10);
SCH_Add_Task(LED_Flash_Update, 0, 1000);
// Start the scheduler
SCH_Start();
Serial_Puts("EHMC AJE System Running\n");
/* Event loop never exits. */
while (1)
{
SCH_Dispatch_Tasks();
}
return 0;
}
我不明白为什么我不能向avalon slave Fifo_控件写入任何内容。有人能提出问题所在吗?如果您查看实体/组件上的端口声明,然后查看代码,您已经可以看到您做错了什么,因为您没有使用所有端口 因此,您的问题表明您希望将数据写入Avalon从机。因此,您希望组件记住您编写的数据,即内存。但是代码中没有内存组件。只有一个组合表达式 设计Avalon组件时,应阅读 因此,在阅读文档时,您会看到,您应该有一个用于写入端口的进程/语句和一个用于读取端口的进程。如果读取延迟为1,则每个处理都需要一个时钟周期。例如
write_proc: process(clk) begin
if rising_edge(clk) then
if write = '1' then
int_data <= writedata;
end if;
-- reset statement
if reset = '1' then
int_data <= (others => '0');
end if;
end if;
end process;
read_proc: process(clk) begin
if rising_edge(clk) then
if read = '1' then
readdata <= int_data;
end if;
-- reset statement
if reset = '1' then
readdata <= (others => '0');
end if;
end if;
end process;
什么是读写输入?它们能控制频闪吗?你知道它们是如何工作的吗?先画一张时间图。您的代码似乎没有做任何有用的事情—它只是在write为1时将writedata路由回readdata,这几乎肯定不是您想要的。请不要在VHDL问题中使用C代码。@EML C代码端对于这些类型的接口Avalon、AXi、wishbone非常重要,所以我不同意你最后的说法。你好,JHBonarius谢谢你的回答和见解,你的回答非常清楚,非常有帮助。我知道你有一个工作界面。谢谢你对C代码的回复。我也发布了,因为我不确定我的问题到底出在哪里。所以我发布了VHDL和C,以便可以看到接口的两面。