Estoy tratando de implementar Fast Fourier Transform en Verilog para una muestra de 32 puntos y he escrito el siguiente módulo de mariposa:
module bffly(
input wire signed [15:0] xa_r,
input wire signed [15:0] xa_i,
input wire signed [15:0] xb_r,
input wire signed [15:0] xb_i,
input wire signed [15:0] w_r,
input wire signed [15:0] w_i,
output reg signed [15:0] ya_r,
output reg signed [15:0] ya_i,
output reg signed [15:0] yb_r,
output reg signed [15:0] yb_i,
output reg ready,
input wire clk,
input wire enable
);
// ya = xa + xb*w
// yb = xa - xb*w
// ya_r = xa_r + xb_r*w_r - xb_i*w_i
// ya_i = xa_i + xb_r*w_i + xb_i*w_r
// yb_r = xa_r - xb_r*w_r + xb_i*w_i
// yb_i = xa_i - xb_r*w_i - xb_i*w_r
wire signed [31:0] temp_r_32;
wire signed [31:0] temp_i_32;
wire signed [15:0] temp_r_16;
wire signed [15:0] temp_i_16;
assign temp_r_32 = xb_r*w_r - xb_i*w_i;
assign temp_i_32 = xb_r*w_i + xb_i*w_r;
assign temp_r_16 = {temp_r_32[31], temp_r_32[28:14]};
assign temp_i_16 = {temp_i_32[31], temp_i_32[28:14]};
always@(posedge clk)
begin
if (enable)
begin
ya_r <= xa_r + temp_r_16;
ya_i <= xa_i + temp_i_16;
yb_r <= xa_r - temp_r_16;
yb_i <= xa_i - temp_i_16;
ready <= 1;
end
else ready<= 0;
end
endmodule
El módulo mariposa está funcionando correctamente. Lo he comprobado con el dispositivo de prueba.
En el módulo FFT, he hecho varias llamadas al módulo Butterfly. Aquí hay un fragmento de código del módulo fft:
module fft(
input enable1,
input clk,
input [15:0] a0,...,input [15:0] a31,
output [15:0] br0,..., output [15:0] br31,
output [15:0] bi0,..., output [15:0] bi31,
output wand ready,
output wan enable3
);
wire [15:0] wr0, etc. stores the twiddle factors.
reg [15:0] tr0;...,reg [15:0] tr31;
reg [15:0] ti0,...,reg [15:0] ti31;
bffly z12(.ready(enable2),.clk(clk),.enable(enable1),.xa_r(a3),.xa_i(16'b0),.xb_r(a19),.xb_i(16'b0), .w_r(wr0), .w_i(wi0),.ya_r(tr24), .ya_i(ti24),.yb_r(tr25), .yb_i(ti25));
bffly z13 (.ready(enable2),.clk(clk),.enable(enable1),.xa_r(a11),.xa_i(16'b0),.xb_r(a27),.xb_i(16'b0), .w_r(wr0), .w_i(wi0),.ya_r(tr26),.ya_i(ti26), .yb_r(tr27), .yb_i(ti27));
Para todas estas llamadas a la mariposa hay un error como sigue:
El destino tr24 de la asignación concurrente o la conexión del puerto de salida debe ser un tipo de red.
El objetivo tr26 de la asignación concurrente o la conexión del puerto de salida debe ser un tipo de red, respectivamente
Cuando el objetivo se asigna como un cable y no como un registro, entonces funciona bien.
¿Qué hago en este caso?