我的程序是生成一个计算4点fft的代码

时间:2015-04-12 16:49:44

标签: vhdl

我已将代码分为三部分。第一部分包含add,subtract和negate等函数。第二部分是蝴蝶结构。第三部分是fft4。

我发现蝴蝶部分有些错误,请帮忙解决这些问题。

该计划如下。在fft_pkg而不是乘以-j,我使用了否定函数。

我避免乘以1和-j并使用加法和否定函数。

-- Design Name: 
-- Module Name:    butterfly - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
-------------------------------------------------------------
library ieee;
use IEEE.STD_LOGIC_1164.ALL;
library work;
use work.fft_pkg.all;

entity butterfly is 
   port (
      s1,s2 : in  complex;
      stage : in  std_logic;            -- inputs
   -- w :     in  complex               -- phase factor
      g1,g2 : out complex               -- outputs
   );
end butterfly;

architecture Behavioral of butterfly is 

begin 

--butterfly equations.

    if ( stage ='0') then
        g1 <= add(s1,s2);
        g2 <= sub(s1,s2);
    elsif (stage ='1') then
        g1 <= add(s1,negate(s2));
        g2 <= sub(s1,negate(s2));
    end if;

end Behavioral;

--butterfly structure(in it instead of multiplication negate func is used)

library ieee;
use IEEE.STD_LOGIC_1164.ALL;
library work;
use work.fft_pkg.all;

entity butterfly is 
   port (
      s1,s2 : in  complex;
      stage : in  std_logic;           -- inputs
   -- w :     in  complex;             -- phase factor
      g1,g2 :out complex            -- outputs
   );
end butterfly;

architecture Behavioral of butterfly is 

begin 

--butterfly equations.

    if ( stage ='0') then
        g1 <= add(s1,s2);
        g2 <= sub(s1,s2);
    elsif (stage ='1') then
        g1 <= add(s1,negate(s2));
        g2 <= sub(s1,negate(s2));
    end if;
end Behavioral;

library ieee;
use ieee.std_logic_1164.all;
library work;
use work.fft_pkg.all;

entity fft4 is 
    port ( 
        s:     in  comp_array;
        y :    out comp_array
    );
  end fft4;

architecture rtl of fft4 is

    component butterfly is
        port (
            s1,s2 : in  complex;      -- inputs
         -- w :     in  complex;      -- phase factor
            g1,g2 : out complex       -- outputs
        );
   end component;

   signal g1,g2:  comp_array;  -- :=(others=>(0000,0000));
-- signal w:comp_array2 :=(("0000","0001"),("0000","1111"));

begin

 --first stage of butterfly

bf11 : butterfly port map(s(0),s(2),'0',g1(0),g1(1));
bf12 : butterfly port map(s(1),s(3),'0',g1(2),g1(3));

--second stage of butterfly's.

bf21 : butterfly port map(g1(0),g1(2),'0',g2(0),g2(2));
bf22 : butterfly port map(g1(1),g1(3),'1',g2(1),g2(3));
end rtl;

错误是

  

错误:HDLCompiler:806 - &#34; C:\ Users \ RObin \ fftfinal \ butterfly.vhd&#34;第36行:&#34;附近的语法错误&#34;。
  错误:HDLC编译器:806 - &#34; C:\ Users \ RObin \ fftfinal \ butterfly.vhd&#34;第39行:&#34; elsif&#34;附近的语法错误   错误:HDLC编译器:806 - &#34; C:\ Users \ RObin \ fftfinal \ butterfly.vhd&#34;第42行:&#34;附近的语法错误&#34;。
  错误:HDLC编译器:854 - &#34; C:\ Users \ RObin \ fftfinal \ butterfly.vhd&#34;第31行:由于先前的错误而忽略了单位。

1 个答案:

答案 0 :(得分:0)

尝试将if语句放入进程:

architecture behavioral of butterfly is 

begin 

--butterfly equations.
   process (s1, s2)
   begin
        if ( stage ='0') then
            g1 <= add(s1,s2);
            g2 <= sub(s1,s2);
        elsif (stage ='1') then
            g1 <= add(s1,negate(s2));
            g2 <= sub(s1,negate(s2));
        end if;
    end process;
end behavioral;

如果没有软件包fft_pkg或编写代码,就无法验证代码,这似乎需要决定类型complex是什么。

请注意,虽然Nicolas还评论说您可以使用并发条件赋值语句,但所有并发语句都具有等效的流程语句或流程和块语句,这就是VHDL在精心制作后的模拟和合成方式。

您还可以注释掉或删除实体蝴蝶的两个副本之一,以及它的架构行为。如果您需要使用相同接口的两个不同表示,则可以更改连续不同体系结构的体系结构名称。

默认情况下,将使用分析的最后一个。再次分析相同的命名实体和体系结构具有替换第一次出现的效果,同时仍然要求两者都是有效的VHDL。