x393  1.0
FPGAcodeforElphelNC393camera
dsp_addsub_simd.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  parameter NUM_DATA = 2, // Currently with INSTANTIATE_DSP48E1 should be 2
43  parameter WIDTH = 24 // Currently with INSTANTIATE_DSP48E1 should be 24
44 )(
45  input clk,
46  input rst,
47  input [NUM_DATA * WIDTH -1:0] ain,
48  input [NUM_DATA * WIDTH -1:0] bin,
49  input cea, // load a registers
50  input ceb, // load b registers
51  input subtract, // 0 - add, 1 - subtract
52  input cep, // load output registers
53  output [NUM_DATA * WIDTH -1:0] pout);
54 
55 `ifdef INSTANTIATE_DSP48E1
56  wire [4:0] inmode = { 1'b1, // ~selb,
57  1'b0, // sub_d,
58  1'b0, // seld,
59  1'b0, // seld, // ~en_a,
60  1'b1}; // ~sela};
61 // No CIN in the middle of SIMD words!
62 // wire [3:0] alumode = {2'b0, // Z + X + Y + CIN / -Z +( X + Y + CIN) -1
63  wire [3:0] alumode = {2'b0, // Z + X + Y + CIN / Z -( X + Y + CIN)
64  subtract, // 1'b0,
65  subtract};
66  wire [6:0] opmode = {3'b011, // Z = C-input
67  2'b00, // Y = 0
68  2'b11}; // X = A:B
69 // wire cryin = subtract;
70 
72  .ACASCREG (1),
73  .ADREG (1),
74  .ALUMODEREG (1),
75  .AREG (1), // (1)
76  .AUTORESET_PATDET ("NO_RESET"),
77  .A_INPUT ("DIRECT"),
78  .BCASCREG (1),
79  .BREG (1), // (1)
80  .B_INPUT ("DIRECT"),
81  .CARRYINREG (1),
82  .CARRYINSELREG (1),
83  .CREG (1), //(1),
84  .DREG (1),
85  .INMODEREG (1),
86  .IS_ALUMODE_INVERTED (4'b0),
87  .IS_CARRYIN_INVERTED (1'b0),
88  .IS_CLK_INVERTED (1'b0),
89  .IS_INMODE_INVERTED (5'b0),
90  .IS_OPMODE_INVERTED (7'b0),
91  .MASK (48'hffffffffffff),
92  .MREG (0),
93  .OPMODEREG (1),
94  .PATTERN (48'h000000000000),
95  .PREG (1),
96  .SEL_MASK ("MASK"),
97  .SEL_PATTERN ("PATTERN"),
98  .USE_DPORT ("TRUE"), //("FALSE"),
99  .USE_MULT ("NONE"), //("MULTIPLY"),
100  .USE_PATTERN_DETECT ("NO_PATDET"),
101  .USE_SIMD ("TWO24") // ("ONE48")
102  ) DSP48E1_i (
103  .ACOUT (), // output[29:0]
104  .BCOUT (), // output[17:0]
105  .CARRYCASCOUT (), // output
106  .CARRYOUT (), // output[3:0]
107  .MULTSIGNOUT (), // output
108  .OVERFLOW (), // output
109  .P (pout), // output[47:0]
110  .PATTERNBDETECT (), // output
111  .PATTERNDETECT (), // output
112  .PCOUT (), // output[47:0]
113  .UNDERFLOW (), // output
114  .A (bin[47:18]), // input[29:0]
115  .ACIN (30'b0), // input[29:0]
116  .ALUMODE (alumode), // input[3:0]
117  .B (bin[17:0]), // input[17:0]
118  .BCIN (18'b0), // input[17:0]
119  .C (ain), // input[47:0]
120  .CARRYCASCIN (1'b0), // input
121  .CARRYIN (1'b0), // cryin), // input
122  .CARRYINSEL (3'h0), // input[2:0] // later modify?
123  .CEA1 (1'b0), // input
124  .CEA2 (ceb), // input
125  .CEAD (1'b0), // input
126  .CEALUMODE (1'b1), // input
127  .CEB1 (1'b0), // input
128  .CEB2 (ceb), // input
129  .CEC (cea), // input
130  .CECARRYIN (1'b1), // input
131  .CECTRL (1'b1), // input
132  .CED (1'b0), // input
133  .CEINMODE (1'b1), // input
134  .CEM (1'b0), // input
135  .CEP (cep), // input
136  .CLK (clk), // input
137  .D (25'h1ffffff),// input[24:0]
138  .INMODE (inmode), // input[4:0]
139  .MULTSIGNIN (1'b0), // input
140  .OPMODE (opmode), // input[6:0]
141  .PCIN (48'b0), // input[47:0]
142  .RSTA (rst), // input
143  .RSTALLCARRYIN (rst), // input
144  .RSTALUMODE (rst), // input
145  .RSTB (rst), // input
146  .RSTC (rst), // input
147  .RSTCTRL (rst), // input
148  .RSTD (1'b0), // input
149  .RSTINMODE (rst), // input
150  .RSTM (1'b0), // input
151  .RSTP (rst) // input
152  );
153 `else
154  reg [NUM_DATA * WIDTH -1:0] a_reg;
155  reg [NUM_DATA * WIDTH -1:0] b_reg;
156  reg [NUM_DATA * WIDTH -1:0] p_reg;
157  reg sub_r;
158  wire [NUM_DATA * WIDTH -1:0] p_w;
159  assign pout = p_reg;
160 
161  generate
162  genvar i;
163  for (i = 0; i < 4; i = i+1) begin: byte_fifo_block
164  assign p_w[WIDTH*i +: WIDTH] = a_reg[WIDTH*i +: WIDTH] + sub_r ? -b_reg[WIDTH*i +: WIDTH] : b_reg[WIDTH*i +: WIDTH];
165  end
166  endgenerate
167 
168 
169  always @ (posedge clk) begin
170  if (rst) a_reg <= 0;
171  else if (cea) a_reg <= ain;
172 
173  if (rst) b_reg <= 0;
174  else if (ceb) b_reg <= bin;
175 
176  sub_r <= subtract;
177 
178  if (rst) p_reg <= 0;
179  if (cep) p_reg <= p_w;
180  end
181 `endif
182 endmodule
183