| // Copyright 2020-2022 F4PGA Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| module dsp_t1_20x18x64_cfg_ports ( |
| input [19:0] a_i, |
| input [17:0] b_i, |
| input [ 5:0] acc_fir_i, |
| output [37:0] z_o, |
| output [17:0] dly_b_o, |
| |
| input clock_i, |
| input reset_i, |
| |
| input [2:0] feedback_i, |
| input load_acc_i, |
| input unsigned_a_i, |
| input unsigned_b_i, |
| |
| input [2:0] output_select_i, |
| input saturate_enable_i, |
| input [5:0] shift_right_i, |
| input round_i, |
| input subtract_i, |
| input register_inputs_i |
| ); |
| |
| parameter [19:0] COEFF_0 = 20'd0; |
| parameter [19:0] COEFF_1 = 20'd0; |
| parameter [19:0] COEFF_2 = 20'd0; |
| parameter [19:0] COEFF_3 = 20'd0; |
| |
| QL_DSP2 # ( |
| .MODE_BITS ({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) _TECHMAP_REPLACE_ ( |
| .a (a_i), |
| .b (b_i), |
| .acc_fir (acc_fir_i), |
| .z (z_o), |
| .dly_b (dly_b_o), |
| |
| .clk (clock_i), |
| .reset (reset_i), |
| |
| .feedback (feedback_i), |
| .load_acc (load_acc_i), |
| .unsigned_a (unsigned_a_i), |
| .unsigned_b (unsigned_b_i), |
| |
| .f_mode (1'b0), // No fracturation |
| .output_select (output_select_i), |
| .saturate_enable (saturate_enable_i), |
| .shift_right (shift_right_i), |
| .round (round_i), |
| .subtract (subtract_i), |
| .register_inputs (register_inputs_i) |
| ); |
| |
| endmodule |
| |
| module dsp_t1_10x9x32_cfg_ports ( |
| input [ 9:0] a_i, |
| input [ 8:0] b_i, |
| input [ 5:0] acc_fir_i, |
| output [18:0] z_o, |
| output [ 8:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input clock_i, |
| input reset_i, |
| |
| input [2:0] feedback_i, |
| input load_acc_i, |
| input unsigned_a_i, |
| input unsigned_b_i, |
| |
| input [2:0] output_select_i, |
| input saturate_enable_i, |
| input [5:0] shift_right_i, |
| input round_i, |
| input subtract_i, |
| input register_inputs_i |
| ); |
| |
| parameter [9:0] COEFF_0 = 10'd0; |
| parameter [9:0] COEFF_1 = 10'd0; |
| parameter [9:0] COEFF_2 = 10'd0; |
| parameter [9:0] COEFF_3 = 10'd0; |
| |
| wire [37:0] z; |
| wire [17:0] dly_b; |
| |
| QL_DSP2 # ( |
| .MODE_BITS ({10'd0, COEFF_3, |
| 10'd0, COEFF_2, |
| 10'd0, COEFF_1, |
| 10'd0, COEFF_0}) |
| ) _TECHMAP_REPLACE_ ( |
| .a ({10'd0, a_i}), |
| .b ({ 9'd0, b_i}), |
| .acc_fir (acc_fir_i), |
| .z (z), |
| .dly_b (dly_b), |
| |
| .clk (clock_i), |
| .reset (reset_i), |
| |
| .feedback (feedback_i), |
| .load_acc (load_acc_i), |
| .unsigned_a (unsigned_a_i), |
| .unsigned_b (unsigned_b_i), |
| |
| .f_mode (1'b1), // Enable fractuation, Use the lower half |
| .output_select (output_select_i), |
| .saturate_enable (saturate_enable_i), |
| .shift_right (shift_right_i), |
| .round (round_i), |
| .subtract (subtract_i), |
| .register_inputs (register_inputs_i) |
| ); |
| |
| assign z_o = z[18:0]; |
| assign dly_b_o = dly_b_o[8:0]; |
| |
| endmodule |
| |
| module dsp_t1_20x18x64_cfg_params ( |
| input [19:0] a_i, |
| input [17:0] b_i, |
| input [ 5:0] acc_fir_i, |
| output [37:0] z_o, |
| output [17:0] dly_b_o, |
| |
| input clock_i, |
| input reset_i, |
| |
| input [2:0] feedback_i, |
| input load_acc_i, |
| input unsigned_a_i, |
| input unsigned_b_i, |
| input subtract_i |
| ); |
| |
| parameter [19:0] COEFF_0 = 20'd0; |
| parameter [19:0] COEFF_1 = 20'd0; |
| parameter [19:0] COEFF_2 = 20'd0; |
| parameter [19:0] COEFF_3 = 20'd0; |
| |
| parameter [2:0] OUTPUT_SELECT = 3'd0; |
| parameter [0:0] SATURATE_ENABLE = 1'd0; |
| parameter [5:0] SHIFT_RIGHT = 6'd0; |
| parameter [0:0] ROUND = 1'd0; |
| parameter [0:0] REGISTER_INPUTS = 1'd0; |
| |
| QL_DSP3 # ( |
| .MODE_BITS ({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| 1'b0, // Not fractured |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) _TECHMAP_REPLACE_ ( |
| .a (a_i), |
| .b (b_i), |
| .acc_fir (acc_fir_i), |
| .z (z_o), |
| .dly_b (dly_b_o), |
| |
| .clk (clock_i), |
| .reset (reset_i), |
| |
| .feedback (feedback_i), |
| .load_acc (load_acc_i), |
| .unsigned_a (unsigned_a_i), |
| .unsigned_b (unsigned_b_i), |
| .subtract (subtract_i) |
| ); |
| |
| endmodule |
| |
| module dsp_t1_10x9x32_cfg_params ( |
| input [ 9:0] a_i, |
| input [ 8:0] b_i, |
| input [ 5:0] acc_fir_i, |
| output [18:0] z_o, |
| output [ 8:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input clock_i, |
| input reset_i, |
| |
| input [2:0] feedback_i, |
| input load_acc_i, |
| input unsigned_a_i, |
| input unsigned_b_i, |
| input subtract_i |
| ); |
| |
| parameter [9:0] COEFF_0 = 10'd0; |
| parameter [9:0] COEFF_1 = 10'd0; |
| parameter [9:0] COEFF_2 = 10'd0; |
| parameter [9:0] COEFF_3 = 10'd0; |
| |
| parameter [2:0] OUTPUT_SELECT = 3'd0; |
| parameter [0:0] SATURATE_ENABLE = 1'd0; |
| parameter [5:0] SHIFT_RIGHT = 6'd0; |
| parameter [0:0] ROUND = 1'd0; |
| parameter [0:0] REGISTER_INPUTS = 1'd0; |
| |
| wire [37:0] z; |
| wire [17:0] dly_b; |
| |
| QL_DSP3 # ( |
| .MODE_BITS ({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| 1'b1, // Fractured |
| 10'd0, COEFF_3, |
| 10'd0, COEFF_2, |
| 10'd0, COEFF_1, |
| 10'd0, COEFF_0 |
| }) |
| ) _TECHMAP_REPLACE_ ( |
| .a ({10'd0, a_i}), |
| .b ({ 9'd0, b_i}), |
| .acc_fir (acc_fir_i), |
| .z (z), |
| .dly_b (dly_b), |
| |
| .clk (clock_i), |
| .reset (reset_i), |
| |
| .feedback (feedback_i), |
| .load_acc (load_acc_i), |
| .unsigned_a (unsigned_a_i), |
| .unsigned_b (unsigned_b_i), |
| .subtract (subtract_i) |
| ); |
| |
| assign z_o = z[18:0]; |
| assign dly_b_o = dly_b_o[8:0]; |
| |
| endmodule |
| |