اطلاعیه

Collapse
No announcement yet.

طراحی و شبیه سازی یک مولد سیگنال و ماژول طیفسنج بر مبنای FFT

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    طراحی و شبیه سازی یک مولد سیگنال و ماژول طیفسنج بر مبنای FFT

    در این پروژه قصد داریم که یک سیگنال سینوسی با یک فرکانس مشخص را تولید کرده و به هستهی FFTتحویل دهیم.
    از FFT 1024 استفاده شده است. و مقدار پیک و محل پیک به خروجی داده میشود.
    برای تولید سیگنال سه راه کلی وجود دارد :اول استفاده از هستهی ،CORDICدوم استفاده از DDSو سوم استفاده از حافظهای که مقادیر یک پریود موج سینوسی
    در آن ذخیره شده است.
    که برای راحتی کار حافظه استفاده شده است.

    #2
    پاسخ : طراحی و شبیه سازی یک مولد سیگنال و ماژول طیفسنج بر مبنای FFT

    کد:
    module my_fft(
      input clk,
    	 output reg[39:0] max_size=0,
    	 output reg [9:0] max_index=0
      );
    wire [4:0]addra;
    wire start=1;
    reg [4:0]cnt=0;
    reg [9:0] cp_cnt=0;
    reg cp_len_we;
    wire [7:0] douta;
    wire rfd,busy,done,edone;
    reg [7:0] xn_re=0;
    wire signed[18:0] xk_re,xk_im;
    wire [9:0] xn_index;
    reg [39:0] size;
    wire dv;
    wire [9:0] xk_index;
    	 
    memory m1 (
     .clka(clk), // input clka
     .addra(addra), // input [4 : 0] addra
     .douta(douta) // output [7 : 0] douta
    );
    
    
    fft f1 (
     .clk(clk), // input clk
     .start(start), // input start
     .cp_len(cp_cnt), // input [9 : 0] cp_len
     .cp_len_we(cp_len_we), // input cp_len_we
     .xn_re(xn_re), // input [7 : 0] xn_re
     .xn_im(0), // input [7 : 0] xn_im
     .fwd_inv(1), // input fwd_inv
     .fwd_inv_we(1), // input fwd_inv_we
     .rfd(rfd), // output rfd
     .xn_index(xn_index), // output [9 : 0] xn_index
     .busy(busy), // output busy
     .edone(edone), // output edone
     .done(done), // output done
     .dv(dv), // output dv
     .xk_index(xk_index), // output [9 : 0] xk_index
     .cpv(cpv), // output cpv
     .rfs(rfs), // output rfs
     .xk_re(xk_re), // output [18 : 0] xk_re
     .xk_im(xk_im) // output [18 : 0] xk_im
    );
    
    
    assign addra=cnt;
    always@(posedge clk)
    begin
    	
    if(rfd)
    	begin
    	
    		cp_len_we<=1;
    		cp_cnt<=cp_cnt+1;
    		xn_re<=douta;
    		
    		if(cnt==18)
    		cnt<=0;
    		else
    		cnt<=cnt+2;
    		
    	end
    else cp_len_we<=0;
    end
    
    always@(*)
    	if(dv)
    	begin
    	     size<=(xk_re*xk_re)+(xk_im*xk_im);
    				if(size>=max_size)
    				begin
    				max_size<=size;
    				max_index<=xk_index;
    				end	
    	end
    
    endmodule

    دیدگاه

    لطفا صبر کنید...
    X