Todas as famílias de dispositivos de 28 nm, incluindo Stratix® V, Arria® V e Cyclone® V, podem suportar uma estrutura de multiplicador complexo 25x18 usando 3 blocos DSP de precisão variável.
Há uma limitação no software Quartus® II ao usar o Megacore® que implementa esta estrutura usando 4 blocos DSP.
Para contornar essa limitação, use o modelo de código Complex 25x18 Multiply encontrado nos modelos de software Quartus II para inferir seu multiplicador complexo. Para usar este modelo de código, primeiro você precisará abrir um novo arquivo de design e, em seguida, selecionar este modelo a partir dos modelos disponíveis no software Quartus II. Este modelo é encontrado nos modelos Verilog ou VHDL em recursos DSP de > > > Aritmética (Stratix-V, Arria-V e Cyclone-V).
Para sua conveniência, este modelo de código para Verilog está abaixo:
Modelo de Verilog Quartus II
Multiplicação complexa 25x18
Para uso com as famílias Stratix V, Arria-V, Cyclone-V e dispositivos posteriores
módulo complex_25x18(x_r, x_i, y_r, y_i, clock, ena1, ena0, reset, p_r, p_i);
Este modelo é aplicável ao modo complexo 25x18 no Stratix-V
entrada [24:0] x_r;
entrada [24:0] x_i;
entrada [17:0] y_r;
entrada [17:0] y_i;
Stratix-V DSP suporta até 3 pares de clock/ena e 2 sinais de reinicialização assíncrona
clock de entrada;
ena1 de entrada;
ena0 de entrada;
reinicialização de entrada;
saída [43:0] p_r;
saída [43:0] p_i;
Todas as entradas/saídas devem ser assinadas.
Todos os registros de entrada devem usar o mesmo {clock, ena, reset}
Todos os registros de saída devem usar o mesmo {clock, ena, reset}
reg assinado [24:0] x_r_reg, x_i_reg;
reg assinado [17:0] y_r_reg, y_i_reg;
reg assinado [43:0] p_r, p_i;
fio assinado [25:0] a1;
fio assinado [18:0] a2;
fio assinado [18:0] a3;
fio assinado [43:0] p1;
fio assinado [43:0] p2;
fio assinado [43:0] p3;
atribuir a1 = x_r_reg - x_i_reg;
atribuir p1 = a1 * y_i_reg;
atribuir a2 = y_r_reg - y_i_reg;
atribuir p2 = a2 * x_r_reg;
atribuir a3 = y_r_reg y_i_reg;
atribuir p3 = a3 * x_i_reg;
sempre @(posedge clock ou redefinição de posge)
Começar
se (redefinir == 1\'b1)
Começar
x_r_reg <= 0;
x_i_reg <= 0;
y_r_reg <= 0;
y_i_reg <= 0;
p_r <= 0;
p_i <= 0;
Final
Mais
Começar
se (ena0 == 1\'b1)
Começar
x_r_reg <= x_r;
x_i_reg <= x_i;
y_r_reg <= y_r;
y_i_reg <= y_i;
Final
se (ena1 == 1\'b1)
Começar
p_r <= p1 p2;
p_i <= p1 p3;
Final
Final
Final
endmodule