x393
1.0
FPGAcodeforElphelNC393camera
dsp_addsub_simd.v
Go to the documentation of this file.
1
39
`timescale 1ns/1ps
40
41
module
dsp_addsub_simd
#(
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
71
DSP48E1
#(
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
184
dsp_addsub_simd.3349ceb
3349ceb
Definition:
dsp_addsub_simd.v:50
dsp_addsub_simd.DSP48E1
DSP48E1_i DSP48E1
Definition:
dsp_addsub_simd.v:71
dsp_addsub_simd.3348cea
3348cea
Definition:
dsp_addsub_simd.v:49
dsp_addsub_simd.3352pout
[NUM_DATA * WIDTH -1:0] 3352pout
Definition:
dsp_addsub_simd.v:53
dsp_addsub_simd.3351cep
3351cep
Definition:
dsp_addsub_simd.v:52
dsp_addsub_simd.3343WIDTH
3343WIDTH24
Definition:
dsp_addsub_simd.v:43
dsp_addsub_simd.3342NUM_DATA
3342NUM_DATA2
Definition:
dsp_addsub_simd.v:42
dsp_addsub_simd.3344clk
3344clk
Definition:
dsp_addsub_simd.v:45
dsp_addsub_simd.3346ain
[NUM_DATA * WIDTH -1:0] 3346ain
Definition:
dsp_addsub_simd.v:47
dsp_addsub_simd.3353inmode
3353inmodewire[4:0]
Definition:
dsp_addsub_simd.v:56
dsp_addsub_simd.3347bin
[NUM_DATA * WIDTH -1:0] 3347bin
Definition:
dsp_addsub_simd.v:48
dsp_addsub_simd
Definition:
dsp_addsub_simd.v:41
dsp_addsub_simd.3354alumode
3354alumodewire[3:0]
Definition:
dsp_addsub_simd.v:63
dsp_addsub_simd.3345rst
3345rst
Definition:
dsp_addsub_simd.v:46
dsp_addsub_simd.3350subtract
3350subtract
Definition:
dsp_addsub_simd.v:51
dsp_addsub_simd.3355opmode
3355opmodewire[6:0]
Definition:
dsp_addsub_simd.v:66
dsp
dsp_addsub_simd.v
Generated by
1.8.12