mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| read_verilog <<EOT
 | |
| // Citation https://github.com/ZipCPU/dspfilters/blob/master/rtl/fastfir.v
 | |
| module fastfir_dynamictaps(i_clk, i_reset, i_tap_wr, i_tap, i_ce, i_sample, o_result);
 | |
|   wire [30:0] _00_;
 | |
|   wire [23:0] _01_;
 | |
|   wire [11:0] _02_;
 | |
|   wire [30:0] _03_;
 | |
|   wire [23:0] _04_;
 | |
|   wire [30:0] _05_;
 | |
|   wire [23:0] _06_;
 | |
|   wire [30:0] _07_;
 | |
|   wire [23:0] _08_;
 | |
|   wire [11:0] _09_;
 | |
|   wire [30:0] _10_;
 | |
|   wire [23:0] _11_;
 | |
|   wire [30:0] _12_;
 | |
|   wire [23:0] _13_;
 | |
|   wire [11:0] \fir.FILTER[0].tapk.delayed_sample ;
 | |
|   reg [30:0] \fir.FILTER[0].tapk.o_acc  = 31'h00000000;
 | |
|   wire [11:0] \fir.FILTER[0].tapk.o_sample ;
 | |
|   reg [23:0] \fir.FILTER[0].tapk.product ;
 | |
|   reg [11:0] \fir.FILTER[0].tapk.tap  = 12'h000;
 | |
|   wire [11:0] \fir.FILTER[1].tapk.delayed_sample ;
 | |
|   wire [30:0] \fir.FILTER[1].tapk.o_acc ;
 | |
|   wire [11:0] \fir.FILTER[1].tapk.o_sample ;
 | |
|   reg [23:0] \fir.FILTER[1].tapk.product ;
 | |
|   reg [11:0] \fir.FILTER[1].tapk.tap  = 12'h000;
 | |
|   input i_ce;
 | |
|   input i_clk;
 | |
|   input i_reset;
 | |
|   input [11:0] i_sample;
 | |
|   input [11:0] i_tap;
 | |
|   input i_tap_wr;
 | |
|   output [30:0] o_result;
 | |
|   reg [30:0] o_result;
 | |
|   assign _03_ = 31'h00000000 + { \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product  };
 | |
|   assign _04_ = $signed(\fir.FILTER[0].tapk.tap ) * $signed(i_sample);
 | |
|   always @(posedge i_clk)
 | |
|       \fir.FILTER[0].tapk.tap  <= _02_;
 | |
|   always @(posedge i_clk)
 | |
|       \fir.FILTER[0].tapk.o_acc  <= _00_;
 | |
|   always @(posedge i_clk)
 | |
|       \fir.FILTER[0].tapk.product  <= _01_;
 | |
|   assign _02_ = i_tap_wr ? i_tap : \fir.FILTER[0].tapk.tap ;
 | |
|   assign _05_ = i_ce ? _03_ : \fir.FILTER[0].tapk.o_acc ;
 | |
|   assign _00_ = i_reset ? 31'h00000000 : _05_;
 | |
|   assign _06_ = i_ce ? _04_ : \fir.FILTER[0].tapk.product ;
 | |
|   assign _01_ = i_reset ? 24'h000000 : _06_;
 | |
|   assign _10_ = \fir.FILTER[0].tapk.o_acc  + { \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product  };
 | |
|   assign _11_ = $signed(\fir.FILTER[1].tapk.tap ) * $signed(i_sample);
 | |
|   always @(posedge i_clk)
 | |
|       \fir.FILTER[1].tapk.tap  <= _09_;
 | |
|   always @(posedge i_clk)
 | |
|       o_result <= _07_;
 | |
|   always @(posedge i_clk)
 | |
|       \fir.FILTER[1].tapk.product  <= _08_;
 | |
|   assign _09_ = i_tap_wr ? \fir.FILTER[0].tapk.tap  : \fir.FILTER[1].tapk.tap ;
 | |
|   assign _12_ = i_ce ? _10_ : o_result;
 | |
|   assign _07_ = i_reset ? 31'h00000000 : _12_;
 | |
|   assign _13_ = i_ce ? _11_ : \fir.FILTER[1].tapk.product ;
 | |
|   assign _08_ = i_reset ? 24'h000000 : _13_;
 | |
|   assign \fir.FILTER[1].tapk.o_acc  = o_result;
 | |
| endmodule
 | |
| EOT
 | |
| 
 | |
| synth_xilinx -noiopad
 | |
| cd fastfir_dynamictaps
 | |
| select -assert-count 2 t:DSP48E1
 | |
| select -assert-none t:* t:DSP48E1 %d t:BUFG %d
 |