0

我正在使用 VHDL 进行离散余弦变换。我正在尝试将 VHDL 代码从整数转换为标准逻辑向量。我应用了一些我在网上和教科书中阅读的技术,但没有奏效。下面是我尝试转换的代码。我希望输入长度为 8 位,输出长度为 12 位。谢谢。

entity dct is
    port (
            Clk :           in BIT;
            Start :         in BIT;
            Din :           in INTEGER;
            Done :          out BIT;
            Dout :          out INTEGER
            );
end dct;    

architecture behavioral of dct is
begin
    process
            type RF is array ( 0 to 7, 0 to 7 ) of INTEGER;

            variable i, j, k        : INTEGER;
            variable InBlock        : RF;
            variable COSBlock       : RF;
            variable TempBlock      : RF;
            variable OutBlock       : RF;
            variable A, B, P, Sum   : INTEGER;

    begin

这是我在阅读了一些书后尝试过的,但我一直在出错。

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


entity dct is
    port (
            Clk :           in std_logic;
            Start :         in std_logic;
            Din_temp:       in INTEGER;
            temp := conv_std_logic_vector(Din_temp, 8);
            Done :          out std_logic;
            Dout_temp:     out INTEGER;
            temp := conv_std_logic_vector(Dout_temp, 9));

end dct;

architecture behavioral of dct is
begin
    process
            type  RF is matrix( 0 to 7, 0 to 7 ) of  ;

            variable i, j, k        : std_logic_vector(7 downto 0);
            variable InBlock        : RF;
            variable COSBlock       : RF;
            variable TempBlock      : RF;
            variable OutBlock       : RF;
            variable A, B, P, Sum   : std_logic_vector(7 downto 0);

    begin
4

2 回答 2

0

整数是完全可合成的,并且作为端口工作得很好,所以如果你拥有的模块工作令人满意,并且合成正确,那就别管它了。

使用范围整数是一种很好的做法:例如,如果 Din、Dout 表示 0 到 255 范围内的值,则为它们创建新的整数类型或子类型:

type Int_8 is new Integer range 0 to 255; -- or
subtype Int_8 is Integer range 0 to 255; 

(不同之处在于子类型可以与其他整数自由混合,但不小心将新类型与整数混合会被编译器标记为错误)。

这样做的好处是综合不会尝试创建仅需要 8(或 3 或 19)位的 32 位数学单元。通常它会这样做,然后稍后修剪多余的位,因此它不会花费更多的门,它只是用“修剪冗余逻辑”消息淹没报告文件......

但是我猜您遇到的问题是将这个核心与设计的其他部分连接起来,以不太开明的方式实现,这些部分具有 std_logic_vector 端口。

然后你可以实现一个包装器来使这个 DCT 核心适应 std_logic_vector 环境。我对不同的端口信号使用了不同的技术:端口映射中的转换更简洁,但有些工具在处理它们时存在问题(错误)。所以我使用内部信号作为 Start 和 Dout 的适配器,来展示如何解决这些问题。实际上,选择一个或另一个!

    library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.numeric_std.all;

    entity std_lv_dct is
        port (
                Clk :           in  std_logic;
                Start :         in  std_logic;
                Din :           in  std_logic_vector(7 downto 0);
                Done :          out std_logic;
                Dout :          out std_logic_vector(11 downto 0);
                );
    end std_lv_dct;    

    architecture wrapper of std_lv_dct is
       Dout_int  : integer range 0 to 4095;
       Start_int : bit;
    begin

    -- internal signals as type adapters
    Dout      <= std_logic_vector(to_unsigned(Dout_int),11);
    Start_int <= to_bit(Start);

    -- direct entity instantiation for the real core
    Transform : entity work.dct
        port map(
                Clk   => to_bit(Clk),
                Start => Start_int,
                Din   => to_integer(unsigned(Din)),
                std_logic(Done) => Done,
                Dout => Dout_int
                );

    end architecture wrapper;
于 2013-04-30T11:59:10.637 回答
0

似乎您将实体声明与信号分配结合在一起;这不是这样的!保持实体原样并在架构中使用类型转换功能。下面的示例显示了 Din 和 Dout:

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

entity dct is
port (
        Clk :           in BIT;
        Start :         in BIT;
        Din :           in INTEGER;
        Done :          out BIT;
        Dout :          out INTEGER
        );
end dct;    

architecture behavioral of dct is
    signal temp_din: std_logic_vector(7 downto 0);
    signal temp_dout: std_logic_vector(11 downto 0);

begin

    temp_din<=std_logic_Vector(to_unsigned(Din,8));
    Dout<=to_integer(unsigned(temp_dout));
    ...

当然,您也可以在实体中直接使用 std_logic_vector:

entity dct is
port (
        Clk :           in BIT;
        Start :         in BIT;
        Din :           in std_logic_Vector(7 downto 0);
        Done :          out BIT;
        Dout :          out std_logic_vector(11 downto 0)
        );
end dct;    
于 2013-04-29T14:30:04.277 回答