⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 210model.v

📁 《数字信号处理的FPGA实现》代码
💻 V
📖 第 1 页 / 共 3 页
字号:
          begin
                  {overflow,underflow,result} = LogicShift(data,distance,direction);
          end
        else if (lpm_shifttype == "ARITHMETIC")
          begin
                    {overflow,underflow,result} = ArithShift(data,distance,direction);
          end
        else if (lpm_shifttype == "ROTATE")
          begin
                    result = RotateShift(data, distance, direction) ;
  		    overflow = 1'b0;
  		    underflow = 1'b0;
          end
        else
          begin
                    result = 'bx ;
  		    overflow = 1'b0;
  		    underflow = 1'b0;
          end
 
    end

endmodule // lpm_clshift

module lpm_compare (  alb, aeb, agb, aleb, aneb, ageb, dataa, datab, clock, aclr ) ;


  parameter lpm_type = "lpm_compare" ;
  parameter lpm_width = 1 ;
  parameter lpm_pipeline = 0 ;
  parameter lpm_representation = "UNSIGNED" ;

  input  [lpm_width-1:0] dataa, datab ;
  input  clock ;
  input  aclr ;
  output alb, aeb, agb, aleb, aneb, ageb ;

  reg    tmp_alb, tmp_aeb, tmp_agb ;
  reg    tmp_aleb, tmp_aneb, tmp_ageb ;
  reg    [lpm_pipeline:0] tmp_alb2, tmp_aeb2, tmp_agb2 ;
  reg    [lpm_pipeline:0] tmp_aleb2, tmp_aneb2, tmp_ageb2 ;
  reg    [lpm_width-1:0] a_int;
  integer i, j, k, l, m, n, o, p, u, dataa_int, datab_int;

  always @( dataa or datab)
    begin
  		if (lpm_representation == "UNSIGNED") 
  	    	    begin
  			dataa_int = dataa[lpm_width-1:0];
  			datab_int = datab[lpm_width-1:0];
  	    	    end
  		else
  		if (lpm_representation == "SIGNED")
  		    begin
			if ( dataa[lpm_width-1] == 1)
	    		begin
				a_int = 0;
				for(i = 0; i < lpm_width - 1; i = i + 1)
	                		a_int[i] = dataa[i] ^ 1;
				dataa_int = (a_int + 1) * (-1) ;
			end
			else dataa_int = dataa[lpm_width-1:0];

			if ( datab[lpm_width-1] == 1)
	    		begin
				a_int = 0;
				for(j = 0; j < lpm_width - 1; j = j + 1)
	                		a_int[j] = datab[j] ^ 1;
				datab_int = (a_int + 1) * (-1) ;
			end
			else datab_int = datab[lpm_width-1:0];
		    end

		tmp_alb = (dataa_int < datab_int);
		tmp_aeb = (dataa_int == datab_int);
		tmp_agb = (dataa_int > datab_int);
		tmp_aleb = (dataa_int <= datab_int);
		tmp_aneb = (dataa_int != datab_int);
		tmp_ageb = (dataa_int >= datab_int);
    end

  always @( posedge clock or posedge aclr)
    begin
        if (aclr)
            begin 
        	for(u = 0; u <= lpm_pipeline; u = u +1)
		begin
            		tmp_aeb2[u] = 'b0 ;
            		tmp_agb2[u] = 'b0 ;
            		tmp_alb2[u] = 'b0 ;
            		tmp_aleb2[u] = 'b0 ;
            		tmp_aneb2[u] = 'b0 ;
            		tmp_ageb2[u] = 'b0 ;
		end
            end
	else
        begin
                // Assign results to registers
                tmp_alb2[lpm_pipeline] = tmp_alb ;
                tmp_aeb2[lpm_pipeline] = tmp_aeb ;
                tmp_agb2[lpm_pipeline] = tmp_agb ;
                tmp_aleb2[lpm_pipeline] = tmp_aleb ;
                tmp_aneb2[lpm_pipeline] = tmp_aneb ;
                tmp_ageb2[lpm_pipeline] = tmp_ageb ;

        	for(k = 0; k < lpm_pipeline; k = k +1)
            		tmp_alb2[k] = tmp_alb2[k+1] ;
        	for(l = 0; l < lpm_pipeline; l = l +1)
            		tmp_aeb2[l] = tmp_aeb2[l+1] ;
        	for(m = 0; m < lpm_pipeline; m = m +1)
            		tmp_agb2[m] = tmp_agb2[m+1] ;
        	for(n = 0; n < lpm_pipeline; n = n +1)
            		tmp_aleb2[n] = tmp_aleb2[n+1] ;
        	for(o = 0; o < lpm_pipeline; o = o +1)
            		tmp_aneb2[o] = tmp_aneb2[o+1] ;
        	for(p = 0; p < lpm_pipeline; p = p +1)
            		tmp_ageb2[p] = tmp_ageb2[p+1] ;
	end
    end

  assign alb = (lpm_pipeline > 0) ? tmp_alb2[0] : tmp_alb;
  assign aeb = (lpm_pipeline > 0) ? tmp_aeb2[0] : tmp_aeb;
  assign agb = (lpm_pipeline > 0) ? tmp_agb2[0] : tmp_agb;
  assign aleb = (lpm_pipeline > 0) ? tmp_aleb2[0] : tmp_aleb;
  assign aneb = (lpm_pipeline > 0) ? tmp_aneb2[0] : tmp_aneb;
  assign ageb = (lpm_pipeline > 0) ? tmp_ageb2[0] : tmp_ageb;

endmodule // lpm_compare

module lpm_constant ( result ) ;

  parameter lpm_type = "lpm_constant" ;
  parameter lpm_width = 1 ;
  parameter lpm_cvalue = 0 ;
  parameter lpm_strength = "UNUSED";

  output [lpm_width-1:0] result ;

  assign result = lpm_cvalue ;

endmodule // lpm_constant


module lpm_counter ( q, eq, 
        data, clock,
        clk_en, cnt_en, updown,
        aset, aclr, aload, 
        sset, sclr, sload) ;

  parameter lpm_type	 = "lpm_counter";
  parameter lpm_width    = 1 ;
  parameter lpm_modulus  = 1<<lpm_width ;
  parameter lpm_avalue   = "UNUSED" ;
  parameter lpm_svalue   = "UNUSED" ;
  parameter lpm_pvalue   = "UNUSED" ;
  parameter lpm_direction  = "UNUSED" ;

  output [lpm_width-1:0] q ;
  output [lpm_modulus-1:0] eq ;
  input  [lpm_width-1:0] data ;
  input  clock, clk_en, cnt_en, updown ;
  input  aset, aclr, aload ;
  input  sset, sclr, sload ;

  reg  [lpm_width-1:0] tmp_count ;
  reg  [lpm_width-1:0] re_start ;
  integer up_limit ;

//---------------------------------------------------------------//
  function [lpm_width-1:0] NextBin ;
        input [lpm_width-1:0] count ;
    begin 
	  up_limit = (updown == 1)?(lpm_modulus - 1):0 ;
	  re_start = (updown == 1)?0:(lpm_modulus - 1) ;
	  if(((count >= up_limit) && updown)
		|| ((count == up_limit) && !updown))
		NextBin = re_start ;
	  else
	  	NextBin = (updown == 1)?count+1:count-1 ;
    end 
  endfunction

//---------------------------------------------------------------//
//  function [(1<<lpm_width)-1:0] CountDecode ;
//---------------------------------------------------------------//
  function [lpm_modulus:0] CountDecode ;
    input [lpm_width-1:0] count ;
    integer eq_index ;
    begin
	  CountDecode = 0 ;
	  eq_index = 0;
	  if(count < lpm_modulus)
	  begin
		  eq_index = count ;
	  	  CountDecode[eq_index] = 1'b1 ;
	  end
    end
  endfunction

//---------------------------------------------------------------//
//  function integer str_to_int ;
//---------------------------------------------------------------//
  function integer str_to_int ;
    input  [8*16:1] s; 
    reg [8*16:1] reg_s;
    reg [8:1]   digit ;
    reg [8:1] tmp;
    integer   m , ivalue ; 
    begin 
  
	ivalue = 0;
	reg_s = s;
        for (m=1; m<=16; m= m+1 ) 
        begin 
		tmp = reg_s[128:121];
		digit = tmp & 8'b00001111;
		reg_s = reg_s << 8;	
                ivalue = ivalue * 10 + digit; 
        end
	str_to_int = ivalue;
    end
  endfunction

//---------------------------------------------------------------//

  always @( posedge clock or posedge aclr or posedge aset or 
		posedge aload  )
    begin :asyn_block
      if (aclr)
        begin
          tmp_count = 0 ;
        end
      else if (aset)
        begin
        if (lpm_avalue == "UNUSED")
                tmp_count = {lpm_width{1'b1}};
        else
          	tmp_count = str_to_int(lpm_avalue) ;
        end
      else if (aload)
        begin
          tmp_count = data ;
        end
    else
    begin :syn_block
	  if( clk_en )
	    begin
	      if (sclr)
			begin :syn_clr
				 tmp_count = 0 ;
			end
	      else if (sset)
			begin :syn_set
                                 if (lpm_svalue == "UNUSED")
                                 	tmp_count = {lpm_width{1'b1}};
                                 else
					tmp_count = str_to_int(lpm_svalue) ;
			end
	      else if (sload)
			begin :syn_load
					tmp_count = data ;
			end
	      else if( cnt_en)
		begin
			tmp_count = NextBin(tmp_count) ;
	        end
	    end
    end
    end 

  assign q =  tmp_count ;
  assign eq = CountDecode(tmp_count) ;

 endmodule // lpm_counter

module lpm_decode ( eq, data, enable, clock, aclr) ;

  parameter lpm_type     = "lpm_decode" ;
  parameter lpm_width    = 1 ;
  parameter lpm_decodes  = 1 << lpm_width ;
  parameter lpm_pipeline = 0 ;


  input  [lpm_width-1:0] data ;
  input  enable ;
  input  clock ;
  input  aclr ;
  output [lpm_decodes-1:0] eq ;

  reg    [lpm_decodes-1:0] tmp_eq2 [lpm_pipeline:0] ;
  reg    [lpm_decodes-1:0] tmp_eq;
  integer i, j;


  always @( data or enable)
    begin
	tmp_eq = 0;
	if (enable)
            begin
                if( (data < lpm_decodes))
                    begin
                        tmp_eq[data] = 1'b1 ;
                    end else
			tmp_eq = 0;
	    end
    end
 
    always @(posedge clock or posedge aclr)
    begin
        if (aclr)
            begin 
                for(i = 0; i <= lpm_pipeline; i = i + 1)
            		tmp_eq2[i] = 'b0 ;
            end
   	else 
	begin
        tmp_eq2[lpm_pipeline] = tmp_eq ;
        for(j = 0; j < lpm_pipeline; j = j +1)
            tmp_eq2[j] = tmp_eq2[j+1] ;
	end
      end

  assign eq = (lpm_pipeline > 0) ? tmp_eq2[0] : tmp_eq;

endmodule // lpm_decode

module lpm_ff ( q,
        data, clock, enable,
        aclr, aset,
        sclr, sset,
        aload, sload) ;

  parameter lpm_type = "lpm_ff" ;
  parameter lpm_fftype = "DFF" ;
  parameter lpm_width  = 1 ;
  parameter lpm_avalue = "UNUSED" ;
  parameter lpm_svalue = "UNUSED" ;

  input  [lpm_width-1:0] data ;
  input  clock, enable ;
  input  aclr, aset ;
  input  sclr, sset ;
  input  aload, sload  ;
  output [lpm_width-1:0] q;

  reg   [lpm_width-1:0] tmp_q ;
  integer i ;

//---------------------------------------------------------------//
//  function integer str_to_int ;
//---------------------------------------------------------------//
  function integer str_to_int ;
    input  [8*16:1] s; 
    reg [8*16:1] reg_s;
    reg [8:1]   digit ;
    reg [8:1] tmp;
    integer   m , ivalue ; 
    begin 
  
	ivalue = 0;
	reg_s = s;
        for (m=1; m<=16; m= m+1 ) 
        begin 
		tmp = reg_s[128:121];
		digit = tmp & 8'b00001111;
		reg_s = reg_s << 8;	
                ivalue = ivalue * 10 + digit; 
        end
	str_to_int = ivalue;
    end
  endfunction
//---------------------------------------------------------------//

  always @( posedge clock or posedge aclr or posedge aset or posedge aload )
    begin :asyn_block // Asynchronous process

      if (aclr)
	begin
         	 tmp_q = 0 ;
	end
      else if (aset)
	begin
		if (lpm_avalue == "UNUSED")
			tmp_q = {lpm_width{1'b1}};
		else
			tmp_q = str_to_int(lpm_avalue) ;
	end
      else if (aload)
	begin
         	 tmp_q = data ;
	end
    else

    begin :syn_block // Synchronous process
      	if (enable)
	    begin
		if(sclr)
		  begin
       			tmp_q = 0;
		  end
      		else if (sset )
		  begin
			if (lpm_svalue == "UNUSED") 
       		                tmp_q = {lpm_width{1'b1}}; 
	                else
				tmp_q = str_to_int(lpm_svalue) ;
		  end
      		else if (sload)  // Load data
		  begin
        		tmp_q = data ;
		  end
		else
		  begin
  			if(lpm_fftype == "TFF") // toggle
			  begin
   		             for (i = 0 ; i < lpm_width; i=i+1)
       			         begin
  					if(data[i] == 1'b1) 
  						tmp_q[i] = ~tmp_q[i];
               		 	 end
			  end
  			else 
  			if(lpm_fftype == "DFF") // load data
        			tmp_q = data ;
		  end
	    end
    end
    end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -