如何在VHDL中创建一个从整数转换为std_logic向量的函数?

时间:2016-02-21 02:17:40

标签: vhdl

我正在寻求帮助,因为我正在学习这种语言结构。

这就是我所拥有的:

function int_slv(val,width: integer) return std_logic_vector is
variable R: std_logic_vector(0 to width-1):=(others=>'0')
variable b:integer:= width;

begin 
   if (b>32) then
      b=32;
   else
      assert 2**bits >val report
      "value too big for std_logic_vector"
      severity warning
   end if;

for i in 0 to b-1 loop
 if val ((val/(2**i)) MOD 2 = 1) then
      R(i)='1';
 end if;
end loop;

return(R);
end int_slv;

2 个答案:

答案 0 :(得分:1)

除了5个语法错误,一个错误的标识符和一个模数减少表达式表示为数组的元素以及几组冗余括号,修改后的代码:

library ieee;
use ieee.std_logic_1164.all;

package int2bv_pkg is
    function int_slv (val, width: integer) return std_logic_vector;
end package;
package body int2bv_pkg is
    function int_slv (val, width: integer) return std_logic_vector is
        variable R: std_logic_vector(0 to width-1):=(others=>'0'); -- added ';'
        variable b:integer:= width;
    begin  
        if b > 32 then
            b := 32;   -- ":=" is used for  variable assignment 
        else
            assert 2 ** width > val report  -- width not bits
            "value too big for std_logic_vector"
            severity warning; -- missing semicolon at the end of assertion
        end if;

        for i in 0 to b - 1 loop
            if val/2 ** i MOD 2 = 1 then -- not val (...)
                R(i) := '1';  -- ":=" variable assign.
            end if;
        end loop;
        return R;  -- parentheses not needed
    end int_slv;
end package body int2bv_pkg;

分析(编译)。取幂运算符" **"是最高优先级,划分运营商" /"和" mod"具有相同的优先级并按其找到的顺序执行(从左到右)。它可能值得学习VHDL运算符优先级。

您正在使用" ="你应该使用":="进行变量赋值在两个地方,你错过了两个分号并使用了标识符位(在你的函数中没有声明),显然你的意思是宽度。

修改后的示例进行了分析,并且没有在问题中没有最小,完整和可验证的示例的情况下进行测试。

请注意,包体是一个设计单元,包装声明也是如此。在其他设计单元中还有其他各种地方可以引入功能体。

您还可以注意到2 ** 31超出了VHDL中整数的保证范围,等于2147483648,而INTEGER值范围至少保证在-2147483647到+2147483647之间。

这意味着,如果您使用的是从等于2 ** 31的表达式派生的值,您可能会在执行期间(在详细说明或模拟期间)产生范围错误。

这几乎说明你需要一个具有更大INTEGER值范围的VHDL实现,或者你需要重新考虑你正在做的事情。

当然,库IEEE中的包numeric_std中有整数到无符号和整数到有符号的函数。 这样的结果可以是类型转换为std_logic_vector,源代码可以很好地学习如何解决VHDL强加的限制。这些to_signed或to_unsigned函数能够处理INTEGER可以容纳的最大值,并指定结果数组类型的长度,同时为数组长度大于INTEGER的二进制值提供零或符号填充。该实用程序也扩展到使用长度进行裁剪。

VHDL -2008包numeric_std_unsigned包含一个函数To_StdLogicVector,它执行int_slv函数要执行的操作,但仅限于整数类型输入的NATURAL范围。

答案 1 :(得分:0)

正如@ user1155120已经指出的那样,VHDL-2008包$i有一个内置的to_stdlogicvector。并且@ user1155120已经指出numeric_std_unsigned中的to_signedto_unsigned也可以使用。

因此,要扩展上一个答案,您可以这样做:

numeric_std

此机制将接受constant C : integer := -6817563; constant C_VEC : std_logic_vector(31 downto 0) := std_logic_vector(to_signed(c, 32)); 的全部范围。您也可以使用integer,但这仅限于to_unsigned

的范围