gpt4 book ai didi

vhdl - 写入 avalon 从模块的问题

转载 作者:行者123 更新时间:2023-12-05 06:38:34 25 4
gpt4 key购买 nike

我正在为一个评估项目工作,我需要能够将数据写入 avalon 从属模块,以便从运行在 DE0 板上的 nios 系统上的 2 个不同输入中选择数据。经过多番努力,我一直无法将数据从运行在 nios 核心上的 C 应用程序写入 avalon slave。我已经验证我能够通过使用一些硬编码值从从站读取数据。我还验证了我的应用程序正在运行,因为我在 jtag uart 上看到了我期望的消息,并且按钮、LED 和 LED 显示屏按预期工作。

我已经简化了我的奴隶,这样我写入的数据就可以直接读回。 VHDL代码为:

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_control”写入任何内容。有人可以提出问题所在吗?

最佳答案

如果您查看实体/组件上的端口声明,然后查看您的代码,您已经可以看出您做错了什么,因为您没有使用所有端口。

所以你的问题表明你想将数据写入你的 Avalon slave。所以你想让组件记住你写的数据(即内存)。但是您的代码中没有内存组件。只有一个组合表达式。

设计 Avalon 组件时,您应该阅读 Avalon Interface Specification .

所以阅读文档,你看到你应该有写端口的过程/语句和读端口的过程。每个都需要一个时钟周期来处理(如果读取延迟为 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;

关于vhdl - 写入 avalon 从模块的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com