КИХ-фильтр 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;