我已将代码分为三部分。第一部分包含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行:由于先前的错误而忽略了单位。
答案 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。