Maverick_ 17 October 10, 2023 Posted October 10, 2023 · Report post Добра есть данные с NCO (reg_cos, reg_sin) и приходяцие данные (reg_data_re, reg_data_im) далее я описываю фільтр -- //\\\\\\\\\// -- // Mixer I // -- //\\\\\\\\\// process (all) begin if (i_rst = '1') then reg_bpsk_im <= (others => '0'); elsif(rising_edge(i_clk)) then if valid = '1' then reg_bpsk_im <= std_logic_vector(signed(reg_sin) * signed(reg_data_im)); end if; end if; end process; -- //\\\\\\\\\// -- // Mixer Q // -- //\\\\\\\\\// process (all) begin if (i_rst = '1') then reg_bpsk_re <= (others => '0'); elsif(rising_edge(i_clk)) then if valid = '1' then reg_bpsk_re <= std_logic_vector(signed(reg_cos) * signed(reg_data_re)); end if; end if; end process; process (all) begin if (i_rst = '1') then reg_valid <= '0'; valid_out <= '0'; elsif(rising_edge(i_clk)) then reg_valid <= valid; valid_out <= reg_valid; end if; end process; process (all) begin if (i_rst = '1') then mix_im <= (others=>(others=>'0')); elsif(rising_edge(i_clk)) then --mix_im(mix_im'low) <= signed(reg_bpsk_im); --mix_im <= mix_im(mix_im'high); mix_im(0) <= signed(reg_bpsk_im); mix_im(1) <= mix_im(0); mix_im(2) <= mix_im(1); mix_im(3) <= mix_im(2); mix_im(4) <= mix_im(3); mix_im(5) <= mix_im(4); mix_im(6) <= mix_im(5); mix_im(7) <= mix_im(6); mix_im(8) <= mix_im(7); mix_im(9) <= mix_im(8); end if; end process; process (all) begin if (i_rst = '1') then mix_re <= (others=>(others=>'0')); elsif(rising_edge(i_clk)) then --mix_re(mix_re'low) <= signed(reg_bpsk_re); --mix_re <= mix_re(mix_re'high); mix_re(0) <= signed(reg_bpsk_re); mix_re(1) <= mix_re(0); mix_re(2) <= mix_re(1); mix_re(3) <= mix_re(2); mix_re(4) <= mix_re(3); mix_re(5) <= mix_re(4); mix_re(6) <= mix_re(5); mix_re(7) <= mix_re(6); mix_re(8) <= mix_re(7); mix_re(9) <= mix_re(8); end if; end process; -- //\\\\\\\\\\\\\\\\\\\// -- // Low-pass Filter I // -- //\\\\\\\\\\\\\\\\\\\// process (all) begin if (i_rst = '1') then LpfI <= (others=>'0'); elsif(rising_edge(i_clk)) then LpfI <= mix_im(0) + mix_im(1) + mix_im(2) + mix_im(3) + mix_im(4) + mix_im(5) + mix_im(6) + mix_im(7) + mix_im(8) + mix_im(9); end if; end process; process (all) begin if (i_rst = '1') then LpfQ <= (others=>'0'); elsif(rising_edge(i_clk)) then LpfQ <= mix_re(0) + mix_re(1) + mix_re(2) + mix_re(3) + mix_re(4) + mix_re(5) + mix_re(6) + mix_re(7) + mix_re(8) + mix_re(9); end if; end process; мне такое описание не нравиться из-за строк вычисляющих LpfI и LpfQ подскажите как можно/нужно по другому описать PS внутренний голос говорит что описание - FIR filter Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 10, 2023 Posted October 10, 2023 · Report post 3 hours ago, Maverick_ said: мне такое описание не нравиться из-за строк вычисляющих LpfI и LpfQ подскажите как можно/нужно по другому описать вам описание конвейризированного дерева сумматоров нужно? или фильтр аналог? Так то обычный cic фильтр на 10 единичных коэффицентов описан, можно на дереве, можно на цепи, можно на аккумуляторе с памятью сделать) Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 17 October 11, 2023 Posted October 11, 2023 · Report post 17 hours ago, des00 said: вам описание конвейризированного дерева сумматоров нужно? или фильтр аналог? Так то обычный cic фильтр на 10 единичных коэффицентов описан, можно на дереве, можно на цепи, можно на аккумуляторе с памятью сделать) помоги пожалуйста добавить в описание сигнал разрешения работи модуля https://electronix.ru/forum/applications/core/interface/file/attachment.php?id=77681 описание от Bad0512 Quote Share this post Link to post Share on other sites More sharing options...
des00 27 October 11, 2023 Posted October 11, 2023 · Report post 46 minutes ago, Maverick_ said: помоги пожалуйста добавить в описание сигнал разрешения работи модуля https://electronix.ru/forum/applications/core/interface/file/attachment.php?id=77681 описание от Bad0512 adder_tree_m.v Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 17 October 11, 2023 Posted October 11, 2023 · Report post 3 hours ago, des00 said: adder_tree_m.v 1.92 kB · 0 downloads огромное спасибо! и(vivado 2019.1) для module adder_tree # ( parameter int NUM_INPUTS = 16, parameter int DATA_WIDTH = 16, parameter int OUT_DATA_WIDTH = DATA_WIDTH + $clog2(NUM_INPUTS) ) ( input logic clk, input logic clkena, input logic [DATA_WIDTH-1:0] idata [0:NUM_INPUTS-1], output logic [OUT_DATA_WIDTH-1:0] odata ); localparam int NUM_INPUTS_TRUE = 2 ** ($clog2(NUM_INPUTS)); localparam int LP_STAGES = $clog2(NUM_INPUTS); logic [DATA_WIDTH-1:0] in_true [0:NUM_INPUTS_TRUE-1]; logic [OUT_DATA_WIDTH-1:0] adder_out [0:LP_STAGES-1][0:NUM_INPUTS_TRUE/2-1]; //Make zero assignment for unused inputs (in case when NUM_INPUTS ~= power of 2 : genvar inp; generate for (inp=0; inp < NUM_INPUTS_TRUE; inp = inp + 1) begin: inp_assign if(inp < NUM_INPUTS) assign in_true[inp] = idata[inp]; else assign in_true[inp] = '0; end endgenerate genvar stage,adder_num; generate for (stage=0; stage < LP_STAGES; stage = stage + 1) begin: stage_gen localparam int STAGE_IN_W = NUM_INPUTS_TRUE >> stage; localparam int STAGE_OUT_W = STAGE_IN_W/2; localparam int DW_IN = DATA_WIDTH + stage; localparam int DW_OUT = DW_IN + 1; for (adder_num=0; adder_num < STAGE_OUT_W; adder_num = adder_num + 1) begin: adder_gen if(stage == 0) always_ff@(posedge clk) begin if (clkena) begin adder_out[stage][adder_num][DW_OUT-1:0] <= in_true[adder_num*2] + in_true[adder_num*2 + 1]; end end else begin always_ff@(posedge clk) begin if (clkena) begin adder_out[stage][adder_num][DW_OUT-1:0] <= adder_out[stage-1][adder_num*2][DW_IN-1:0] + adder_out[stage-1][adder_num*2 + 1][DW_IN-1:0]; end end end end end endgenerate assign odata = adder_out[LP_STAGES-1][0]; endmodule и в ртл просматровщике Quote Share this post Link to post Share on other sites More sharing options...