Line 93... |
Line 93... |
"module\tqtrstage(i_clk, i_rst, i_ce, i_sync, i_data, o_data, o_sync);\n"
|
"module\tqtrstage(i_clk, i_rst, i_ce, i_sync, i_data, o_data, o_sync);\n"
|
"\tparameter IWIDTH=16, OWIDTH=IWIDTH+1;\n"
|
"\tparameter IWIDTH=16, OWIDTH=IWIDTH+1;\n"
|
"\t// Parameters specific to the core that should be changed when this\n"
|
"\t// Parameters specific to the core that should be changed when this\n"
|
"\t// core is built ... Note that the minimum LGSPAN is 2. Smaller \n"
|
"\t// core is built ... Note that the minimum LGSPAN is 2. Smaller \n"
|
"\t// spans must use the fftdoubles stage.\n"
|
"\t// spans must use the fftdoubles stage.\n"
|
"\tparameter\tLGWIDTH=8, ODD=0, INVERSE=0,SHIFT=0;\n"
|
"\tparameter\tLGWIDTH=8, ODD=0, INVERSE=0,SHIFT=0,ROUND=0;\n"
|
"\tinput\t i_clk, i_rst, i_ce, i_sync;\n"
|
"\tinput\t i_clk, i_rst, i_ce, i_sync;\n"
|
"\tinput\t [(2*IWIDTH-1):0] i_data;\n"
|
"\tinput\t [(2*IWIDTH-1):0] i_data;\n"
|
"\toutput\treg [(2*OWIDTH-1):0] o_data;\n"
|
"\toutput\treg [(2*OWIDTH-1):0] o_data;\n"
|
"\toutput\treg o_sync;\n"
|
"\toutput\treg o_sync;\n"
|
"\t\n"
|
"\t\n"
|
Line 125... |
Line 125... |
"\tassign\ti_data_i = i_data[(IWIDTH-1):0];\n"
|
"\tassign\ti_data_i = i_data[(IWIDTH-1):0];\n"
|
"\n"
|
"\n"
|
"\treg [(2*OWIDTH-1):0] omem;\n"
|
"\treg [(2*OWIDTH-1):0] omem;\n"
|
"\n"
|
"\n"
|
"\twire [(IWIDTH-1):0] rnd;\n"
|
"\twire [(IWIDTH-1):0] rnd;\n"
|
"\tassign rnd = ((IWIDTH+1-OWIDTH-SHIFT)!=0) ? { {(IWIDTH-1){1'b0}}, (OWIDTH<IWIDTH+1)? 1'b1:1'b0 } : {{(IWIDTH){1'b0}}};\n"
|
"\tgenerate\n"
|
|
"\tif ((ROUND)&&((IWIDTH+1-OWIDTH-SHIFT)>0))\n"
|
|
"\t\tassign rnd = { {(IWIDTH-1){1'b0}}, 1'b1 };\n"
|
|
"\telse\n"
|
|
"\t\tassign rnd = { {(IWIDTH){1'b0}}};\n"
|
|
"\tendgenerate\n"
|
"\n"
|
"\n"
|
"\talways @(posedge i_clk)\n"
|
"\talways @(posedge i_clk)\n"
|
"\t\tif (i_rst)\n"
|
"\t\tif (i_rst)\n"
|
"\t\tbegin\n"
|
"\t\tbegin\n"
|
"\t\t\twait_for_sync <= 1'b1;\n"
|
"\t\t\twait_for_sync <= 1'b1;\n"
|
Line 156... |
Line 161... |
"\t\t\t\tpipeline[2:0] <= { pipeline[1:0], 1'b0 };\n"
|
"\t\t\t\tpipeline[2:0] <= { pipeline[1:0], 1'b0 };\n"
|
"\n"
|
"\n"
|
"\t\t\t// In sequence, clock = 1\n"
|
"\t\t\t// In sequence, clock = 1\n"
|
"\t\t\tif (pipeline[1])\n"
|
"\t\t\tif (pipeline[1])\n"
|
"\t\t\tbegin\n"
|
"\t\t\tbegin\n"
|
"\t\t\t\tob_a <= { sum_r[(IWIDTH):(IWIDTH+1-OWIDTH)],\n"
|
"\t\t\t\tob_a <= { sum_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)],\n"
|
"\t\t\t\t\t\tsum_i[(IWIDTH):(IWIDTH+1-OWIDTH)] };\n"
|
"\t\t\t\t\t\tsum_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)] };\n"
|
"\t\t\t\t// on Even, W = e^{-j2pi 1/4 0} = 1\n"
|
"\t\t\t\t// on Even, W = e^{-j2pi 1/4 0} = 1\n"
|
"\t\t\t\tif (~ODD)\n"
|
"\t\t\t\tif (ODD == 0)\n"
|
"\t\t\t\tbegin\n"
|
"\t\t\t\tbegin\n"
|
"\t\t\t\t\tob_b_r <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_r <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
|
// "\t\t\t\t\tob_b_r <= { (OWIDTH) {1'b0} };\n"
|
|
// "\t\t\t\t\tob_b_i <= { (OWIDTH) {1'b0} };\n"
|
"\t\t\t\tend else if (~INVERSE) begin\n"
|
"\t\t\t\tend else if (~INVERSE) begin\n"
|
"\t\t\t\t\t// on Odd, W = e^{-j2pi 1/4} = -j\n"
|
"\t\t\t\t\t// on Odd, W = e^{-j2pi 1/4} = -j\n"
|
"\t\t\t\t\tob_b_r <= diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_r <= diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
|
// "\t\t\t\t\tob_b_r <= { (OWIDTH) {1'b0} };\n"
|
|
// "\t\t\t\t\tob_b_i <= { (OWIDTH) {1'b0} };\n"
|
"\t\t\t\tend else begin\n"
|
"\t\t\t\tend else begin\n"
|
"\t\t\t\t\t// on Odd, W = e^{j2pi 1/4} = j\n"
|
"\t\t\t\t\t// on Odd, W = e^{j2pi 1/4} = j\n"
|
"\t\t\t\t\tob_b_r <= n_diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_r <= n_diff_i[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
"\t\t\t\t\tob_b_i <= diff_r[(IWIDTH-SHIFT):(IWIDTH+1-OWIDTH-SHIFT)];\n"
|
|
// "\t\t\t\t\tob_b_r <= { (OWIDTH) {1'b0} };\n"
|
|
// "\t\t\t\t\tob_b_i <= { (OWIDTH) {1'b0} };\n"
|
|
|
"\t\t\t\tend\n"
|
"\t\t\t\tend\n"
|
"\t\t\t\t// (wire) ob_b <= { ob_b_r, ob_b_i };\n"
|
"\t\t\t\t// (wire) ob_b <= { ob_b_r, ob_b_i };\n"
|
"\t\t\tend\n"
|
"\t\t\tend\n"
|
"\t\t\t// In sequence, clock = 2\n"
|
"\t\t\t// In sequence, clock = 2\n"
|
"\t\t\tif (pipeline[2])\n"
|
"\t\t\tif (pipeline[2])\n"
|
Line 234... |
Line 246... |
"//\n%s"
|
"//\n%s"
|
"//\n", prjname, creator);
|
"//\n", prjname, creator);
|
|
|
fprintf(fp, "%s", cpyleft);
|
fprintf(fp, "%s", cpyleft);
|
fprintf(fp,
|
fprintf(fp,
|
"module dblstage(i_clk, i_rst, i_ce, i_sync, i_left, i_right, o_left, o_right, o_sync);\n"
|
"module\tdblstage(i_clk, i_rst, i_ce, i_sync, i_left, i_right, o_left, o_right, o_sync);\n"
|
"\tparameter\tIWIDTH=16,OWIDTH=IWIDTH+1, SHIFT=0;\n"
|
"\tparameter\tIWIDTH=16,OWIDTH=IWIDTH+1, SHIFT=0;\n"
|
"\tinput\t\ti_clk, i_rst, i_ce, i_sync;\n"
|
"\tinput\t\ti_clk, i_rst, i_ce, i_sync;\n"
|
"\tinput\t\t[(2*IWIDTH-1):0]\ti_left, i_right;\n"
|
"\tinput\t\t[(2*IWIDTH-1):0]\ti_left, i_right;\n"
|
"\toutput\twire\t[(2*OWIDTH-1):0]\to_left, o_right;\n"
|
"\toutput\twire\t[(2*OWIDTH-1):0]\to_left, o_right;\n"
|
"\toutput\treg\t\t\to_sync;\n"
|
"\toutput\treg\t\t\to_sync;\n"
|
Line 930... |
Line 942... |
// strcpy(&memfile[strlen(memfile)-2], ".hex");
|
// strcpy(&memfile[strlen(memfile)-2], ".hex");
|
cmem = fopen(memfile, "w");
|
cmem = fopen(memfile, "w");
|
// fprintf(cmem, "// CBITS = %d, inv = %s\n", cbits, (inv)?"true":"false");
|
// fprintf(cmem, "// CBITS = %d, inv = %s\n", cbits, (inv)?"true":"false");
|
for(int i=0; i<stage/2; i++) {
|
for(int i=0; i<stage/2; i++) {
|
int k = 2*i+odd;
|
int k = 2*i+odd;
|
double W = ((inv)?1:-1)*2.0*M_PI*k/(double)stage;
|
double W = ((inv)?1:-1)*2.0*M_PI*k/(double)(2*stage);
|
double c, s;
|
double c, s;
|
long long ic, is, vl;
|
long long ic, is, vl;
|
|
|
c = cos(W); s = sin(W);
|
c = cos(W); s = sin(W);
|
ic = (long long)((double)((1ll<<(cbits-2)) * c + 0.5));
|
ic = (long long)((double)((1ll<<(cbits-2)) * c + 0.5));
|
Line 1346... |
Line 1358... |
fprintf(vmain, "\t%sfftstage_o%d\t#(IWIDTH,IWIDTH+%d,IWIDTH+1,%d,%d,%d,0)\tstage_o%d(i_clk, i_rst, i_ce,\n",
|
fprintf(vmain, "\t%sfftstage_o%d\t#(IWIDTH,IWIDTH+%d,IWIDTH+1,%d,%d,%d,0)\tstage_o%d(i_clk, i_rst, i_ce,\n",
|
(inverse)?"i":"", fftsize,
|
(inverse)?"i":"", fftsize,
|
xtracbits,
|
xtracbits,
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits),
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits),
|
fftsize);
|
fftsize);
|
fprintf(vmain, "\t\t\t(~i_rst), i_left, w_o%d, w_os%d);\n", fftsize, fftsize);
|
fprintf(vmain, "\t\t\t(~i_rst), i_right, w_o%d, w_os%d);\n", fftsize, fftsize);
|
fprintf(vmain, "\n\n");
|
fprintf(vmain, "\n\n");
|
|
|
sprintf(fname, "%s/%sfftstage_e%d.v", coredir, (inverse)?"i":"", fftsize);
|
sprintf(fname, "%s/%sfftstage_e%d.v", coredir, (inverse)?"i":"", fftsize);
|
build_stage(fname, fftsize/2, 0, nbits, inverse, xtracbits); // Even stage
|
build_stage(fname, fftsize/2, 0, nbits, inverse, xtracbits); // Even stage
|
sprintf(fname, "%s/%sfftstage_o%d.v", coredir, (inverse)?"i":"", fftsize);
|
sprintf(fname, "%s/%sfftstage_o%d.v", coredir, (inverse)?"i":"", fftsize);
|
Line 1369... |
Line 1381... |
fprintf(vmain, "\twire\t\tw_s%d, w_os%d;\n", tmp_size, tmp_size);
|
fprintf(vmain, "\twire\t\tw_s%d, w_os%d;\n", tmp_size, tmp_size);
|
fprintf(vmain, "\twire\t[%d:0]\tw_e%d, w_o%d;\n", 2*obits-1, tmp_size, tmp_size);
|
fprintf(vmain, "\twire\t[%d:0]\tw_e%d, w_o%d;\n", 2*obits-1, tmp_size, tmp_size);
|
fprintf(vmain, "\t%sfftstage_e%d\t#(%d,%d,%d,%d,%d,%d,%d)\tstage_e%d(i_clk, i_rst, i_ce,\n",
|
fprintf(vmain, "\t%sfftstage_e%d\t#(%d,%d,%d,%d,%d,%d,%d)\tstage_e%d(i_clk, i_rst, i_ce,\n",
|
(inverse)?"i":"", tmp_size,
|
(inverse)?"i":"", tmp_size,
|
nbits, nbits+xtracbits, obits,
|
nbits, nbits+xtracbits, obits,
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits), dropbit,
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits), (dropbit)?0:0,
|
tmp_size);
|
tmp_size);
|
fprintf(vmain, "\t\t\t\t\t\tw_s%d, w_e%d, w_e%d, w_s%d);\n", tmp_size<<1, tmp_size<<1, tmp_size, tmp_size);
|
fprintf(vmain, "\t\t\t\t\t\tw_s%d, w_e%d, w_e%d, w_s%d);\n", tmp_size<<1, tmp_size<<1, tmp_size, tmp_size);
|
fprintf(vmain, "\t%sfftstage_o%d\t#(%d,%d,%d,%d,%d,%d,%d)\tstage_o%d(i_clk, i_rst, i_ce,\n",
|
fprintf(vmain, "\t%sfftstage_o%d\t#(%d,%d,%d,%d,%d,%d,%d)\tstage_o%d(i_clk, i_rst, i_ce,\n",
|
(inverse)?"i":"", tmp_size,
|
(inverse)?"i":"", tmp_size,
|
nbits, nbits+xtracbits, obits,
|
nbits, nbits+xtracbits, obits,
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits), dropbit,
|
lgsize, lgtmp-2, lgdelay(nbits,xtracbits), (dropbit)?0:0,
|
tmp_size);
|
tmp_size);
|
fprintf(vmain, "\t\t\t\t\t\tw_s%d, w_o%d, w_o%d, w_os%d);\n", tmp_size<<1, tmp_size<<1, tmp_size, tmp_size);
|
fprintf(vmain, "\t\t\t\t\t\tw_s%d, w_o%d, w_o%d, w_os%d);\n", tmp_size<<1, tmp_size<<1, tmp_size, tmp_size);
|
fprintf(vmain, "\n\n");
|
fprintf(vmain, "\n\n");
|
|
|
sprintf(fname, "%s/%sfftstage_e%d.v", coredir, (inverse)?"i":"", tmp_size);
|
sprintf(fname, "%s/%sfftstage_e%d.v", coredir, (inverse)?"i":"", tmp_size);
|
Line 1400... |
Line 1412... |
obits = maxbitsout;
|
obits = maxbitsout;
|
|
|
fprintf(vmain, "\twire\t\tw_s4, w_os4;\n");
|
fprintf(vmain, "\twire\t\tw_s4, w_os4;\n");
|
fprintf(vmain, "\twire\t[%d:0]\tw_e4, w_o4;\n", 2*obits-1);
|
fprintf(vmain, "\twire\t[%d:0]\tw_e4, w_o4;\n", 2*obits-1);
|
fprintf(vmain, "\tqtrstage\t#(%d,%d,%d,0,%d,%d)\tstage_e4(i_clk, i_rst, i_ce,\n",
|
fprintf(vmain, "\tqtrstage\t#(%d,%d,%d,0,%d,%d)\tstage_e4(i_clk, i_rst, i_ce,\n",
|
nbits, obits, lgsize, (inverse)?1:0, dropbit);
|
nbits, obits, lgsize, (inverse)?1:0, (dropbit)?0:0);
|
fprintf(vmain, "\t\t\t\t\t\tw_s8, w_e8, w_e4, w_s4);\n");
|
fprintf(vmain, "\t\t\t\t\t\tw_s8, w_e8, w_e4, w_s4);\n");
|
fprintf(vmain, "\tqtrstage\t#(%d,%d,%d,1,%d,%d)\tstage_o4(i_clk, i_rst, i_ce,\n",
|
fprintf(vmain, "\tqtrstage\t#(%d,%d,%d,1,%d,%d)\tstage_o4(i_clk, i_rst, i_ce,\n",
|
nbits, obits, lgsize, (inverse)?1:0, dropbit);
|
nbits, obits, lgsize, (inverse)?1:0, (dropbit)?0:0);
|
fprintf(vmain, "\t\t\t\t\t\tw_s8, w_o8, w_o4, w_os4);\n");
|
fprintf(vmain, "\t\t\t\t\t\tw_s8, w_o8, w_o4, w_os4);\n");
|
dropbit ^= 1;
|
dropbit ^= 1;
|
nbits = obits;
|
nbits = obits;
|
tmp_size >>= 1; lgtmp--;
|
tmp_size >>= 1; lgtmp--;
|
}
|
}
|
Line 1418... |
Line 1430... |
obits = nbitsout;
|
obits = nbitsout;
|
if ((maxbitsout>0)&&(obits > maxbitsout))
|
if ((maxbitsout>0)&&(obits > maxbitsout))
|
obits = maxbitsout;
|
obits = maxbitsout;
|
fprintf(vmain, "\twire\t\tw_s2;\n");
|
fprintf(vmain, "\twire\t\tw_s2;\n");
|
fprintf(vmain, "\twire\t[%d:0]\tw_e2, w_o2;\n", 2*obits-1);
|
fprintf(vmain, "\twire\t[%d:0]\tw_e2, w_o2;\n", 2*obits-1);
|
fprintf(vmain, "\tdblstage\t#(%d,%d,%d)\tstage_2(i_clk, i_rst, i_ce,\n", nbits, obits,dropbit);
|
fprintf(vmain, "\tdblstage\t#(%d,%d,%d)\tstage_2(i_clk, i_rst, i_ce,\n", nbits, obits,(dropbit)?0:1);
|
fprintf(vmain, "\t\t\t\t\tw_s4, w_e4, w_o4, w_e2, w_o2, w_s2);\n");
|
fprintf(vmain, "\t\t\t\t\tw_s4, w_e4, w_o4, w_e2, w_o2, w_s2);\n");
|
|
|
fprintf(vmain, "\n\n");
|
fprintf(vmain, "\n\n");
|
nbits = obits;
|
nbits = obits;
|
}
|
}
|