КИХ-фильтр Simulink не производит вывод

Я пытаюсь заставить испытательный стенд Verilog для FIR-фильтра, произведенного в Simulink, работать. Компонент VHDL для фильтра создается Simulink и представляет собой перезагружаемый FIR-фильтр с 40 коэффициентами, каждый из которых содержит 16 бит. Я использую ModelSim для запуска всего кода и создания симуляций.

Таким образом, проблема в том, что dout никогда не регистрирует ненулевые значения, что очень обескураживает. Предполагается, что Dout выдает 38-битные выходные фильтрованные данные за каждый такт. Кроме того, в начале RFD имеет высокий уровень только 5 нс, а RDY всегда равен 0. RFD готов для данных и указывает, что ядро ​​готово принять новые данные. RDY готов и указывает, когда был создан новый вывод.

Я застрял на этом этапе и был бы признателен, если бы кто-нибудь знал, как выводить данные, чтобы действительно правильно выводить отфильтрованные данные. Ниже вы можете увидеть Verilog TestBench, в котором создан экземпляр модуля VHDL. Я думаю, что это может быть проблема с тем, как я создаю экземпляр модуля VHDL в тестовом стенде Verilog, но я не могу это проверить.

Любая помощь будет принята с благодарностью!

/*Karl Haebler
This is a testbench for one VHDL FIR filter */

module FIR_filter_verilog_tb_v3();

reg clk_tb;
reg coef_ld_tb;
reg coef_we_tb;
reg signed [15:0] din_tb;
reg signed [15:0] coef_din_tb;

reg signed [15:0] coef_mem[0:39];
reg [6:0] mem_pos;

wire rfd_tb;
wire rdy_tb;
wire signed [37:0] dout_tb;

initial 
begin   //initialize data and generate clock signal
mem_pos= 6'b000000; //6'd0 
din_tb = 0;
clk_tb = 0;
forever 
begin
    #5 clk_tb =~ clk_tb;   //clock period of 10 ns
end
end

initial 
begin //generate load and write signals
coef_we_tb      = 0;    
coef_ld_tb      = 0;
#10 coef_ld_tb  = 1;
#10 coef_ld_tb  = 0;
coef_we_tb      = 1;
end

initial begin

coef_mem[ 0] = 16'b0000010000000000; //0
coef_mem[ 1] = 16'b0000010000000000;
coef_mem[ 2] = 16'b0000010000000000;
coef_mem[ 3] = 16'b0000010000000000;
coef_mem[ 4] = 16'b0000010000000000;
coef_mem[ 5] = 16'b0000010000000000;  //1
coef_mem[ 6] = 16'b0000010000000000;
coef_mem[ 7] = 16'b0000010000000000;
coef_mem[ 8] = 16'b0000010000000000;
coef_mem[ 9] = 16'b0000010000000000;
coef_mem[10] = 16'b0000010000000000;
coef_mem[11] = 16'b1000010000000000;
coef_mem[12] = 16'b1000010000000000;
coef_mem[13] = 16'b1000010000000000;
coef_mem[14] = 16'b1000010000000000;
coef_mem[15] = 16'b0110101010000000; //26.625
coef_mem[16] = 16'b0110101010000000;
coef_mem[17] = 16'b0110101010000000;
coef_mem[18] = 16'b0000010000000000;
coef_mem[19] = 16'b0000010000000000;
coef_mem[20] = 16'b0000010000000000;
coef_mem[21] = 16'b0000010000000000;
coef_mem[22] = 16'b0000010000000000;
coef_mem[23] = 16'b0000010000000000;
coef_mem[24] = 16'b0000010000000000;
coef_mem[25] = 16'b0000010000000000;
coef_mem[26] = 16'b0000010000000000;
coef_mem[27] = 16'b0000010000000000;
coef_mem[28] = 16'b0000010000000000;
coef_mem[29] = 16'b0000010000000000;
coef_mem[30] = 16'b0000010000000000;
coef_mem[31] = 16'b0000010000000000;
coef_mem[32] = 16'b0000010000000000;
coef_mem[33] = 16'b0000010000000000;
coef_mem[34] = 16'b0000010000000000;
coef_mem[35] = 16'b0000010000000000;
coef_mem[36] = 16'b0000010000000000;
coef_mem[37] = 16'b0000010000000000;
coef_mem[38] = 16'b0000010000000000;
coef_mem[39] = 16'b0000010000000000;

end

always@(posedge clk_tb) 
begin//output new coeff on each clock cycle when appropriate
if (mem_pos > 7'd40) 
begin
        mem_pos     <= 6'b000001;
        coef_din_tb <=16'b0000000000000000;
end
else 
begin
    if (coef_ld_tb==0 & coef_we_tb==1) 
    begin
        mem_pos     <= mem_pos+1;
        coef_din_tb <= coef_mem[mem_pos-1];
    end
    else
    begin
        mem_pos     <= mem_pos;
        coef_din_tb <= coef_din_tb;
    end
end
end

always@(posedge clk_tb) //generate 16 bit waveforms
begin
if (coef_ld_tb==0 & coef_we_tb==1) 
begin
    din_tb  <= din_tb+1;
end
else
    din_tb  <= din_tb;
end

FIR_filter_VHDL DUT (
 .clk(clk_tb),
 .coef_ld(coef_ld_tb), 
 .coef_we(coef_we_tb), 
 .coef_din(coef_din_tb),
 .rfd(rfd_tb),
 .rdy(rdy_tb),
 .din(din_tb),
 .dout(dout_tb) 
 );

endmodule 

И VHDL FIR фильтр ниже

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
Library XilinxCoreLib;
-- synthesis translate_on
ENTITY FIR_filter_VHDL IS
port (
clk: in std_logic;
coef_ld: in std_logic;
coef_we: in std_logic;
coef_din: in std_logic_vector(15 downto 0);
rfd: out std_logic;
rdy: out std_logic;
din: in std_logic_vector(15 downto 0);
dout: out std_logic_vector(37 downto 0));
END FIR_filter_VHDL;

ARCHITECTURE FIR_filter_VHDL_a OF FIR_filter_VHDL IS
-- synthesis translate_off
component wrapped_FIR_filter_VHDL
port (
clk: in std_logic;
coef_ld: in std_logic;
coef_we: in std_logic;
coef_din: in std_logic_vector(15 downto 0);
rfd: out std_logic;
rdy: out std_logic;
din: in std_logic_vector(15 downto 0);
dout: out std_logic_vector(37 downto 0));
end component;

-- Configuration specification 
for all : wrapped_FIR_filter_VHDL use entity 
XilinxCoreLib.fir_compiler_v5_0(behavioral)
    generic map(
        coef_width => 16,
        c_has_sclr => 0,
        datapath_memtype => 0,
        c_component_name => "FIR_filter_VHDL",
        c_family => "virtex6",
        round_mode => 0,
        output_width => 38,
        sclr_deterministic => 0,
        col_config => "1",
        coef_memtype => 0,
        clock_freq => 300000000,
        symmetry => 0,
        col_pipe_len => 4,
        c_latency => 48,
        chan_sel_width => 1,
        c_xdevicefamily => "virtex6",
        c_has_nd => 0,
        allow_approx => 0,
        num_channels => 1,
        data_width => 16,
        filter_sel_width => 1,
        sample_freq => 1000,
        coef_reload => 1,
        neg_symmetry => 0,
        filter_type => 0,
        data_type => 0,
        accum_width => 38,
        rate_change_type => 0,
        ipbuff_memtype => 0,
        c_optimization => 1,
        output_reg => 1,
        data_memtype => 0,
        c_has_data_valid => 0,
        decim_rate => 1,
        coef_type => 0,
        filter_arch => 1,
        interp_rate => 1,
        num_taps => 40,
        c_mem_init_file => "FIR_filter_VHDL.mif",
        zero_packing_factor => 1,
        num_paths => 1,
        num_filts => 1,
        col_mode => 1,
        c_has_ce => 0,
        chan_in_adv => 0,
        opbuff_memtype => 0,
        odd_symmetry => 0);
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_FIR_filter_VHDL
    port map (
        clk => clk,
        coef_ld => coef_ld,
        coef_we => coef_we,
        coef_din => coef_din,
        rfd => rfd,
        rdy => rdy,
        din => din,
        dout => dout);
-- synthesis translate_on

END FIR_filter_VHDL_a;

0 ответов

Другие вопросы по тегам