我需要通过avalon内存映射接口向HPS获取count_x
32位数据。第一和第二个案件工作得很好。我得到了HPS的数据。但在第3个案例中WHEN '2' => avs_s0_readdata <= count_x(31 downto 0);
显示错误,因为''2'未声明,这是什么意思? Vhdl在Altera quartus 16.1中完成,HPS系统在Qsys中完成。
architecture behavior of encorder is
signal count : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal count_x : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal count_y : STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
begin
PROCESS(avs_s0_read)
BEGIN
IF avs_s0_read = '1' THEN
CASE(avs_s0_address) IS
WHEN '2' => avs_s0_readdata <= count_x(31 downto 0);
WHEN others => avs_s0_readdata <= x"00000000";
END CASE;
ELSE
avs_s0_readdata <= x"00000000";
END IF;
END PROCESS;`
答案 0 :(得分:1)
avs_s0_address的类型为STD_LOGIC。这种类型不包括'2'作为可能的值,这就是为什么它说它没有被声明。 STD_LOGIC通常用于仅描述一位的两个逻辑值,其中“0”和“1”您可以找到所有选项,例如here
由于我不使用Avalon(我使用Xilinx FPGA),我不确切知道它是如何工作的,但你的地址总线似乎有点长。此输入的类型应该是std_logic_vector,因此您有多个地址总线位。然后,您可以添加整数类型的信号:
signal avs_s0_address_int : integer;
在架构体中,您可以添加如下行:
avs_s0_address_int <= to_integer(unsigned(avs_s0_address));
要在整数类型中使用地址值,这在case语句中更容易比较。