1

我仍在尝试习惯 VHDL 的一些怪癖,但我遇到了一些问题。首先,我知道像 rol、ror、ssl、srl 等移位运算符是不可合成的。本实验室的目的是使用黄金模型来检查测试台中同一事物的可综合版本。

现在,该程序的目的是将温度计代码转换为 3 位二进制数。因此,换句话说,温度计代码“00000001”=“001”、“00000011”=“010”、“00000111”=“011”等。我基本上是在尝试从右边数出字符串中 1 的数量向左。不会出现在 1 字符串之间放置“0”的情况,因此向量“00011101”是无效的并且永远不会出现。

我设计了一个不可综合(到目前为止,不可编译)的算法,我无法弄清楚如何开始工作。基本上,这个想法是读取温度计代码,将其右移并增加一个计数器,直到温度计代码等于 0,然后将计数器值分配给 3 位 std_logic_vector。下面是我到目前为止所做的代码。

library ieee;
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all;

entity therm2bin_g is
    port(therm : inout std_logic_vector(6 downto 0); -- thermometer code
         bin : out std_logic_vector(2 downto 0); -- binary code 
         i : integer range 0 to 7);
end therm2bin_g;    

architecture behavioral_g of therm2bin_g is
begin

golden : process(therm)
begin

    while(therm /= "00000000") loop
        therm <= therm srl 1;
        i = i + 1;      
    end loop;

    bin <= std_logic'(to_unsigned(i,3));

end process golden;
behavioral_g;
4

2 回答 2

1

这是一个可合成的版本。while循环被for循环取代。srl是明确实现的:

entity therm2bin_g is
port(therm : inout std_logic_vector(6 downto 0); -- thermometer code
     bin : out std_logic_vector(2 downto 0); -- binary code 
     i : out integer range 0 to 7);
end therm2bin_g;    

architecture behavioral_g of therm2bin_g is
begin

golden : process(therm)
    variable i_internal: integer range 0 to 7;
begin
    i_internal:=0;
    for idx in 0 to therm'length loop
        if therm/="0000000" then
            therm<='0' & therm(therm'left downto 1);
            i_internal := i_internal + 1;     
        end if;
    end loop;

    bin<=std_logic_vector(to_unsigned(i_internal,bin'length));
    i<=i_internal;

end process golden;
end behavioral_g;
于 2013-03-29T06:32:47.857 回答
1

“... rol、ror、ssl、srl 等运算符不可综合...” 谁这么说的?你检查过吗?在哪个合成工具上?它是最近的版本,还是 1990 年代初期的版本?

请注意,某些工具可能不支持它的论点是愚蠢的。一些厨房可能没有烤箱这一事实并不能阻止人们编写蛋糕食谱。

于 2013-03-30T15:31:55.600 回答