【发布时间】:2014-02-24 04:13:06
【问题描述】:
我对 VHDL 相当陌生,并试图将两个给定的 C 宏转换为在我的 FPGA 上作为一条指令执行。宏是:
#define m_in_bits(buf, num) (buf) >> (24 - (num)) // buf is uint32_t
#define m_ext_bits(buf, i) ((buf) < (1<<((i)-1)) ? (buf) + (((-1)<<(i)) + 1) : (buf))
而使用宏的C代码是:
m_ext_bits(m_in_bits(buffer, size), size);
我在让m_ext_bits 正确编译时遇到问题。这是我的 VHDL:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity myEntity is
port(
signal buffer: in std_logic_vector(31 downto 0);
signal result: out std_logic_vector(31 downto 0)
);
end entity myEntity;
architecture myArch of myEntity is
signal size : signed (3 downto 0);
begin
size <= signed(buffer(27 downto 24));
result(15 downto 0) <= std_logic_vector(signed(buffer(23 downto 0)) srl (24 - to_integer(size))
+ signed((-1 sll to_integer(size)) + 1)); -- the offending line
end architecture myArch ;
以result(15 downto 0) <= 开头的长行实际上编译时没有错误(实现了m_in_bits 宏)。但是,当我添加以+ 开头的以下行时,会发生错误。我试着玩转 std_logic_vector 和 signed 类型并且错误发生了变化。
表达式类型不明确 - “SIGNED”或“UNSIGNED”是两个可能的匹配项...
无法确定运算符 ""sll"" 的定义 -- 找到 0 个可能的定义...
表达式中的非法签名...
我认为这是正确转换和使用正确类型来完成所需操作的问题。
【问题讨论】:
-
这应该迁移到electronics.stackexchange.com。您会在那里找到更多的 VHDL 专家。
-
@DoxyLover - 注意标签vhdl?