Toutes les familles de périphériques 28 nm, dont Stratix® V, Arria® V et Cyclone® V, peuvent prises en charge une structure multiplicateur complexe 25x18 en utilisant 3 blocs DSP à précision variable.
Le logiciel Quartus® II présente des limites lors de l’utilisation du megacore® qui implémente cette structure en utilisant 4 blocs DSP.
Pour contourner cette limitation, utilisez le modèle de code Multiplicateur complexe 25x18 trouvé dans les modèles logiciels de Quartus II pour inférer votre multiplicateur complexe. Pour utiliser ce modèle de code, vous devrez d’abord ouvrir un nouveau fichier de conception, puis sélectionnez ce modèle dans les modèles disponibles dans le logiciel Quartus II. Ce modèle se trouve dans les modèles Verilog ou VHDL sous conceptions complètes > fonctionnalités Arithmétiques > DSP (Stratix-V, Arria-V et Cyclone-V).
Pour votre commodité, ce modèle de code de Verilog est ci-dessous :
Modèle Verilog Quartus II
Multiplication 25x18 complexe
Pour une utilisation avec les familles de périphériques Stratix V, Arria-V, Cyclone-V et appareils ultérieures
module complex_25x18 (x_r, x_i, y_r, y_i, horloge, ena1, ena0, réinitialiser, p_r, p_i) ;
Ce modèle est applicable au mode 25x18 complexe sur Stratix-V
entrée [24:0] x_r ;
entrée [24:0] x_i ;
entrée [17:0] y_r ;
entrée [17:0] y_i ;
Stratix-V DSP prend en charge jusqu’à 3 paires d’horloge/ena et 2 signaux de réinitialisation async
horloge d’entrée ;
entrée ena1 ;
ena0 d’entrée ;
réinitialisation des entrées ;
sortie [43:0] p_r ;
sortie [43:0] p_i ;
Tous les entrées/sorties doivent être signés.
Tous les registres d’entrée doivent utiliser les mêmes {clock, ena, reset}
Tous les registres de sortie doivent utiliser les mêmes {clock, ena, reset}
rég signé [24:0] x_r_reg, x_i_reg ;
rég signé [17:0] y_r_reg, y_i_reg ;
rég signé [43:0] p_r, p_i ;
fil signé [25:0] a1 ;
fil signé [18:0] a2 ;
fil signé [18:0] a3 ;
fil signé [43:0] p1 ;
fil signé [43:0] p2 ;
fil signé [43:0] p3 ;
assigner a1 = x_r_reg – x_i_reg ;
assigner p1 = a1 * y_i_reg ;
assigner a2 = y_r_reg – y_i_reg ;
assign p2 = a2 * x_r_reg ;
assigner a3 = y_r_reg y_i_reg ;
assign p3 = a3 * x_i_reg ;
toujours @(posedge clock or posedge reset)
Commencer
si (réinitialisation == 1\'b1)
Commencer
x_r_reg < = 0 ;
x_i_reg < = 0 ;
y_r_reg < = 0 ;
y_i_reg < = 0 ;
p_r < = 0 ;
p_i < = 0 ;
Fin
Autre
Commencer
si (ena0 == 1\'b1)
Commencer
x_r_reg <= x_r ;
x_i_reg <= x_i ;
y_r_reg <= y_r ;
y_i_reg < = y_i ;
Fin
si (ena1 == 1\'b1)
Commencer
p_r <= p1 p2 ;
p_i <= p1 p3 ;
Fin
Fin
Fin
endmodule