axiongxida 2018-06-09 09:06 采纳率: 0%
浏览 609
已结题

在设计FIR滤波器设计时,采用全并行方式,求和后发现结果为0,请问问题在哪?多谢!

仿真结果

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;

entity FIRParallel is
    port(
        rst:in std_logic;
        clk:in std_logic;
        Xin:in std_logic_vector(11 downto 0);
        Yout:out std_logic_vector(28 downto 0)
        );
end FIRParallel;

architecture arch_FIRParallel of FIRParallel is
    component mult
        PORT (
            clk : IN STD_LOGIC;
            a : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
            b : IN STD_LOGIC_VECTOR(12 DOWNTO 0);
            p : OUT STD_LOGIC_VECTOR(24 DOWNTO 0)
        );
    end component;

    component AddSub 
        port(
            a : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
            b : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
            clk : IN STD_LOGIC;
            s : OUT STD_LOGIC_VECTOR(12 DOWNTO 0)
        );
    end component;

    component filter_adder
        port(
            a : IN STD_LOGIC_VECTOR(28 DOWNTO 0);
            b : IN STD_LOGIC_VECTOR(24 DOWNTO 0);
            clk : IN STD_LOGIC;
            s : OUT STD_LOGIC_VECTOR(28 DOWNTO 0)
        );
    end component;

    type add_res is array(7 downto 0) of std_logic_vector(12 downto 0);
    signal add_reg:add_res;

    type mult_regs is array(7 downto 0) of std_logic_vector(24 downto 0);
    signal mult_reg:mult_regs;

    type xin_regs is array(15 downto 0) of std_logic_vector(11 downto 0);
    signal xin_reg:xin_regs;

    signal sum0:std_logic_vector(28 downto 0):=(others=>'0');
    signal sum1:std_logic_vector(28 downto 0);
    signal sum2:std_logic_vector(28 downto 0);
    signal sum3:std_logic_vector(28 downto 0);
    signal sum4:std_logic_vector(28 downto 0);
    signal sum5:std_logic_vector(28 downto 0);
    signal sum6:std_logic_vector(28 downto 0);
    signal sum7:std_logic_vector(28 downto 0);
    signal sum8:std_logic_vector(28 downto 0);

    --Coeffections
    constant co0:std_logic_vector(11 downto 0):= X"000";
    constant co1:std_logic_vector(11 downto 0):= X"FFD";
    constant co2:std_logic_vector(11 downto 0):= X"00F";
    constant co3:std_logic_vector(11 downto 0):= X"02E";
    constant co4:std_logic_vector(11 downto 0):= X"F8B";
    constant co5:std_logic_vector(11 downto 0):= X"EF9";
    constant co6:std_logic_vector(11 downto 0):= X"24E";
    constant co7:std_logic_vector(11 downto 0):= X"7FF";

begin
    adder0:AddSub port map (
                    a => xin_reg(0),
                    b => xin_reg(15),
                    clk => clk,
                    s => add_reg(0));

    adder1:AddSub port map (
                    a => xin_reg(1),
                    b => xin_reg(14),
                    clk => clk,
                    s => add_reg(1));

    adder2:AddSub port map (
                    a => xin_reg(2),
                    b => xin_reg(13),
                    clk => clk,
                    s => add_reg(2));

    adder3:AddSub port map (
                    a => xin_reg(3),
                    b => xin_reg(12),
                    clk => clk,
                    s => add_reg(3));

    adder4:AddSub port map (
                    a => xin_reg(4),
                    b => xin_reg(11),
                    clk => clk,
                    s => add_reg(4));

    adder5:AddSub port map (
                    a => xin_reg(5),
                    b => xin_reg(10),
                    clk => clk,
                    s => add_reg(5));

    adder6:AddSub port map (
                    a => xin_reg(6),
                    b => xin_reg(9),
                    clk => clk,
                    s => add_reg(6));

    adder7:AddSub port map (
                    a => xin_reg(7),
                    b => xin_reg(8),
                    clk => clk,
                    s => add_reg(7));

    mult_u0:mult port map (
                    clk=>clk,
                    a=>co0,
                    b=>add_reg(0),
                    p=>mult_reg(0));

    mult_u1:mult port map (
                    clk=>clk,
                    a=>co1,
                    b=>add_reg(1),
                    p=>mult_reg(1));

    mult_u2:mult port map (
                    clk=>clk,
                    a=>co2,
                    b=>add_reg(2),
                    p=>mult_reg(2));

    mult_u3:mult port map (
                    clk=>clk,
                    a=>co3,
                    b=>add_reg(3),
                    p=>mult_reg(3));

    mult_u4:mult port map (
                    clk=>clk,
                    a=>co4,
                    b=>add_reg(4),
                    p=>mult_reg(4));

    mult_u5:mult port map (
                    clk=>clk,
                    a=>co5,
                    b=>add_reg(5),
                    p=>mult_reg(5));

    mult_u6:mult port map (
                    clk=>clk,
                    a=>co6,
                    b=>add_reg(6),
                    p=>mult_reg(6));

    mult_u7:mult port map (
                    clk=>clk,
                    a=>co7,
                    b=>add_reg(7),
                    p=>mult_reg(7));

    filter_adder_u0:filter_adder port map (
                    a => sum0,
                    b => mult_reg(0),
                    clk => clk,
                    s => sum1);

    filter_adder_u1:filter_adder port map (
                    a => sum1,
                    b => mult_reg(1),
                    clk => clk,
                    s => sum2);

    filter_adder_u2:filter_adder port map (
                    a => sum2,
                    b => mult_reg(2),
                    clk => clk,
                    s => sum3);

    filter_adder_u3:filter_adder port map (
                    a => sum3,
                    b => mult_reg(3),
                    clk => clk,
                    s => sum4);

    filter_adder_u4:filter_adder port map (
                    a => sum4,
                    b => mult_reg(4),
                    clk => clk,
                    s => sum5);

    filter_adder_u5:filter_adder port map (
                    a => sum5,
                    b => mult_reg(5),
                    clk => clk,
                    s => sum6);

    filter_adder_u6:filter_adder port map (
                    a => sum6,
                    b => mult_reg(6),
                    clk => clk,
                    s => sum7);

    filter_adder_u7:filter_adder port map (
                    a => sum7,
                    b => mult_reg(7),
                    clk => clk,
                    s => sum8);

    Yout <= sum8;

    PXin:process(rst,clk)
    begin
        if rst = '1' then
            for i in 0 to 15 loop
                xin_reg(i) <= (others=>'0');
            end loop;
        elsif rising_edge(clk) then
            for i in 0 to 14 loop
                xin_reg(i+1) <= xin_reg(i);
            end loop;
            xin_reg(0) <= Xin;
        end if;
    end process PXin;
end arch_FIRParallel;
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-06-10 03:14
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型