Jump to content
    

помощь с описанием (vhdl)

Добра

есть данные с 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

Share this post


Link to post
Share on other sites

3 hours ago, Maverick_ said:

мне такое описание не нравиться из-за строк вычисляющих LpfI и LpfQ

подскажите как можно/нужно по другому описать

вам описание конвейризированного дерева сумматоров нужно? или фильтр аналог? Так то обычный cic фильтр на 10 единичных коэффицентов описан, можно на дереве, можно на цепи, можно на аккумуляторе с памятью сделать)

Share this post


Link to post
Share on other sites

17 hours ago, des00 said:

вам описание конвейризированного дерева сумматоров нужно? или фильтр аналог? Так то обычный cic фильтр на 10 единичных коэффицентов описан, можно на дереве, можно на цепи, можно на аккумуляторе с памятью сделать)

помоги пожалуйста добавить в описание сигнал разрешения работи модуля

https://electronix.ru/forum/applications/core/interface/file/attachment.php?id=77681   описание от Bad0512

Share this post


Link to post
Share on other sites

46 minutes ago, Maverick_ said:

помоги пожалуйста добавить в описание сигнал разрешения работи модуля

https://electronix.ru/forum/applications/core/interface/file/attachment.php?id=77681   описание от Bad0512

adder_tree_m.v

Share this post


Link to post
Share on other sites

3 hours ago, des00 said:

огромное спасибо!

и(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

и в ртл просматровщике

image.thumb.png.d45256de8fe9a23dec966101cd712803.png

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...