2014-10-26 211 views
2

我面临这个问题,我被要求在VHDL中实现一个函数,它接受一个整数并返回一个bit_vector,假设这个整数由4位表示。VHDL编码..从整数转换为bit_vector

我不想使用已经内置的函数,我必须编写函数。

我做了一个函数来从bit_vector转换为整数,是还挺容易的,但我在这里坚持:S

任何想法我怎么能做到这一点?

回答

2

的VHDL标准封装是用于家庭酿造功能很好的启示,并且numeric_bit包定义为natural类型的转换to_unsigned功能unsigned类型,这是函数VHDL实际上使用用于转化为bit_vector。功能是这样实现的:

function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED is 
    variable RESULT: UNSIGNED(SIZE-1 downto 0); 
    variable I_VAL: NATURAL := ARG; 
begin 
    if (SIZE < 1) then return NAU; 
    end if; 
    for I in 0 to RESULT'LEFT loop 
    if (I_VAL mod 2) = 0 then 
     RESULT(I) := '0'; 
    else 
     RESULT(I) := '1'; 
    end if; 
    I_VAL := I_VAL/2; 
    end loop; 
    if not(I_VAL =0) then 
    assert NO_WARNING 
     report "NUMERIC_BIT.TO_UNSIGNED: vector truncated" 
     severity WARNING; 
    end if; 
    return RESULT; 
end TO_UNSIGNED; 

初始if (SIZE < 1)和最终if not(I_VAL =0)检查可以被移除,如果已知该函数从未使用与值,使支票相关的。

这留下了for I in 0 to RESULT'LEFT loop,每次迭代创建一个结果位。

基于Brian的回答,不断LUT可以使用TO_UNSIGNED功能,避免了手写文字进行初始化:

function to_bv(n, size : natural) return bit_vector is 

    type bv_arr_t is array (0 to 2 ** size - 1) of bit_vector(size - 1 downto 0); 

    function bv_arr_init(size : natural) return bv_arr_t is 
    variable res_v : bv_arr_t; 
    begin 
    for i in 0 to 2 ** size - 1 loop 
     res_v(i) := bit_vector(TO_UNSIGNED(i, size)); 
    end loop; 
    return res_v; 
    end function; 

    constant LUT : bv_arr_t := bv_arr_init(size); 

begin 
    return LUT(n); 
end to_bv; 
+0

你的回答确实帮了我很多,非常感谢你的朋友,但你能告诉我你是如何从ise库中得到这段代码吗? – 2014-10-27 21:27:20

+0

从函数初始化LUT也是非常有用的技巧。我的观点是,在这种情况下,显式文字可能更简单,工作也更少! – 2014-10-27 21:34:34

+0

@MSherin:包的源文件可以在[VHDL补充材料](http://standards.ieee.org/downloads/1076/1076.2-1996/)中找到 – 2014-10-28 19:18:16

3

莫滕的是正确的答案,但它有时是值得的开放替代方法..

由于问题涉及一个小的(4位)范围,所以查找表变得很有吸引力:我假设了无符号整数,但它很容易适应。

subtype bv4 is bit_vector(3 downto 0); 
constant LUT : array(0 to 15) of bv4 := (
    "0000", "0001", "0010", "0011", "0100, "0101", "0110", "0111", 
    "1000", "1001", "1010", "1011", "1100, "1101", "1110", "1111"); 

function to_bv(n : natural) return bit_vector is 
begin 
    return LUT(n); 
end to_bv; 

这将正常合成,因为你会希望,而不是实际上创建一个ROM!

+0

是的,这一个是正确的,我试过了,但它当它超过4位时不是很有用,但是感谢配合:) – 2014-10-27 21:25:27