正在使用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
答案 0 :(得分: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;
答案 1 :(得分: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;