URL
https://opencores.org/ocsvn/wdsp/wdsp/trunk
Subversion Repositories wdsp
Compare Revisions
- This comparison shows the changes necessary to convert path
/wdsp/trunk/rtl
- from Rev 4 to Rev 5
- ↔ Reverse comparison
Rev 4 → Rev 5
/verilog/minsoc/mc/mc_cs_rf.v
0,0 → 1,276
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Chip Select Register File //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_cs_rf.v,v 1.6 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.6 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_cs_rf.v,v $ |
// Revision 1.6 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.5 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.4 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.3 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:42 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_cs_rf(clk, rst, wb_we_i, din, rf_we, addr, csc, tms, poc, csc_mask, cs, |
wp_err, lmr_req, lmr_ack, init_req, init_ack ); |
|
input clk, rst; |
input wb_we_i; |
input [31:0] din; |
input rf_we; |
input [31:0] addr; |
|
output [31:0] csc; |
output [31:0] tms; |
input [31:0] poc; |
input [31:0] csc_mask; |
output cs; |
output wp_err; |
|
output lmr_req; |
input lmr_ack; |
output init_req; |
input init_ack; |
|
parameter [2:0] this_cs = 0; |
parameter [3:0] reg_select = this_cs + 2; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers and Wires |
// |
|
reg [31:0] csc; |
reg [31:0] tms; |
wire sel; |
wire cs_d; |
wire wp; |
reg inited; |
reg init_req; |
reg init_req_we; |
reg lmr_req; |
reg lmr_req_we; |
|
//////////////////////////////////////////////////////////////////// |
// |
// A kludge for cases where there is no clock during reset ... |
// |
|
reg rst_r1, rst_r2; |
|
always @(posedge clk or posedge rst) |
if(rst) rst_r1 <= #1 1'b1; |
else rst_r1 <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) rst_r2 <= #1 1'b1; |
else rst_r2 <= #1 rst_r1; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Write Logic |
// |
|
reg [6:0] addr_r; |
|
always @(posedge clk) |
addr_r <= #1 addr[6:0]; |
|
assign sel = addr_r[6:3] == reg_select[3:0]; |
|
always @(posedge clk) |
if(rst_r2) csc <= #1 (this_cs[2:0] == `MC_DEF_SEL) ? |
{26'h0, poc[1:0], 1'b0, poc[3:2], (poc[3:2] != 2'b00)} : 32'h0; |
else |
if(rf_we & sel & !addr_r[2]) csc <= #1 din; |
|
always @(posedge clk) |
if(rst_r2) tms <= #1 (this_cs[2:0] == `MC_DEF_SEL) ? |
`MC_DEF_POR_TMS : 32'h0; |
else |
if(rf_we & sel & addr_r[2]) tms <= #1 din; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Load Mode Register Request/Ack Logic |
// |
always @(posedge clk or posedge rst) |
if(rst) lmr_req_we <= #1 1'b0; |
else lmr_req_we <= #1 rf_we & sel & addr_r[2]; |
|
always @(posedge clk or posedge rst) |
if(rst) lmr_req <= #1 1'b0; |
else |
if(lmr_req_we & (csc[3:1] == `MC_MEM_TYPE_SDRAM)) |
lmr_req <= #1 inited; |
else |
if(lmr_ack) lmr_req <= #1 1'b0; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Initialize SDRAM Request/Ack & tracking logic |
// |
always @(posedge clk or posedge rst) |
if(rst) init_req_we <= #1 1'b0; |
else init_req_we <= #1 rf_we & sel & !addr_r[2]; |
|
always @(posedge clk or posedge rst) |
if(rst) init_req <= #1 1'b0; |
else |
if(init_req_we & (csc[3:1] == `MC_MEM_TYPE_SDRAM) & csc[0] & !inited) |
init_req <= #1 1'b1; |
else |
if(init_ack) init_req <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) inited <= #1 1'b0; |
else |
if(init_ack) inited <= #1 1'b1; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Chip Select Generation Logic |
// |
|
assign cs_d = ((csc[23:16] & csc_mask[7:0]) == (addr[28:21] & csc_mask[7:0])) & csc[0]; |
|
assign wp = wb_we_i & csc[8]; |
|
assign wp_err = cs_d & wp; |
assign cs = cs_d & !wp; |
|
endmodule |
|
|
|
// This dummy is used to terminate the outputs for non existing Chip Selects |
module mc_cs_rf_dummy(clk, rst, wb_we_i, din, rf_we, addr, csc, tms, poc, csc_mask, cs, |
wp_err, lmr_req, lmr_ack, init_req, init_ack ); |
|
parameter [2:0] this_cs = 0; |
|
input clk, rst; |
input wb_we_i; |
input [31:0] din; |
input rf_we; |
input [31:0] addr; |
|
output [31:0] csc; |
output [31:0] tms; |
input [31:0] poc; |
input [31:0] csc_mask; |
output cs; |
output wp_err; |
|
output lmr_req; |
input lmr_ack; |
output init_req; |
input init_ack; |
|
assign csc = 32'h0; |
assign tms = 32'h0; |
assign cs = 1'b0; |
assign wp_err = 1'b0; |
assign lmr_req = 1'b0; |
assign init_req = 1'b0; |
|
endmodule |
/verilog/minsoc/mc/mc_mem_if.v
0,0 → 1,362
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Memory Bus Interface //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_mem_if.v,v 1.6 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.6 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_mem_if.v,v $ |
// Revision 1.6 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.5 2001/12/21 05:09:29 rudi |
// |
// - Fixed combinatorial loops in synthesis |
// - Fixed byte select bug |
// |
// Revision 1.4 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.3 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.2 2001/09/02 02:28:28 rudi |
// |
// Many fixes for minor bugs that showed up in gate level simulations. |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/14 01:57:37 rudi |
// |
// |
// Fixed a potential bug in a corner case situation where the TMS register |
// does not propegate properly during initialisation. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:48 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_mem_if(clk, rst, mc_clk, mc_br, mc_bg, |
mc_addr, mc_data_o, mc_dp_o, mc_data_oe, |
mc_dqm, mc_oe_, mc_we_, mc_cas_, mc_ras_, mc_cke_, mc_cs_, |
mc_adsc_, mc_adv_, mc_ack, mc_rp, mc_c_oe, mc_c_oe_d, |
mc_br_r, mc_bg_d, mc_data_od, mc_dp_od, mc_addr_d, mc_ack_r, |
we_, ras_, cas_, cke_, mc_adsc_d, mc_adv_d, cs_en, rfr_ack, |
cs_need_rfr, lmr_sel, spec_req_cs, cs, fs, data_oe, susp_sel, |
suspended_o, oe_, wb_cyc_i, wb_stb_i, wb_sel_i, wb_cycle, |
wr_cycle, mc_data_ir, mc_data_i, mc_dp_i, mc_sts_ir, mc_sts_i, |
mc_zz_o |
); |
// Memory Interface |
input clk; |
input rst; |
input mc_clk; |
input mc_br; |
output mc_bg; |
output [23:0] mc_addr; |
output [31:0] mc_data_o; |
output [3:0] mc_dp_o; |
output mc_data_oe; |
output [3:0] mc_dqm; |
output mc_oe_; |
output mc_we_; |
output mc_cas_; |
output mc_ras_; |
output mc_cke_; |
output [7:0] mc_cs_; |
output mc_adsc_; |
output mc_adv_; |
input mc_ack; |
output mc_rp; |
output mc_c_oe; |
output [35:0] mc_data_ir; |
output mc_sts_ir; |
output mc_zz_o; |
|
// Internal Interface |
output mc_br_r; |
input mc_bg_d; |
input data_oe; |
input susp_sel; |
input suspended_o; |
input [31:0] mc_data_od; |
input [3:0] mc_dp_od; |
input [23:0] mc_addr_d; |
output mc_ack_r; |
input wb_cyc_i; |
input wb_stb_i; |
input [3:0] wb_sel_i; |
input wb_cycle; |
input wr_cycle; |
input oe_ ; |
input we_; |
input ras_; |
input cas_; |
input cke_; |
input cs_en; |
input rfr_ack; |
input [7:0] cs_need_rfr; |
input lmr_sel; |
input [7:0] spec_req_cs; |
input [7:0] cs; |
input fs; |
input mc_adsc_d; |
input mc_adv_d; |
input mc_c_oe_d; |
input [31:0] mc_data_i; |
input [3:0] mc_dp_i; |
input mc_sts_i; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Wires |
// |
|
reg mc_data_oe; |
reg [31:0] mc_data_o; |
reg [3:0] mc_dp_o; |
reg [3:0] mc_dqm; |
reg [3:0] mc_dqm_r; |
reg [23:0] mc_addr; |
reg mc_oe_; |
reg mc_we_; |
reg mc_cas_; |
reg mc_ras_; |
wire mc_cke_; |
reg [7:0] mc_cs_; |
reg mc_bg; |
reg mc_adsc_; |
reg mc_adv_; |
reg mc_br_r; |
reg mc_ack_r; |
reg mc_rp; |
reg mc_c_oe; |
reg mc_zz_o; |
|
reg [35:0] mc_data_ir; |
reg mc_sts_ir; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Misc Logic |
// |
|
always @(posedge mc_clk) |
mc_zz_o <= #1 suspended_o; |
|
always @(posedge mc_clk) |
mc_sts_ir <= #1 mc_sts_i; |
|
always @(posedge mc_clk) |
mc_data_ir <= #1 {mc_dp_i, mc_data_i}; |
|
always @(posedge mc_clk) |
mc_c_oe <= #1 mc_c_oe_d; |
|
always @(posedge mc_clk) |
mc_rp <= #1 !suspended_o & !fs; |
|
always @(posedge mc_clk) |
mc_br_r <= #1 mc_br; |
|
always @(posedge mc_clk) |
mc_ack_r <= #1 mc_ack; |
|
always @(posedge mc_clk) |
mc_bg <= #1 mc_bg_d; |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_data_oe <= #1 1'b0; |
else mc_data_oe <= #1 data_oe & !susp_sel & mc_c_oe_d; |
|
always @(posedge mc_clk) |
mc_data_o <= #1 mc_data_od; |
|
always @(posedge mc_clk) |
mc_dp_o <= #1 mc_dp_od; |
|
always @(posedge mc_clk) |
mc_addr <= #1 mc_addr_d; |
|
always @(posedge clk) |
if(wb_cyc_i & wb_stb_i) |
mc_dqm_r <= #1 wb_sel_i; |
|
reg [3:0] mc_dqm_r2; |
always @(posedge clk) |
mc_dqm_r2 <= #1 mc_dqm_r; |
|
always @(posedge mc_clk) |
mc_dqm <= #1 susp_sel ? 4'hf : |
data_oe ? ~mc_dqm_r2 : |
(wb_cycle & !wr_cycle) ? 4'h0 : 4'hf; |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_oe_ <= #1 1'b1; |
else mc_oe_ <= #1 oe_ | susp_sel; |
|
always @(posedge mc_clk) |
mc_we_ <= #1 we_; |
|
always @(posedge mc_clk) |
mc_cas_ <= #1 cas_; |
|
always @(posedge mc_clk) |
mc_ras_ <= #1 ras_; |
|
assign mc_cke_ = cke_; |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[0] <= #1 1'b1; |
else |
mc_cs_[0] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[0] : |
lmr_sel ? spec_req_cs[0] : |
cs[0] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[1] <= #1 1'b1; |
else |
mc_cs_[1] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[1] : |
lmr_sel ? spec_req_cs[1] : |
cs[1] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[2] <= #1 1'b1; |
else |
mc_cs_[2] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[2] : |
lmr_sel ? spec_req_cs[2] : |
cs[2] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[3] <= #1 1'b1; |
else |
mc_cs_[3] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[3] : |
lmr_sel ? spec_req_cs[3] : |
cs[3] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[4] <= #1 1'b1; |
else |
mc_cs_[4] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[4] : |
lmr_sel ? spec_req_cs[4] : |
cs[4] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[5] <= #1 1'b1; |
else |
mc_cs_[5] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[5] : |
lmr_sel ? spec_req_cs[5] : |
cs[5] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[6] <= #1 1'b1; |
else |
mc_cs_[6] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[6] : |
lmr_sel ? spec_req_cs[6] : |
cs[6] |
)); |
|
always @(posedge mc_clk or posedge rst) |
if(rst) mc_cs_[7] <= #1 1'b1; |
else |
mc_cs_[7] <= #1 ~(cs_en & ( |
(rfr_ack | susp_sel) ? cs_need_rfr[7] : |
lmr_sel ? spec_req_cs[7] : |
cs[7] |
)); |
|
always @(posedge mc_clk) |
mc_adsc_ <= #1 ~mc_adsc_d; |
|
always @(posedge mc_clk) |
mc_adv_ <= #1 ~mc_adv_d; |
|
endmodule |
/verilog/minsoc/mc/mc_defines.v
0,0 → 1,234
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Definitions //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_defines.v,v 1.7 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.7 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_defines.v,v $ |
// Revision 1.7 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.6 2001/12/12 06:35:15 rudi |
// *** empty log message *** |
// |
// Revision 1.5 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.4 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.3 2001/09/10 13:44:17 rudi |
// *** empty log message *** |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug |
// fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:38 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`timescale 1ns / 10ps |
|
///////////////////////////////////////////////////////////////////// |
// |
// This define selects how the WISHBONE interface determines if |
// the internal register file is selected. |
// This should be a simple address decoder. "wb_addr_i" is the |
// WISHBONE address bus (32 bits wide). |
`define MC_REG_SEL (wb_addr_i[27] == 1'b1) |
|
// This define selects how the WISHBONE interface determines if |
// the memory is selected. |
// This should be a simple address decoder. "wb_addr_i" is the |
// WISHBONE address bus (32 bits wide). |
`define MC_MEM_SEL (wb_addr_i[27] == 1'b0) |
|
///////////////////////////////////////////////////////////////////// |
// |
// This are the default Power-On Reset values for Chip Select |
// |
|
// This will be defined by the run script for my test bench ... |
// Alternatively force here for synthesis ... |
//`define RUDIS_TB 1 |
|
// Defines which chip select is used for Power On booting |
|
// To run my default testbench default boot CS must be 3 !!! |
`ifdef RUDIS_TB |
`define MC_DEF_SEL 3'h3 |
`else |
`define MC_DEF_SEL 3'h0 |
`endif |
|
// Defines the default (reset) TMS value for the DEF_SEL chip select |
`define MC_DEF_POR_TMS 32'hffff_ffff |
|
|
///////////////////////////////////////////////////////////////////// |
// |
// Define how many Chip Selects to Implement |
// |
//`define MC_HAVE_CS1 1 |
//`define MC_HAVE_CS2 1 |
//`define MC_HAVE_CS3 1 |
//`define MC_HAVE_CS4 1 |
//`define MC_HAVE_CS5 1 |
//`define MC_HAVE_CS6 1 |
//`define MC_HAVE_CS7 1 |
|
|
// To run my default testbench those need to there !!! |
`ifdef RUDIS_TB |
`define MC_HAVE_CS2 1 |
`define MC_HAVE_CS3 1 |
`define MC_HAVE_CS4 1 |
`define MC_HAVE_CS5 1 |
`endif |
|
///////////////////////////////////////////////////////////////////// |
// |
// Init Refresh |
// |
// Number of Refresh Cycles to perform during SDRAM initialization. |
// This varies between SDRAM manufacturer. Typically this value is |
// between 2 and 8. This number must be smaller than 16. |
`define MC_INIT_RFRC_CNT 8 |
|
///////////////////////////////////////////////////////////////////// |
// |
// Power On Delay |
// |
// Most if SDRAMs require some time to initialize before they can be used |
// after power on. If the Memory Controller shall stall after power on to |
// allow SDRAMs to finish the initialization process uncomment the below |
// define statement |
`define MC_POR_DELAY 1 |
|
// This value defines how many MEM_CLK cycles the Memory Controller should |
// stall. Default is 2.5uS. At a 10nS MEM_CLK cycle time, this would 250 |
// cycles. |
`define MC_POR_DELAY_VAL 8'd250 |
|
|
// =============================================================== |
// =============================================================== |
// Various internal defines (DO NOT MODIFY !) |
// =============================================================== |
// =============================================================== |
|
// Register settings encodings |
`define MC_BW_8 2'h0 |
`define MC_BW_16 2'h1 |
`define MC_BW_32 2'h2 |
|
`define MC_MEM_TYPE_SDRAM 3'h0 |
`define MC_MEM_TYPE_SRAM 3'h1 |
`define MC_MEM_TYPE_ACS 3'h2 |
`define MC_MEM_TYPE_SCS 3'h3 |
|
`define MC_MEM_SIZE_64 2'h0 |
`define MC_MEM_SIZE_128 2'h1 |
`define MC_MEM_SIZE_256 2'h2 |
|
// Command Valid, Ras_, Cas_, We_ |
`define MC_CMD_NOP 4'b0111 |
`define MC_CMD_PC 4'b1010 |
`define MC_CMD_ACT 4'b1011 |
`define MC_CMD_WR 4'b1100 |
`define MC_CMD_RD 4'b1101 |
`define MC_CMD_BT 4'b1110 |
`define MC_CMD_ARFR 4'b1001 |
`define MC_CMD_LMR 4'b1000 |
`define MC_CMD_XRD 4'b1111 |
`define MC_CMD_XWR 4'b1110 |
|
`define MC_SINGLE_BANK 1'b0 |
`define MC_ALL_BANKS 1'b1 |
|
`define MC_BA_MASK_VAL 11'h020 |
`define MC_POC_VAL 32'h00000002 |
/verilog/minsoc/mc/mc_refresh.v
0,0 → 1,210
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Refresh Module //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_refresh.v,v 1.4 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.4 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_refresh.v,v $ |
// Revision 1.4 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.3 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.2 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:47 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_refresh(clk, rst, |
cs_need_rfr, ref_int, rfr_req, rfr_ack, |
rfr_ps_val |
); |
|
input clk, rst; |
input [7:0] cs_need_rfr; |
input [2:0] ref_int; |
output rfr_req; |
input rfr_ack; |
input [7:0] rfr_ps_val; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg rfr_en; |
reg [7:0] ps_cnt; |
wire ps_cnt_clr; |
reg rfr_ce; |
reg [7:0] rfr_cnt; |
reg rfr_clr; |
reg rfr_req; |
reg rfr_early; |
|
/* |
Refresh generation |
|
The prescaler generates a 0.48828 uS clock enable |
|
The refresh counter generates the following refresh rates: |
(Actual values are about 0.63% below the desired values). |
This is for a 200 Mhz WISHBONE Bus. |
0.970 uS, |
1.940 |
3.880 |
7.760 |
15.520 |
32.040 |
62.080 |
124.160 uS |
|
(desired values) |
0.976 uS |
1.953 |
3.906 |
7.812 |
15.625 |
31.250 |
62.500 |
125.000 uS |
*/ |
|
//////////////////////////////////////////////////////////////////// |
// |
// Prescaler |
// |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_en <= #1 1'b0; |
else rfr_en <= #1 |cs_need_rfr; |
|
always @(posedge clk or posedge rst) |
if(rst) ps_cnt <= #1 8'h0; |
else |
if(ps_cnt_clr) ps_cnt <= #1 8'h0; |
else |
if(rfr_en) ps_cnt <= #1 ps_cnt + 8'h1; |
|
assign ps_cnt_clr = (ps_cnt == rfr_ps_val) & (rfr_ps_val != 8'h0); |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_early <= #1 1'b0; |
else rfr_early <= #1 (ps_cnt == rfr_ps_val); |
|
//////////////////////////////////////////////////////////////////// |
// |
// Refresh Counter |
// |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_ce <= #1 1'b0; |
else rfr_ce <= #1 ps_cnt_clr; |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_cnt <= #1 8'h0; |
else |
if(rfr_ack) rfr_cnt <= #1 8'h0; |
else |
if(rfr_ce) rfr_cnt <= #1 rfr_cnt + 8'h1; |
|
always @(posedge clk) |
case(ref_int) // synopsys full_case parallel_case |
3'h0: rfr_clr <= #1 rfr_cnt[0] & rfr_early; |
3'h1: rfr_clr <= #1 &rfr_cnt[1:0] & rfr_early; |
3'h2: rfr_clr <= #1 &rfr_cnt[2:0] & rfr_early; |
3'h3: rfr_clr <= #1 &rfr_cnt[3:0] & rfr_early; |
3'h4: rfr_clr <= #1 &rfr_cnt[4:0] & rfr_early; |
3'h5: rfr_clr <= #1 &rfr_cnt[5:0] & rfr_early; |
3'h6: rfr_clr <= #1 &rfr_cnt[6:0] & rfr_early; |
3'h7: rfr_clr <= #1 &rfr_cnt[7:0] & rfr_early; |
endcase |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_req <= #1 1'b0; |
else |
if(rfr_ack) rfr_req <= #1 1'b0; |
else |
if(rfr_clr) rfr_req <= #1 1'b1; |
|
endmodule |
/verilog/minsoc/mc/mc_top.v
0,0 → 1,549
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Top Level //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_top.v,v 1.7 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.7 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_top.v,v $ |
// Revision 1.7 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.6 2001/12/21 05:09:30 rudi |
// |
// - Fixed combinatorial loops in synthesis |
// - Fixed byte select bug |
// |
// Revision 1.5 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.4 2001/09/10 13:44:17 rudi |
// *** empty log message *** |
// |
// Revision 1.3 2001/09/02 02:28:28 rudi |
// |
// Many fixes for minor bugs that showed up in gate level simulations. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:39 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_top(clk_i, rst_i, |
|
wb_data_i, wb_data_o, wb_addr_i, wb_sel_i, wb_we_i, wb_cyc_i, |
wb_stb_i, wb_ack_o, wb_err_o, |
|
susp_req_i, resume_req_i, suspended_o, poc_o, |
|
mc_clk_i, mc_br_pad_i, mc_bg_pad_o, mc_ack_pad_i, |
mc_addr_pad_o, mc_data_pad_i, mc_data_pad_o, mc_dp_pad_i, |
mc_dp_pad_o, mc_doe_pad_doe_o, mc_dqm_pad_o, mc_oe_pad_o_, |
mc_we_pad_o_, mc_cas_pad_o_, mc_ras_pad_o_, mc_cke_pad_o_, |
mc_cs_pad_o_, mc_sts_pad_i, mc_rp_pad_o_, mc_vpen_pad_o, |
mc_adsc_pad_o_, mc_adv_pad_o_, mc_zz_pad_o, mc_coe_pad_coe_o |
); |
|
input clk_i, rst_i; |
|
// -------------------------------------- |
// WISHBONE SLAVE INTERFACE |
input [31:0] wb_data_i; |
output [31:0] wb_data_o; |
input [31:0] wb_addr_i; |
input [3:0] wb_sel_i; |
input wb_we_i; |
input wb_cyc_i; |
input wb_stb_i; |
output wb_ack_o; |
output wb_err_o; |
|
// -------------------------------------- |
// Suspend Resume Interface |
input susp_req_i; |
input resume_req_i; |
output suspended_o; |
|
// POC |
output [31:0] poc_o; |
|
// -------------------------------------- |
// Memory Bus Signals |
input mc_clk_i; |
input mc_br_pad_i; |
output mc_bg_pad_o; |
input mc_ack_pad_i; |
output [23:0] mc_addr_pad_o; |
input [31:0] mc_data_pad_i; |
output [31:0] mc_data_pad_o; |
input [3:0] mc_dp_pad_i; |
output [3:0] mc_dp_pad_o; |
output mc_doe_pad_doe_o; |
output [3:0] mc_dqm_pad_o; |
output mc_oe_pad_o_; |
output mc_we_pad_o_; |
output mc_cas_pad_o_; |
output mc_ras_pad_o_; |
output mc_cke_pad_o_; |
output [7:0] mc_cs_pad_o_; |
input mc_sts_pad_i; |
output mc_rp_pad_o_; |
output mc_vpen_pad_o; |
output mc_adsc_pad_o_; |
output mc_adv_pad_o_; |
output mc_zz_pad_o; |
output mc_coe_pad_coe_o; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Wires |
// |
|
// WISHBONE Interface Interconnects |
wire wb_read_go; |
wire wb_write_go; |
wire wb_first; |
wire wb_wait; |
wire mem_ack; |
|
// Suspend Resume Interface |
wire susp_sel; |
|
// Register File Interconnects |
wire [31:0] rf_dout; |
wire [31:0] csc; |
wire [31:0] tms; |
wire [31:0] sp_csc; |
wire [31:0] sp_tms; |
wire [7:0] cs; |
wire fs; |
wire cs_le; |
wire [7:0] cs_need_rfr; |
wire [2:0] ref_int; |
wire [31:0] mem_dout; |
wire wp_err; |
|
// Address Select Signals |
wire [12:0] row_adr; |
wire [1:0] bank_adr; |
wire cmd_a10; |
wire row_sel; |
wire next_adr; |
wire [10:0] page_size; |
wire lmr_sel; |
wire wr_hold; |
|
// OBCT Signals |
wire bank_set; |
wire bank_clr; |
wire bank_clr_all; |
wire bank_open; |
wire row_same; |
wire [7:0] obct_cs; |
wire any_bank_open; |
|
// Data path Controller Signals |
wire dv; |
wire pack_le0, pack_le1, pack_le2; // Pack Latch Enable |
wire par_err; |
wire [31:0] mc_data_od; |
wire [3:0] mc_dp_od; |
wire [23:0] mc_addr_d; |
wire [35:0] mc_data_ir; |
|
// Refresh Counter Signals |
wire rfr_req; |
wire rfr_ack; |
wire [7:0] rfr_ps_val; |
|
// Memory Timing Block Signals |
wire data_oe; |
wire oe_; |
wire we_; |
wire cas_; |
wire ras_; |
wire cke_; |
wire lmr_req; |
wire lmr_ack; |
wire init_req; |
wire init_ack; |
wire [7:0] spec_req_cs; |
wire cs_en; |
wire wb_cycle, wr_cycle; |
wire [31:0] tms_s; |
wire [31:0] csc_s; |
wire mc_c_oe_d; |
wire mc_br_r; |
wire mc_bg_d; |
wire mc_adsc_d; |
wire mc_adv_d; |
wire mc_ack_r; |
wire err; |
wire mc_sts_i; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Misc Logic |
// |
|
assign obct_cs = (rfr_ack | susp_sel) ? cs_need_rfr : |
(lmr_ack | init_ack) ? spec_req_cs : cs; |
|
assign lmr_sel = lmr_ack | init_ack; |
|
assign tms_s = lmr_sel ? sp_tms : tms; |
assign csc_s = lmr_sel ? sp_csc : csc; |
|
|
wire not_mem_cyc; |
|
assign not_mem_cyc = wb_cyc_i & wb_stb_i & !( `MC_MEM_SEL ); |
|
reg mem_ack_r; |
|
always @(posedge clk_i) |
mem_ack_r <= #1 mem_ack; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Modules |
// |
|
mc_rf u0( |
.clk( clk_i ), |
.rst( rst_i ), |
.wb_data_i( wb_data_i ), |
.rf_dout( rf_dout ), |
.wb_addr_i( wb_addr_i ), |
.wb_we_i( wb_we_i ), |
.wb_cyc_i( wb_cyc_i ), |
.wb_stb_i( wb_stb_i ), |
.wb_ack_o( ), |
.wp_err( wp_err ), |
.csc( csc ), |
.tms( tms ), |
.poc( poc_o ), |
.sp_csc( sp_csc ), |
.sp_tms( sp_tms ), |
.cs( cs ), |
.mc_data_i( mc_data_ir[31:0]), |
.mc_sts( mc_sts_ir ), |
.mc_vpen( mc_vpen_pad_o ), |
.fs( fs ), |
.cs_le( cs_le ), |
.cs_le_d( cs_le_d ), |
.cs_need_rfr( cs_need_rfr ), |
.ref_int( ref_int ), |
.rfr_ps_val( rfr_ps_val ), |
.spec_req_cs( spec_req_cs ), |
.init_req( init_req ), |
.init_ack( init_ack ), |
.lmr_req( lmr_req ), |
.lmr_ack( lmr_ack ) |
); |
|
mc_adr_sel u1( |
.clk( clk_i ), |
.csc( csc_s ), |
.tms( tms_s ), |
.wb_stb_i( wb_stb_i ), |
//.wb_ack_o( wb_ack_o ), |
.wb_ack_o( mem_ack_r ), |
.wb_addr_i( wb_addr_i ), |
.wb_we_i( wb_we_i ), |
.wb_write_go( wb_write_go ), |
.wr_hold( wr_hold ), |
.cas_( cas_ ), |
.mc_addr( mc_addr_d ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.rfr_ack( rfr_ack ), |
.cs_le( cs_le ), |
.cmd_a10( cmd_a10 ), |
.row_sel( row_sel ), |
.lmr_sel( lmr_sel ), |
.next_adr( next_adr ), |
.wr_cycle( wr_cycle ), |
.page_size( page_size ) |
); |
|
mc_obct_top u2( |
.clk( clk_i ), |
.rst( rst_i ), |
.cs( obct_cs ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set ), |
.bank_clr( bank_clr ), |
.bank_clr_all( bank_clr_all ), |
.bank_open( bank_open ), |
.any_bank_open( any_bank_open ), |
.row_same( row_same ), |
.rfr_ack( rfr_ack ) |
); |
|
mc_dp u3( |
.clk( clk_i ), |
.rst( rst_i ), |
.csc( csc ), |
.wb_cyc_i( wb_cyc_i ), |
.wb_stb_i( wb_stb_i ), |
.mem_ack( mem_ack ), |
//.wb_ack_o( wb_ack_o ), |
.wb_ack_o( mem_ack_r ), |
.wb_we_i( wb_we_i ), |
.wb_data_i( wb_data_i ), |
.wb_data_o( mem_dout ), |
.wb_read_go( wb_read_go ), |
.mc_clk( mc_clk_i ), |
.mc_data_del( mc_data_ir ), |
.mc_dp_i( mc_dp_pad_i ), |
.mc_data_o( mc_data_od ), |
.mc_dp_o( mc_dp_od ), |
.dv( dv ), |
.pack_le0( pack_le0 ), |
.pack_le1( pack_le1 ), |
.pack_le2( pack_le2 ), |
.byte_en( wb_sel_i ), |
.par_err( par_err ) |
); |
|
mc_refresh u4( |
.clk( clk_i ), |
.rst( rst_i ), |
.cs_need_rfr( cs_need_rfr ), |
.ref_int( ref_int ), |
.rfr_req( rfr_req ), |
.rfr_ack( rfr_ack ), |
.rfr_ps_val( rfr_ps_val ) |
); |
|
mc_timing u5( |
.clk( clk_i ), |
.mc_clk( mc_clk_i ), |
.rst( rst_i ), |
.wb_cyc_i( wb_cyc_i ), |
.wb_stb_i( wb_stb_i ), |
.wb_we_i( wb_we_i ), |
.wb_read_go( wb_read_go ), |
.wb_write_go( wb_write_go ), |
.wb_first( wb_first ), |
.wb_wait( wb_wait ), |
.mem_ack( mem_ack ), |
.err( err ), |
.susp_req( susp_req_i ), |
.resume_req( resume_req_i ), |
.suspended( suspended_o ), |
.susp_sel( susp_sel ), |
.mc_br( mc_br_r ), |
.mc_bg( mc_bg_d ), |
.mc_ack( mc_ack_r ), |
.not_mem_cyc( not_mem_cyc ), |
.data_oe( data_oe ), |
.oe_( oe_ ), |
.we_( we_ ), |
.cas_( cas_ ), |
.ras_( ras_ ), |
.cke_( cke_ ), |
.cs_en( cs_en ), |
.mc_adsc( mc_adsc_d ), |
.mc_adv( mc_adv_d ), |
.mc_c_oe( mc_c_oe_d ), |
.wb_cycle( wb_cycle ), |
.wr_cycle( wr_cycle ), |
.csc( csc_s ), |
.tms( tms_s ), |
.cs( obct_cs ), |
.lmr_req( lmr_req ), |
.lmr_ack( lmr_ack ), |
.cs_le( cs_le ), |
.cs_le_d( cs_le_d ), |
.cmd_a10( cmd_a10 ), |
.row_sel( row_sel ), |
.next_adr( next_adr ), |
.page_size( page_size ), |
.bank_set( bank_set ), |
.bank_clr( bank_clr ), |
.bank_clr_all( bank_clr_all ), |
.bank_open( bank_open ), |
.any_bank_open( any_bank_open ), |
.row_same( row_same ), |
.dv( dv ), |
.pack_le0( pack_le0 ), |
.pack_le1( pack_le1 ), |
.pack_le2( pack_le2 ), |
.par_err( par_err ), |
.rfr_req( rfr_req ), |
.rfr_ack( rfr_ack ), |
.init_req( init_req ), |
.init_ack( init_ack ) |
); |
|
mc_wb_if u6( |
.clk( clk_i ), |
.rst( rst_i ), |
.wb_addr_i( wb_addr_i ), |
.wb_cyc_i( wb_cyc_i ), |
.wb_stb_i( wb_stb_i ), |
.wb_we_i( wb_we_i ), |
.wb_ack_o( wb_ack_o ), |
.wb_err( wb_err_o ), |
.wb_read_go( wb_read_go ), |
.wb_write_go( wb_write_go ), |
.wb_first( wb_first ), |
.wb_wait( wb_wait ), |
.mem_ack( mem_ack ), |
.wr_hold( wr_hold ), |
.err( err ), |
.par_err( par_err ), |
.wp_err( wp_err ), |
.wb_data_o( wb_data_o ), |
.mem_dout( mem_dout ), |
.rf_dout( rf_dout ) |
); |
|
mc_mem_if u7( |
.clk( clk_i ), |
.rst( rst_i ), |
.mc_rp( mc_rp_pad_o_ ), |
.mc_clk( mc_clk_i ), |
.mc_br( mc_br_pad_i ), |
.mc_bg( mc_bg_pad_o ), |
.mc_addr( mc_addr_pad_o ), |
.mc_data_o( mc_data_pad_o ), |
.mc_dp_o( mc_dp_pad_o ), |
.mc_data_oe( mc_doe_pad_doe_o), |
.mc_dqm( mc_dqm_pad_o ), |
.mc_oe_( mc_oe_pad_o_ ), |
.mc_we_( mc_we_pad_o_ ), |
.mc_cas_( mc_cas_pad_o_ ), |
.mc_ras_( mc_ras_pad_o_ ), |
.mc_cke_( mc_cke_pad_o_ ), |
.mc_cs_( mc_cs_pad_o_ ), |
.mc_adsc_( mc_adsc_pad_o_ ), |
.mc_adv_( mc_adv_pad_o_ ), |
.mc_br_r( mc_br_r ), |
.mc_bg_d( mc_bg_d ), |
.mc_data_od( mc_data_od ), |
.mc_dp_od( mc_dp_od ), |
.mc_addr_d( mc_addr_d ), |
.mc_ack( mc_ack_pad_i ), |
.mc_zz_o( mc_zz_pad_o ), |
.we_( we_ ), |
.ras_( ras_ ), |
.cas_( cas_ ), |
.cke_( cke_ ), |
.mc_adsc_d( mc_adsc_d ), |
.mc_adv_d( mc_adv_d ), |
.cs_en( cs_en ), |
.rfr_ack( rfr_ack ), |
.cs_need_rfr( cs_need_rfr ), |
.lmr_sel( lmr_sel ), |
.spec_req_cs( spec_req_cs ), |
.cs( cs ), |
.fs( fs ), |
.data_oe( data_oe ), |
.susp_sel( susp_sel ), |
.suspended_o( suspended_o ), |
.mc_c_oe( mc_coe_pad_coe_o), |
.mc_c_oe_d( mc_c_oe_d ), |
.mc_ack_r( mc_ack_r ), |
.oe_( oe_ ), |
.wb_cyc_i( wb_cyc_i ), |
.wb_stb_i( wb_stb_i ), |
.wb_sel_i( wb_sel_i ), |
.wb_cycle( wb_cycle ), |
.wr_cycle( wr_cycle ), |
.mc_data_i( mc_data_pad_i ), |
.mc_dp_i( mc_dp_pad_i ), |
.mc_data_ir( mc_data_ir ), |
.mc_sts_i( mc_sts_pad_i ), |
.mc_sts_ir( mc_sts_ir ) |
); |
|
endmodule |
/verilog/minsoc/mc/mc_dp.v
0,0 → 1,244
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Data Path Module //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_dp.v,v 1.6 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.6 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_dp.v,v $ |
// Revision 1.6 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.5 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.4 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.3 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:47 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_dp( clk, rst, csc, |
wb_cyc_i, wb_stb_i, wb_ack_o, mem_ack, wb_data_i, wb_data_o, |
wb_read_go, wb_we_i, |
mc_clk, mc_data_del, mc_dp_i, mc_data_o, mc_dp_o, |
|
dv, pack_le0, pack_le1, pack_le2, |
byte_en, par_err |
); |
|
input clk, rst; |
input [31:0] csc; |
|
input wb_cyc_i; |
input wb_stb_i; |
input mem_ack; |
input wb_ack_o; |
input [31:0] wb_data_i; |
output [31:0] wb_data_o; |
input wb_read_go; |
input wb_we_i; |
|
input mc_clk; |
input [35:0] mc_data_del; |
input [3:0] mc_dp_i; |
output [31:0] mc_data_o; |
output [3:0] mc_dp_o; |
|
input dv; |
input pack_le0, pack_le1, pack_le2; // Pack Latch Enable |
input [3:0] byte_en; // High Active byte enables |
output par_err; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg [31:0] wb_data_o; |
reg [31:0] mc_data_o; |
wire [35:0] rd_fifo_out; |
wire rd_fifo_clr; |
reg [3:0] mc_dp_o; |
reg par_err_r; |
|
reg [7:0] byte0, byte1, byte2; |
reg [31:0] mc_data_d; |
|
wire [2:0] mem_type; |
wire [1:0] bus_width; |
wire pen; |
wire re; |
|
// Aliases |
assign mem_type = csc[3:1]; |
assign bus_width = csc[5:4]; |
assign pen = csc[11]; |
|
//////////////////////////////////////////////////////////////////// |
// |
// WB READ Data Path |
// |
|
always @(mem_type or rd_fifo_out or mc_data_d) |
if( (mem_type == `MC_MEM_TYPE_SDRAM) | |
(mem_type == `MC_MEM_TYPE_SRAM) ) wb_data_o = rd_fifo_out[31:0]; |
else wb_data_o = mc_data_d; |
|
//assign rd_fifo_clr = !(rst | !wb_cyc_i | (wb_we_i & wb_stb_i) ); |
assign rd_fifo_clr = !wb_cyc_i | (wb_we_i & wb_stb_i); |
assign re = wb_ack_o & wb_read_go; |
|
mc_rd_fifo u0( |
.clk( clk ), |
.rst( rst ), |
.clr( rd_fifo_clr ), |
.din( mc_data_del ), |
.we( dv ), |
.dout( rd_fifo_out ), |
.re( re ) |
); |
|
//////////////////////////////////////////////////////////////////// |
// |
// WB WRITE Data Path |
// |
|
always @(posedge clk) |
if(wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) ) |
mc_data_o <= #1 wb_data_i; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Read Data Packing |
// |
|
always @(posedge clk) |
if(pack_le0) byte0 <= #1 mc_data_del[7:0]; |
|
always @(posedge clk) |
if(pack_le1 & (bus_width == `MC_BW_8)) byte1 <= #1 mc_data_del[7:0]; |
else |
if(pack_le0 & (bus_width == `MC_BW_16)) byte1 <= #1 mc_data_del[15:8]; |
|
always @(posedge clk) |
if(pack_le2) byte2 <= #1 mc_data_del[7:0]; |
|
always @(bus_width or mc_data_del or byte0 or byte1 or byte2) |
if(bus_width == `MC_BW_8) mc_data_d = {mc_data_del[7:0], byte2, byte1, byte0}; |
else |
if(bus_width == `MC_BW_16) mc_data_d = {mc_data_del[15:0], byte1, byte0}; |
else mc_data_d = mc_data_del[31:0]; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Parity Generation |
// |
|
always @(posedge clk) |
if(wb_ack_o | (mem_type != `MC_MEM_TYPE_SDRAM) ) |
mc_dp_o <= #1 { ^wb_data_i[31:24], ^wb_data_i[23:16], |
^wb_data_i[15:08], ^wb_data_i[07:00] }; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Parity Checking |
// |
|
assign par_err = !wb_we_i & mem_ack & pen & ( |
(( ^rd_fifo_out[31:24] ^ rd_fifo_out[35] ) & byte_en[3] ) | |
(( ^rd_fifo_out[23:16] ^ rd_fifo_out[34] ) & byte_en[2] ) | |
(( ^rd_fifo_out[15:08] ^ rd_fifo_out[33] ) & byte_en[1] ) | |
(( ^rd_fifo_out[07:00] ^ rd_fifo_out[32] ) & byte_en[0] ) |
); |
|
endmodule |
|
/verilog/minsoc/mc/mc_top_for_vhdl.v
0,0 → 1,125
/* |
* Xiang Li, olivercamel@gmail.com |
* Last Revised: 2008/08/01 |
* |
* This file is created as the new top level entity of |
* Memory Controller IP Core, which is nothing |
* but a wrapper of mc_top with some port names changed. |
* The reason of doing so is because identifiers in the |
* format of "xxx_" are not supported in VHDL, |
* but are valid in Verilog. So we have to use the wrapper |
* to make MC can be used in higher level VHDL entities. |
*/ |
|
module mc_top_for_vhdl( |
clk_i, rst_i, |
|
wb_data_i, wb_data_o, wb_addr_i, wb_sel_i, wb_we_i, wb_cyc_i, |
wb_stb_i, wb_ack_o, wb_err_o, |
|
susp_req_i, resume_req_i, suspended_o, poc_o, |
|
mc_clk_i, mc_br_pad_i, mc_bg_pad_o, mc_ack_pad_i, |
mc_addr_pad_o, mc_data_pad_i, mc_data_pad_o, mc_dp_pad_i, |
mc_dp_pad_o, mc_doe_pad_doe_o, mc_dqm_pad_o, mc_oe_pad_o, |
mc_we_pad_o, mc_cas_pad_o, mc_ras_pad_o, mc_cke_pad_o, |
mc_cs_pad_o, mc_sts_pad_i, mc_rp_pad_o, mc_vpen_pad_o, |
mc_adsc_pad_o, mc_adv_pad_o, mc_zz_pad_o, mc_coe_pad_coe_o |
); |
|
input clk_i, rst_i; |
|
// -------------------------------------- |
// WISHBONE SLAVE INTERFACE |
input [31:0] wb_data_i; |
output [31:0] wb_data_o; |
input [31:0] wb_addr_i; |
input [3:0] wb_sel_i; |
input wb_we_i; |
input wb_cyc_i; |
input wb_stb_i; |
output wb_ack_o; |
output wb_err_o; |
|
// -------------------------------------- |
// Suspend Resume Interface |
input susp_req_i; |
input resume_req_i; |
output suspended_o; |
|
// POC |
output [31:0] poc_o; |
|
// -------------------------------------- |
// Memory Bus Signals |
input mc_clk_i; |
input mc_br_pad_i; |
output mc_bg_pad_o; |
input mc_ack_pad_i; |
output [23:0] mc_addr_pad_o; |
input [31:0] mc_data_pad_i; |
output [31:0] mc_data_pad_o; |
input [3:0] mc_dp_pad_i; |
output [3:0] mc_dp_pad_o; |
output mc_doe_pad_doe_o; |
output [3:0] mc_dqm_pad_o; |
output mc_oe_pad_o; |
output mc_we_pad_o; |
output mc_cas_pad_o; |
output mc_ras_pad_o; |
output mc_cke_pad_o; |
output [7:0] mc_cs_pad_o; |
input mc_sts_pad_i; |
output mc_rp_pad_o; |
output mc_vpen_pad_o; |
output mc_adsc_pad_o; |
output mc_adv_pad_o; |
output mc_zz_pad_o; |
output mc_coe_pad_coe_o; |
|
mc_top u0( |
.clk_i (clk_i), |
.rst_i (rst_i), |
|
.wb_data_i (wb_data_i), |
.wb_data_o (wb_data_o), |
.wb_addr_i (wb_addr_i), |
.wb_sel_i (wb_sel_i), |
.wb_we_i (wb_we_i), |
.wb_cyc_i (wb_cyc_i), |
.wb_stb_i (wb_stb_i), |
.wb_ack_o (wb_ack_o), |
.wb_err_o (wb_err_o), |
|
.susp_req_i (susp_req_i), |
.resume_req_i (resume_req_i), |
.suspended_o (suspended_o), |
.poc_o (poc_o), |
|
.mc_clk_i (mc_clk_i), |
.mc_br_pad_i (mc_br_pad_i), |
.mc_bg_pad_o (mc_bg_pad_o), |
.mc_ack_pad_i (mc_ack_pad_i), |
.mc_addr_pad_o (mc_addr_pad_o), |
.mc_data_pad_i (mc_data_pad_i), |
.mc_data_pad_o (mc_data_pad_o), |
.mc_dp_pad_i (mc_dp_pad_i), |
.mc_dp_pad_o (mc_dp_pad_o), |
.mc_doe_pad_doe_o (mc_doe_pad_doe_o), |
.mc_dqm_pad_o (mc_dqm_pad_o), |
.mc_oe_pad_o_ (mc_oe_pad_o), |
.mc_we_pad_o_ (mc_we_pad_o), |
.mc_cas_pad_o_ (mc_cas_pad_o), |
.mc_ras_pad_o_ (mc_ras_pad_o), |
.mc_cke_pad_o_ (mc_cke_pad_o), |
.mc_cs_pad_o_ (mc_cs_pad_o), |
.mc_sts_pad_i (mc_sts_pad_i), |
.mc_rp_pad_o_ (mc_rp_pad_o), |
.mc_vpen_pad_o (mc_vpen_pad_o), |
.mc_adsc_pad_o_ (mc_adsc_pad_o), |
.mc_adv_pad_o_ (mc_adv_pad_o), |
.mc_zz_pad_o (mc_zz_pad_o), |
.mc_coe_pad_coe_o (mc_coe_pad_coe_o) |
); |
|
endmodule |
/verilog/minsoc/mc/mc_wb_if.v
0,0 → 1,252
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// WISHBONE Interface //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_wb_if.v,v 1.6 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.6 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_wb_if.v,v $ |
// Revision 1.6 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.5 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.4 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.3 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug |
// fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:47 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_wb_if(clk, rst, |
wb_addr_i, wb_cyc_i, wb_stb_i, wb_we_i, wb_err, wb_ack_o, |
wb_read_go, wb_write_go, |
wb_first, wb_wait, mem_ack, wr_hold, |
err, par_err, wp_err, |
wb_data_o, mem_dout, rf_dout); |
|
input clk, rst; |
input [31:0] wb_addr_i; |
input wb_cyc_i; |
input wb_stb_i; |
input wb_we_i; |
output wb_err; |
output wb_ack_o; |
output wb_read_go; |
output wb_write_go; |
output wb_first; |
output wb_wait; |
input mem_ack; |
output wr_hold; |
input err, par_err, wp_err; |
output [31:0] wb_data_o; |
input [31:0] mem_dout, rf_dout; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Wires and Registers |
// |
|
wire mem_sel; |
reg read_go_r; |
reg read_go_r1; |
reg write_go_r; |
reg write_go_r1; |
reg wb_first_r; |
wire wb_first_set; |
reg wr_hold; |
wire rmw; |
reg rmw_r; |
reg rmw_en; |
reg wb_ack_o; |
reg wb_err; |
reg [31:0] wb_data_o; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Memory Go Logic |
// |
|
assign mem_sel = `MC_MEM_SEL; |
|
always @(posedge clk or posedge rst) |
if(rst) rmw_en <= #1 1'b0; |
else |
if(wb_ack_o) rmw_en <= #1 1'b1; |
else |
if(!wb_cyc_i) rmw_en <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) rmw_r <= #1 1'b0; |
else rmw_r <= #1 !wr_hold & wb_we_i & wb_cyc_i & wb_stb_i & rmw_en; |
|
assign rmw = rmw_r | (!wr_hold & wb_we_i & wb_cyc_i & wb_stb_i & rmw_en); |
|
always @(posedge clk or posedge rst) |
if(rst) read_go_r1 <= #1 1'b0; |
else read_go_r1 <= #1 !rmw & wb_cyc_i & |
((wb_stb_i & mem_sel & !wb_we_i) | read_go_r); |
|
always @(posedge clk or posedge rst) |
if(rst) read_go_r <= #1 1'b0; |
else read_go_r <= #1 read_go_r1 & wb_cyc_i; |
|
assign wb_read_go = !rmw & read_go_r1 & wb_cyc_i; |
|
always @(posedge clk or posedge rst) |
if(rst) write_go_r1 <= #1 1'b0; |
else write_go_r1 <= #1 wb_cyc_i & |
((wb_stb_i & mem_sel & wb_we_i) | write_go_r); |
|
always @(posedge clk or posedge rst) |
if(rst) write_go_r <= #1 1'b0; |
else write_go_r <= #1 write_go_r1 & wb_cyc_i & |
((wb_we_i & wb_stb_i) | !wb_stb_i); |
|
assign wb_write_go = !rmw & write_go_r1 & wb_cyc_i & |
((wb_we_i & wb_stb_i) | !wb_stb_i); |
|
assign wb_first_set = mem_sel & wb_cyc_i & wb_stb_i & !(read_go_r | write_go_r); |
assign wb_first = wb_first_set | (wb_first_r & !wb_ack_o & !wb_err); |
|
always @(posedge clk or posedge rst) |
if(rst) wb_first_r <= #1 1'b0; |
else |
if(wb_first_set) wb_first_r <= #1 1'b1; |
else |
if(wb_ack_o | wb_err) wb_first_r <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) wr_hold <= #1 1'b0; |
else |
if(wb_cyc_i & wb_stb_i) wr_hold <= #1 wb_we_i; |
|
//////////////////////////////////////////////////////////////////// |
// |
// WB Ack |
// |
|
wire wb_err_d; |
|
// Ack no longer asserted when wb_err is asserted |
always @(posedge clk or posedge rst) |
if(rst) wb_ack_o <= #1 1'b0; |
else wb_ack_o <= #1 `MC_MEM_SEL ? mem_ack & !wb_err_d : |
`MC_REG_SEL & wb_cyc_i & wb_stb_i & !wb_ack_o; |
|
assign wb_err_d = wb_cyc_i & wb_stb_i & (par_err | err | wp_err); |
|
always @(posedge clk or posedge rst) |
if(rst) wb_err <= #1 1'b0; |
else wb_err <= #1 `MC_MEM_SEL & wb_err_d & !wb_err; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Memory Wait Logic |
// |
|
assign wb_wait = wb_cyc_i & !wb_stb_i & (wb_write_go | wb_read_go); |
|
//////////////////////////////////////////////////////////////////// |
// |
// WISHBONE Data Output |
// |
|
always @(posedge clk) |
wb_data_o <= #1 `MC_MEM_SEL ? mem_dout : rf_dout; |
|
endmodule |
/verilog/minsoc/mc/mc_timing.v
0,0 → 1,1735
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Main Timing Block //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_timing.v,v 1.8 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.8 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_timing.v,v $ |
// Revision 1.8 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.7 2001/12/21 05:09:30 rudi |
// |
// - Fixed combinatorial loops in synthesis |
// - Fixed byte select bug |
// |
// Revision 1.6 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.5 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.4 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.3 2001/09/02 02:28:28 rudi |
// |
// Many fixes for minor bugs that showed up in gate level simulations. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.4 2001/06/14 01:57:37 rudi |
// |
// |
// Fixed a potential bug in a corner case situation where the TMS register |
// does not propegate properly during initialisation. |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:44 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_timing(clk, rst, |
|
// Wishbone Interface |
wb_cyc_i, wb_stb_i, wb_we_i, |
wb_read_go, wb_write_go, wb_first, wb_wait, mem_ack, |
err, |
|
// Suspend/Resume Interface |
susp_req, resume_req, suspended, susp_sel, |
|
// Memory Interface |
mc_clk, data_oe, oe_, we_, cas_, ras_, cke_, |
cs_en, wb_cycle, wr_cycle, |
mc_br, mc_bg, mc_adsc, mc_adv, |
mc_c_oe, mc_ack, |
not_mem_cyc, |
|
// Register File Interface |
csc, tms, cs, lmr_req, lmr_ack, cs_le_d, cs_le, |
|
// Address Select Signals |
cmd_a10, row_sel, next_adr, page_size, |
|
// OBCT Signals |
bank_set, bank_clr, bank_clr_all, bank_open, any_bank_open, row_same, |
|
// Data path Controller Signals |
dv, pack_le0, pack_le1, pack_le2, par_err, |
|
// Refresh Counter Signals |
rfr_req, rfr_ack, |
|
// Initialize Request & Ack |
init_req, init_ack |
); |
|
input clk; |
input rst; |
|
// Wishbone Interface |
input wb_cyc_i, wb_stb_i, wb_we_i; |
input wb_read_go; |
input wb_write_go; |
input wb_first; |
input wb_wait; |
output mem_ack; |
output err; |
|
// Suspend/Resume Interface |
input susp_req; |
input resume_req; |
output suspended; |
output susp_sel; |
|
// Memory Interface |
input mc_clk; |
output data_oe; |
output oe_; |
output we_; |
output cas_; |
output ras_; |
output cke_; |
output cs_en; |
output wb_cycle; |
output wr_cycle; |
input mc_br; |
output mc_bg; |
output mc_adsc; |
output mc_adv; |
output mc_c_oe; |
input mc_ack; |
input not_mem_cyc; |
|
// Register File Interface |
input [31:0] csc; |
input [31:0] tms; |
input [7:0] cs; |
input lmr_req; |
output lmr_ack; |
output cs_le; |
output cs_le_d; |
|
// Address Select Signals |
input [10:0] page_size; |
output cmd_a10; |
output row_sel; |
output next_adr; |
|
// OBCT Signals |
output bank_set; |
output bank_clr; |
output bank_clr_all; |
input bank_open; |
input any_bank_open; |
input row_same; |
|
// Data path Controller Signals |
output dv; |
output pack_le0, pack_le1, pack_le2; // Pack Latch Enable |
input par_err; |
|
// Refresh Counter Signals |
input rfr_req; |
output rfr_ack; |
|
// Initialize Request & Ack |
input init_req; |
output init_ack; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Defines & Parameters |
// |
|
// Number of states: 66 |
parameter [65:0] // synopsys enum state |
// 6666666555555555544444444443333333333222222222211111111110000000000 |
// 6543210987654321098765432109876543210987654321098765432109876543210 |
POR = 66'b000000000000000000000000000000000000000000000000000000000000000001, |
IDLE = 66'b000000000000000000000000000000000000000000000000000000000000000010, |
IDLE_T = 66'b000000000000000000000000000000000000000000000000000000000000000100, |
IDLE_T2 = 66'b000000000000000000000000000000000000000000000000000000000000001000, |
PRECHARGE = 66'b000000000000000000000000000000000000000000000000000000000000010000, |
PRECHARGE_W = 66'b000000000000000000000000000000000000000000000000000000000000100000, |
ACTIVATE = 66'b000000000000000000000000000000000000000000000000000000000001000000, |
ACTIVATE_W = 66'b000000000000000000000000000000000000000000000000000000000010000000, |
SD_RD_WR = 66'b000000000000000000000000000000000000000000000000000000000100000000, |
SD_RD = 66'b000000000000000000000000000000000000000000000000000000001000000000, |
SD_RD_W = 66'b000000000000000000000000000000000000000000000000000000010000000000, |
SD_RD_LOOP = 66'b000000000000000000000000000000000000000000000000000000100000000000, |
SD_RD_W2 = 66'b000000000000000000000000000000000000000000000000000001000000000000, |
SD_WR = 66'b000000000000000000000000000000000000000000000000000010000000000000, |
SD_WR_W = 66'b000000000000000000000000000000000000000000000000000100000000000000, |
BT = 66'b000000000000000000000000000000000000000000000000001000000000000000, |
BT_W = 66'b000000000000000000000000000000000000000000000000010000000000000000, |
REFR = 66'b000000000000000000000000000000000000000000000000100000000000000000, |
LMR0 = 66'b000000000000000000000000000000000000000000000001000000000000000000, |
LMR1 = 66'b000000000000000000000000000000000000000000000010000000000000000000, |
LMR2 = 66'b000000000000000000000000000000000000000000000100000000000000000000, |
// 6666666555555555544444444443333333333222222222211111111110000000000 |
// 6543210987654321098765432109876543210987654321098765432109876543210 |
INIT0 = 66'b000000000000000000000000000000000000000000001000000000000000000000, |
INIT = 66'b000000000000000000000000000000000000000000010000000000000000000000, |
INIT_W = 66'b000000000000000000000000000000000000000000100000000000000000000000, |
INIT_REFR1 = 66'b000000000000000000000000000000000000000001000000000000000000000000, |
INIT_REFR1_W = 66'b000000000000000000000000000000000000000010000000000000000000000000, |
// 6666666555555555544444444443333333333222222222211111111110000000000 |
// 6543210987654321098765432109876543210987654321098765432109876543210 |
INIT_LMR = 66'b000000000000000000000000000000000000000100000000000000000000000000, |
SUSP1 = 66'b000000000000000000000000000000000000001000000000000000000000000000, |
SUSP2 = 66'b000000000000000000000000000000000000010000000000000000000000000000, |
SUSP3 = 66'b000000000000000000000000000000000000100000000000000000000000000000, |
SUSP4 = 66'b000000000000000000000000000000000001000000000000000000000000000000, |
RESUME1 = 66'b000000000000000000000000000000000010000000000000000000000000000000, |
RESUME2 = 66'b000000000000000000000000000000000100000000000000000000000000000000, |
BG0 = 66'b000000000000000000000000000000001000000000000000000000000000000000, |
BG1 = 66'b000000000000000000000000000000010000000000000000000000000000000000, |
BG2 = 66'b000000000000000000000000000000100000000000000000000000000000000000, |
ACS_RD = 66'b000000000000000000000000000001000000000000000000000000000000000000, |
ACS_RD1 = 66'b000000000000000000000000000010000000000000000000000000000000000000, |
ACS_RD2A = 66'b000000000000000000000000000100000000000000000000000000000000000000, |
ACS_RD2 = 66'b000000000000000000000000001000000000000000000000000000000000000000, |
ACS_RD3 = 66'b000000000000000000000000010000000000000000000000000000000000000000, |
ACS_RD_8_1 = 66'b000000000000000000000000100000000000000000000000000000000000000000, |
ACS_RD_8_2 = 66'b000000000000000000000001000000000000000000000000000000000000000000, |
ACS_RD_8_3 = 66'b000000000000000000000010000000000000000000000000000000000000000000, |
ACS_RD_8_4 = 66'b000000000000000000000100000000000000000000000000000000000000000000, |
ACS_RD_8_5 = 66'b000000000000000000001000000000000000000000000000000000000000000000, |
ACS_RD_8_6 = 66'b000000000000000000010000000000000000000000000000000000000000000000, |
ACS_WR = 66'b000000000000000000100000000000000000000000000000000000000000000000, |
ACS_WR1 = 66'b000000000000000001000000000000000000000000000000000000000000000000, |
ACS_WR2 = 66'b000000000000000010000000000000000000000000000000000000000000000000, |
ACS_WR3 = 66'b000000000000000100000000000000000000000000000000000000000000000000, |
ACS_WR4 = 66'b000000000000001000000000000000000000000000000000000000000000000000, |
SRAM_RD = 66'b000000000000010000000000000000000000000000000000000000000000000000, |
SRAM_RD0 = 66'b000000000000100000000000000000000000000000000000000000000000000000, |
SRAM_RD1 = 66'b000000000001000000000000000000000000000000000000000000000000000000, |
SRAM_RD2 = 66'b000000000010000000000000000000000000000000000000000000000000000000, |
SRAM_RD3 = 66'b000000000100000000000000000000000000000000000000000000000000000000, |
SRAM_RD4 = 66'b000000001000000000000000000000000000000000000000000000000000000000, |
SRAM_WR = 66'b000000010000000000000000000000000000000000000000000000000000000000, |
SRAM_WR0 = 66'b000000100000000000000000000000000000000000000000000000000000000000, |
SCS_RD = 66'b000001000000000000000000000000000000000000000000000000000000000000, |
SCS_RD1 = 66'b000010000000000000000000000000000000000000000000000000000000000000, |
SCS_RD2 = 66'b000100000000000000000000000000000000000000000000000000000000000000, |
SCS_WR = 66'b001000000000000000000000000000000000000000000000000000000000000000, |
SCS_WR1 = 66'b010000000000000000000000000000000000000000000000000000000000000000, |
SCS_ERR = 66'b100000000000000000000000000000000000000000000000000000000000000000; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg [65:0] /* synopsys enum state */ state, next_state; |
// synopsys state_vector state |
|
reg mc_bg; |
|
wire [2:0] mem_type; |
wire [1:0] bus_width; |
wire kro; |
|
wire cs_a; |
reg [3:0] cmd; |
|
wire mem_ack; |
wire mem_ack_s; |
reg mem_ack_d; |
reg err_d; |
wire err; |
reg cmd_a10; |
reg lmr_ack; |
reg lmr_ack_d; |
reg row_sel; |
reg oe_; |
reg oe_d; |
reg data_oe; |
reg data_oe_d; |
reg cke_d; |
reg cke_; |
reg init_ack; |
reg dv; |
reg rfr_ack_d; |
reg mc_adsc; |
reg mc_adv; |
|
reg bank_set; |
reg bank_clr; |
reg bank_clr_all; |
|
reg wr_set, wr_clr; |
reg wr_cycle; |
|
reg cmd_asserted; |
reg cmd_asserted2; |
|
reg [10:0] burst_val; |
reg [10:0] burst_cnt; |
wire burst_act; |
reg burst_act_rd; |
wire single_write; |
|
reg cs_le_d; |
reg cs_le; |
reg cs_le_r; |
|
reg susp_req_r; |
reg resume_req_r; |
reg suspended; |
reg suspended_d; |
reg susp_sel_set, susp_sel_clr, susp_sel_r; |
|
reg [3:0] cmd_del; |
reg [3:0] cmd_r; |
reg data_oe_r; |
reg data_oe_r2; |
reg cke_r; |
reg cke_rd; |
reg cke_o_del; |
reg cke_o_r1; |
reg cke_o_r2; |
reg wb_cycle_set, wb_cycle; |
reg [3:0] ack_cnt; |
wire ack_cnt_is_0; |
reg cnt, cnt_next; |
reg [7:0] timer; |
reg tmr_ld_trp, tmr_ld_trcd, tmr_ld_tcl, tmr_ld_trfc; |
reg tmr_ld_twr, tmr_ld_txsr; |
reg tmr2_ld_tscsto; |
reg tmr_ld_trdv; |
reg tmr_ld_trdz; |
reg tmr_ld_twr2; |
wire timer_is_zero; |
reg tmr_done; |
reg tmr2_ld_trdv, tmr2_ld_trdz; |
reg tmr2_ld_twpw, tmr2_ld_twd, tmr2_ld_twwd; |
reg tmr2_ld_tsrdv; |
reg [8:0] timer2; |
reg tmr2_done; |
wire timer2_is_zero; |
reg [3:0] ir_cnt; |
reg ir_cnt_ld; |
reg ir_cnt_dec; |
reg ir_cnt_done; |
reg rfr_ack_r; |
reg burst_cnt_ld; |
reg burst_fp; |
reg wb_wait_r, wb_wait_r2; |
reg lookup_ready1, lookup_ready2; |
reg burst_cnt_ld_4; |
reg dv_r; |
reg mc_adv_r1, mc_adv_r; |
|
reg next_adr; |
reg pack_le0, pack_le1, pack_le2; |
reg pack_le0_d, pack_le1_d, pack_le2_d; |
wire bw8, bw16; |
|
reg mc_c_oe_d; |
reg mc_c_oe; |
|
reg mc_le; |
reg mem_ack_r; |
|
reg rsts, rsts1; |
reg no_wb_cycle; |
|
wire bc_dec; |
reg ap_en; // Auto Precharge Enable |
reg cmd_a10_r; |
reg wb_stb_first; |
reg tmr_ld_tavav; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Aliases |
// |
assign mem_type = csc[3:1]; |
assign bus_width = csc[5:4]; |
assign kro = csc[10]; |
assign single_write = tms[9] | (tms[2:0] == 3'h0); |
|
//////////////////////////////////////////////////////////////////// |
// |
// Misc Logic |
// |
reg cs_le_r1; |
|
always @(posedge clk) |
lmr_ack <= #1 lmr_ack_d; |
|
assign rfr_ack = rfr_ack_r; |
|
always @(posedge clk) |
cs_le_r <= #1 cs_le_r1; |
|
always @(posedge clk) |
cs_le_r1 <= #1 cs_le; |
|
always @(posedge clk) |
cs_le <= #1 cs_le_d; |
|
always @(posedge mc_clk or posedge rst) |
if(rst) rsts1 <= #1 1'b1; |
else rsts1 <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) rsts <= #1 1'b1; |
else rsts <= #1 rsts1; |
|
// Control Signals Output Enable |
always @(posedge clk or posedge rst) |
if(rst) mc_c_oe <= #1 1'b0; |
else mc_c_oe <= #1 mc_c_oe_d; |
|
always @(posedge clk or posedge rsts) |
if(rsts) mc_le <= #1 1'b0; |
else mc_le <= #1 ~mc_le; |
|
always @(posedge clk) |
pack_le0 <= #1 pack_le0_d; |
|
always @(posedge clk) |
pack_le1 <= #1 pack_le1_d; |
|
always @(posedge clk) |
pack_le2 <= #1 pack_le2_d; |
|
always @(posedge clk or posedge rst) |
if(rst) mc_adv_r1 <= #1 1'b0; |
else |
if(!mc_le) mc_adv_r1 <= #1 mc_adv; |
|
always @(posedge clk or posedge rst) |
if(rst) mc_adv_r <= #1 1'b0; |
else |
if(!mc_le) mc_adv_r <= #1 mc_adv_r1; |
|
// Bus Width decoder |
assign bw8 = (bus_width == `MC_BW_8); |
assign bw16 = (bus_width == `MC_BW_16); |
|
// Any Chip Select |
assign cs_a = |cs; |
|
// Memory to Wishbone Ack |
assign mem_ack = (mem_ack_d | mem_ack_s) & (wb_read_go | wb_write_go); |
|
always @(posedge clk or posedge rst) |
if(rst) mem_ack_r <= #1 1'b0; |
else mem_ack_r <= #1 mem_ack; |
|
assign err = err_d; |
|
// SDRAM Command, either delayed (for writes) or straight through |
always @(posedge clk or posedge rst) |
if(rst) cmd_r <= #1 `MC_CMD_NOP; |
else cmd_r <= #1 cmd; |
|
always @(posedge clk or posedge rst) |
if(rst) cmd_del <= #1 `MC_CMD_NOP; |
else cmd_del <= #1 cmd_r; |
|
assign {cs_en, ras_, cas_, we_} = wr_cycle ? cmd_del : cmd; |
|
// Track Timing of Asserting a command |
always @(posedge clk or posedge rst) |
if(rst) cmd_asserted <= #1 1'b0; |
else |
if(!mc_le) cmd_asserted <= #1 cmd[3]; |
|
always @(posedge clk or posedge rst) |
if(rst) cmd_asserted2 <= #1 1'b0; |
else |
if(!mc_le) cmd_asserted2 <= #1 cmd_asserted; |
|
// Output Enable |
always @(posedge clk or posedge rst) |
if(rst) oe_ <= #1 1'b1; |
else oe_ <= #1 ~oe_d; |
|
// Memory Bus Data lines Output Enable |
always @(posedge clk or posedge rst) |
if(rst) data_oe_r <= #1 1'b0; |
else data_oe_r <= #1 data_oe_d; |
|
always @(posedge clk or posedge rst) |
if(rst) data_oe_r2 <= #1 1'b0; |
else data_oe_r2 <= #1 data_oe_r; |
|
always @(posedge clk or posedge rst) |
if(rst) data_oe <= #1 1'b0; |
else data_oe <= #1 wr_cycle ? data_oe_r2 : data_oe_d; |
|
// Clock Enable |
always @(posedge clk) |
cke_r <= #1 cke_d; |
|
always @(posedge clk) |
cke_ <= #1 cke_r & cke_rd; |
|
// CKE output delay line to time DV for reads |
always @(posedge clk) |
cke_o_r1 <= #1 cke_; |
|
always @(posedge clk) |
cke_o_r2 <= #1 cke_o_r1; |
|
always @(posedge clk) |
cke_o_del <= #1 cke_o_r2; |
|
// Delayed version of the wb_wait input |
always @(posedge clk) |
wb_wait_r2 <= #1 wb_wait; |
|
always @(posedge clk) |
wb_wait_r <= #1 wb_wait_r2; |
|
// Indicates when the row_same and bank_open lookups are done |
reg lookup_ready1a; |
|
always @(posedge clk or posedge rst) |
if(rst) lookup_ready1 <= #1 1'b0; |
else lookup_ready1 <= #1 cs_le & wb_cyc_i & wb_stb_i; |
|
always @(posedge clk or posedge rst) |
if(rst) lookup_ready2 <= #1 1'b0; |
else lookup_ready2 <= #1 lookup_ready1 & wb_cyc_i & wb_stb_i; |
|
// Keep Track if it is a SDRAM write cycle |
always @(posedge clk or posedge rst) |
if(rst) wr_cycle <= #1 1'b0; |
else |
if(wr_set) wr_cycle <= #1 1'b1; |
else |
if(wr_clr) wr_cycle <= #1 1'b0; |
|
// Track when a cycle is *still* active |
always @(posedge clk or posedge rst) |
if(rst) wb_cycle <= #1 1'b0; |
else |
if(wb_cycle_set) wb_cycle <= #1 1'b1; |
else |
if(!wb_cyc_i | not_mem_cyc) wb_cycle <= #1 1'b0; |
|
// Thses two signals are used to signal that no wishbone cycle is in |
// progress. Need to register them to avoid a very long combinatorial |
// path .... |
always @(posedge clk or posedge rst) |
if(rst) no_wb_cycle <= #1 1'b0; |
else no_wb_cycle <= #1 !wb_read_go & !wb_write_go; |
|
// Track ack's for read cycles |
always @(posedge clk or posedge rst) |
if(rst) ack_cnt <= #1 4'h0; |
else |
if(no_wb_cycle) ack_cnt <= #1 4'h0; |
else |
if(dv & !mem_ack_s) ack_cnt <= #1 ack_cnt + 4'h1; |
else |
if(!dv & mem_ack_s) ack_cnt <= #1 ack_cnt - 4'h1; |
|
assign ack_cnt_is_0 = (ack_cnt==4'h0); |
|
assign mem_ack_s = (ack_cnt != 4'h0) & !wb_wait & !mem_ack_r & wb_read_go & !(wb_we_i & wb_stb_i); |
|
// Internal Cycle Tracker |
always @(posedge clk) |
cnt <= #1 cnt_next; |
|
// Suspend/resume Logic |
always @(posedge clk or posedge rst) |
if(rst) susp_req_r <= #1 1'b0; |
else susp_req_r <= #1 susp_req; |
|
always @(posedge clk or posedge rst) |
if(rst) resume_req_r <= #1 1'b0; |
else resume_req_r <= #1 resume_req; |
|
always @(posedge clk or posedge rst) |
if(rst) suspended <= #1 1'b0; |
else suspended <= #1 suspended_d; |
|
always @(posedge clk or posedge rst) |
if(rst) rfr_ack_r <= #1 1'b0; |
else rfr_ack_r <= #1 rfr_ack_d; |
|
// Suspend Select Logic |
assign susp_sel = susp_sel_r; |
|
always @(posedge clk or posedge rst) |
if(rst) susp_sel_r <= #1 1'b0; |
else |
if(susp_sel_set) susp_sel_r <= #1 1'b1; |
else |
if(susp_sel_clr) susp_sel_r <= #1 1'b0; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Timing Logic |
// |
wire [3:0] twrp; |
wire twd_is_zero; |
wire [31:0] tms_x; |
|
// FIX_ME |
// Hard wire worst case or make it programmable ??? |
assign tms_x = (rfr_ack_d | rfr_ack_r | susp_sel | !mc_c_oe) ? 32'hffff_ffff : tms; |
|
always @(posedge clk) |
if(tmr2_ld_tscsto) timer2 <= #1 tms_x[24:16]; |
else |
if(tmr2_ld_tsrdv) timer2 <= #1 9'd4; // SSRAM RD->1st DATA VALID |
else |
if(tmr2_ld_twpw) timer2 <= #1 { 5'h0, tms_x[15:12]}; |
else |
if(tmr2_ld_twd) timer2 <= #1 { 4'h0, tms_x[19:16],1'b0}; |
else |
if(tmr2_ld_twwd) timer2 <= #1 { 3'h0, tms_x[25:20]}; |
else |
if(tmr2_ld_trdz) timer2 <= #1 { 4'h0, tms_x[11:8], 1'b1}; |
else |
if(tmr2_ld_trdv) timer2 <= #1 { tms_x[7:0], 1'b1}; |
else |
if(!timer2_is_zero) timer2 <= #1 timer2 - 9'b1; |
|
assign twd_is_zero = (tms_x[19:16] == 4'h0); |
|
assign timer2_is_zero = (timer2 == 9'h0); |
|
always @(posedge clk or posedge rst) |
if(rst) tmr2_done <= #1 1'b0; |
else tmr2_done <= #1 timer2_is_zero & !tmr2_ld_trdv & !tmr2_ld_trdz & |
!tmr2_ld_twpw & !tmr2_ld_twd & !tmr2_ld_twwd & !tmr2_ld_tscsto; |
|
assign twrp = {2'h0,tms_x[16:15]} + tms_x[23:20]; |
|
// SDRAM Memories timing tracker |
always @(posedge clk or posedge rst) |
`ifdef MC_POR_DELAY |
if(rst) timer <= #1 `MC_POR_DELAY_VAL ; |
else |
`endif |
if(tmr_ld_twr2) timer <= #1 { 4'h0, tms_x[15:12] }; |
else |
if(tmr_ld_trdz) timer <= #1 { 4'h0, tms_x[11:8] }; |
else |
if(tmr_ld_trdv) timer <= #1 tms_x[7:0]; |
else |
if(tmr_ld_twr) timer <= #1 { 4'h0, twrp}; |
else |
if(tmr_ld_trp) timer <= #1 { 4'h0, tms_x[23:20]}; |
else |
if(tmr_ld_trcd) timer <= #1 { 5'h0, tms_x[19:17]}; |
else |
if(tmr_ld_tcl) timer <= #1 { 6'h0, tms_x[05:04]}; |
else |
if(tmr_ld_trfc) timer <= #1 { 4'h0, tms_x[27:24]}; |
else |
if(tmr_ld_tavav) timer <= #1 8'h3; |
else |
if(tmr_ld_txsr) timer <= #1 8'h7; |
else |
if(!timer_is_zero & !mc_le) timer <= #1 timer - 8'b1; |
|
assign timer_is_zero = (timer == 8'h0); |
|
always @(posedge clk or posedge rst) |
if(rst) tmr_done <= #1 1'b0; |
else tmr_done <= #1 timer_is_zero; |
|
// Init Refresh Cycles Counter |
always @(posedge clk) |
if(ir_cnt_ld) ir_cnt <= #1 `MC_INIT_RFRC_CNT; |
else |
if(ir_cnt_dec) ir_cnt <= #1 ir_cnt - 4'b1; |
|
always @(posedge clk) |
ir_cnt_done <= #1 (ir_cnt == 4'h0); |
|
// Burst Counter |
always @(tms_x or page_size) |
case(tms_x[2:0]) // synopsys full_case parallel_case |
3'h0: burst_val = 11'h1; |
3'h1: burst_val = 11'h2; |
3'h2: burst_val = 11'h4; |
3'h3: burst_val = 11'h8; |
3'h7: burst_val = page_size; |
endcase |
|
assign bc_dec = wr_cycle ? mem_ack_d : dv; |
|
always @(posedge clk) |
if(burst_cnt_ld_4) burst_cnt <= #1 11'h4; // for SSRAM only |
else |
if(burst_cnt_ld) burst_cnt <= #1 burst_val; |
else |
if(bc_dec) burst_cnt <= #1 burst_cnt - 11'h1; |
|
always @(posedge clk or posedge rst) |
if(rst) burst_fp <= #1 1'b0; |
else |
if(burst_cnt_ld) burst_fp <= #1 (tms_x[2:0] == 3'h7); |
|
// Auto Precharge Enable |
always @(posedge clk or posedge rst) |
if(rst) ap_en <= #1 1'b0; |
else |
if(burst_cnt_ld) ap_en <= #1 (tms_x[2:0] == 3'h0) & !kro; |
|
assign burst_act = |burst_cnt & ( |tms_x[2:0] ); |
|
always @(posedge clk) |
burst_act_rd <= #1 |burst_cnt; |
|
always @(posedge clk or posedge rst) |
if(rst) dv_r <= #1 1'b0; |
else dv_r <= #1 dv; |
|
always @(posedge clk) // Auto Precharge Holding Register |
cmd_a10_r <= #1 cmd_a10; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Main State Machine |
// |
reg wb_write_go_r; |
|
always @(posedge clk) |
wb_write_go_r <= #1 wb_write_go; |
|
always @(posedge clk or posedge rst) |
if(rst) wb_stb_first <= #1 1'b0; |
else |
if(mem_ack) wb_stb_first <= #1 1'b0; |
else |
if(wb_first & wb_stb_i) wb_stb_first <= #1 1'b1; |
|
always @(posedge clk or posedge rst) |
`ifdef MC_POR_DELAY |
if(rst) state <= #1 POR; |
`else |
if(rst) state <= #1 IDLE; |
`endif |
else state <= #1 next_state; |
|
always @(state or cs_a or cs_le or cs_le_r or |
twd_is_zero or wb_stb_i or wb_write_go_r or |
wb_first or wb_read_go or wb_write_go or wb_wait or mem_ack_r or wb_we_i or |
ack_cnt_is_0 or wb_wait_r or cnt or wb_cycle or wr_cycle or |
mem_type or kro or lookup_ready2 or row_same or cmd_a10_r or |
bank_open or single_write or |
cmd_asserted or tmr_done or tmr2_done or ir_cnt_done or cmd_asserted2 or |
burst_act or burst_act_rd or burst_fp or cke_ or cke_r or cke_o_del or |
rfr_req or lmr_req or init_req or rfr_ack_r or susp_req_r or resume_req_r or |
mc_br or bw8 or bw16 or dv_r or mc_adv_r or mc_ack or wb_stb_first or ap_en |
) |
begin |
next_state = state; // Default keep current state |
cnt_next = 1'b0; |
|
cmd = `MC_CMD_NOP; |
cmd_a10 = ap_en; |
oe_d = 1'b0; |
data_oe_d = 1'b0; |
cke_d = 1'b1; |
cke_rd = 1'b1; |
mc_adsc = 1'b0; |
mc_adv = 1'b0; |
|
bank_set = 1'b0; |
bank_clr = 1'b0; |
bank_clr_all = 1'b0; |
|
burst_cnt_ld = 1'b0; |
burst_cnt_ld_4 = 1'b0; |
tmr_ld_trp = 1'b0; |
tmr_ld_trcd = 1'b0; |
tmr_ld_tcl = 1'b0; |
tmr_ld_trfc = 1'b0; |
tmr_ld_twr = 1'b0; |
tmr_ld_txsr = 1'b0; |
tmr_ld_trdv = 1'b0; |
tmr_ld_trdz = 1'b0; |
tmr_ld_twr2 = 1'b0; |
tmr_ld_tavav = 1'b0; |
|
tmr2_ld_trdv = 1'b0; |
tmr2_ld_trdz = 1'b0; |
|
tmr2_ld_twpw = 1'b0; |
tmr2_ld_twd = 1'b0; |
tmr2_ld_twwd = 1'b0; |
tmr2_ld_tsrdv = 1'b0; |
tmr2_ld_tscsto = 1'b0; |
|
mem_ack_d = 1'b0; |
err_d = 1'b0; |
rfr_ack_d = 1'b0; |
lmr_ack_d = 1'b0; |
init_ack = 1'b0; |
|
ir_cnt_dec = 1'b0; |
ir_cnt_ld = 1'b0; |
|
row_sel = 1'b0; |
cs_le_d = 1'b0; |
wr_clr = 1'b0; |
wr_set = 1'b0; |
wb_cycle_set = 1'b0; |
dv = 1'b0; |
|
suspended_d = 1'b0; |
susp_sel_set = 1'b0; |
susp_sel_clr = 1'b0; |
mc_bg = 1'b0; |
|
next_adr = 1'b0; |
pack_le0_d = 1'b0; |
pack_le1_d = 1'b0; |
pack_le2_d = 1'b0; |
|
mc_c_oe_d = 1'b1; |
|
case(state) // synopsys full_case parallel_case |
`ifdef MC_POR_DELAY |
POR: |
begin |
if(tmr_done) next_state = IDLE; |
end |
`endif |
IDLE: |
begin |
//cs_le_d = wb_stb_first | lmr_req; |
cs_le_d = wb_stb_first; |
|
burst_cnt_ld = 1'b1; |
wr_clr = 1'b1; |
|
if(mem_type == `MC_MEM_TYPE_SCS) tmr2_ld_tscsto = 1'b1; |
if(mem_type == `MC_MEM_TYPE_SRAM) tmr2_ld_tsrdv = 1'b1; |
|
if(rfr_req) |
begin |
rfr_ack_d = 1'b1; |
next_state = PRECHARGE; |
end |
else |
if(init_req) |
begin |
cs_le_d = 1'b1; |
next_state = INIT0; |
end |
else |
if(lmr_req & lookup_ready2) |
begin |
lmr_ack_d = 1'b1; |
cs_le_d = 1'b1; |
next_state = LMR0; |
end |
else |
if(susp_req_r & !wb_cycle) |
begin |
cs_le_d = 1'b1; |
susp_sel_set = 1'b1; |
next_state = SUSP1; |
end |
else |
if(cs_a & (wb_read_go | wb_write_go) & lookup_ready2) |
begin |
wb_cycle_set = 1'b1; |
case(mem_type) // synopsys full_case parallel_case |
`MC_MEM_TYPE_SDRAM: // SDRAM |
if((lookup_ready2) & !wb_wait) |
begin |
if(wb_write_go | (wb_we_i & wb_stb_i)) wr_set = 1'b1; |
if(kro & bank_open & row_same) next_state = SD_RD_WR; |
else |
if(kro & bank_open) next_state = PRECHARGE; |
else next_state = ACTIVATE; |
end |
`MC_MEM_TYPE_ACS: |
begin // Async Chip Select |
if(!wb_wait) |
begin |
cs_le_d = 1'b1; |
if(wb_write_go) |
begin |
data_oe_d = 1'b1; |
next_state = ACS_WR; |
end |
else next_state = ACS_RD; |
end |
end |
`MC_MEM_TYPE_SCS: |
begin // Sync Chip Select |
if(!wb_wait) |
begin |
cs_le_d = 1'b1; |
if(wb_write_go) |
begin |
cmd = `MC_CMD_XWR; |
data_oe_d = 1'b1; |
tmr_ld_twr2 = 1'b1; |
next_state = SCS_WR; |
end |
else |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr_ld_trdv = 1'b1; |
next_state = SCS_RD; |
end |
end |
end |
`MC_MEM_TYPE_SRAM: |
begin // SRAM |
if(!wb_wait) |
begin |
cs_le_d = 1'b1; |
if(wb_write_go) |
begin |
data_oe_d = 1'b1; |
mem_ack_d = 1'b1; |
next_state = SRAM_WR; |
end |
else |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
mc_adsc = 1'b1; |
next_state = SRAM_RD; |
end |
end |
end |
endcase |
end |
else |
if(mc_br) |
begin |
if(!cmd_asserted2) |
begin |
next_state = BG0; |
mc_c_oe_d = 1'b0; |
end |
end |
end |
|
IDLE_T: |
begin |
cmd_a10 = cmd_a10_r; // Hold Auto Precharge 'til cycle finishes |
if(tmr_done & wb_cycle & !wb_wait) cs_le_d = 1'b1; |
if(tmr_done) next_state = IDLE; |
end |
|
IDLE_T2: |
begin |
if(tmr2_done & (!wb_wait | !wb_cycle) ) |
begin |
cs_le_d = wb_cycle; |
if(cs_le_r | !wb_cycle) next_state = IDLE; |
end |
end |
|
///////////////////////////////////////// |
// SCS STATES .... |
///////////////////////////////////////// |
SCS_RD: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr_ld_trdv = 1'b1; |
if(mc_ack) next_state = SCS_RD1; |
else |
if(tmr2_done) next_state = SCS_ERR; |
end |
|
SCS_RD1: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
if(tmr_done) |
begin |
mem_ack_d = 1'b1; |
tmr_ld_trdz = 1'b1; |
next_state = SCS_RD2; |
end |
end |
|
SCS_RD2: |
begin |
tmr_ld_trdz = 1'b1; |
next_state = IDLE_T; |
end |
|
SCS_WR: |
begin |
tmr_ld_twr2 = 1'b1; |
cmd = `MC_CMD_XWR; |
data_oe_d = 1'b1; |
if(mc_ack) next_state = SCS_WR1; |
else |
if(tmr2_done) next_state = SCS_ERR; |
end |
|
SCS_WR1: |
begin |
data_oe_d = 1'b1; |
if(tmr_done) |
begin |
mem_ack_d = 1'b1; |
next_state = IDLE_T; |
end |
else cmd = `MC_CMD_XWR; |
end |
|
SCS_ERR: |
begin |
mem_ack_d = 1'b1; |
err_d = 1'b1; |
next_state = IDLE_T2; |
end |
|
///////////////////////////////////////// |
// SSRAM STATES .... |
///////////////////////////////////////// |
SRAM_RD: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
mc_adsc = 1'b1; |
tmr2_ld_tsrdv = 1'b1; |
burst_cnt_ld_4 = 1'b1; |
if(cmd_asserted) next_state = SRAM_RD0; |
end |
|
SRAM_RD0: |
begin |
mc_adv = 1'b1; |
oe_d = 1'b1; |
if(tmr2_done) |
begin |
mc_adv = !wb_wait; |
next_state = SRAM_RD1; |
end |
end |
|
SRAM_RD1: |
begin |
if(mc_adv_r) dv = ~dv_r; |
mc_adv = !wb_wait; |
|
if(!burst_act | !wb_read_go) next_state = SRAM_RD2; |
else oe_d = 1'b1; |
end |
|
SRAM_RD2: |
begin |
if(ack_cnt_is_0 & wb_read_go) next_state = SRAM_RD3; |
else |
if(!wb_read_go) |
begin |
mc_adsc = 1'b1; |
next_state = SRAM_RD4; |
end |
end |
|
SRAM_RD3: |
begin |
if(!wb_read_go) |
begin |
mc_adsc = 1'b1; |
next_state = SRAM_RD4; |
end |
else |
if(!wb_wait) |
begin |
cs_le_d = 1'b1; |
next_state = SRAM_RD; |
end |
end |
|
SRAM_RD4: // DESELECT |
begin |
if(wb_cycle) cs_le_d = 1'b1; // For RMW |
mc_adsc = 1'b1; |
next_state = IDLE; |
end |
|
SRAM_WR: |
begin |
cmd = `MC_CMD_XWR; |
mc_adsc = 1'b1; |
data_oe_d = 1'b1; |
if(cmd_asserted) |
begin |
if(wb_wait) next_state = SRAM_WR0; |
else |
if(!wb_write_go) |
begin |
mc_adsc = 1'b1; |
next_state = SRAM_RD4; |
end |
else |
begin |
data_oe_d = 1'b1; |
mem_ack_d = ~mem_ack_r; |
end |
end |
end |
|
SRAM_WR0: |
begin |
if(wb_wait) next_state = SRAM_WR0; |
else |
if(!wb_write_go) |
begin |
mc_adsc = 1'b1; |
next_state = SRAM_RD4; |
end |
else |
begin |
data_oe_d = 1'b1; |
next_state = SRAM_WR; |
end |
end |
|
///////////////////////////////////////// |
// Async Devices STATES .... |
///////////////////////////////////////// |
ACS_RD: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr2_ld_trdv = 1'b1; |
next_state = ACS_RD1; |
end |
|
ACS_RD1: |
begin // 32 bit, 8 bit - first; 16 bit - first |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
if(tmr2_done) |
begin |
if(bw8 | bw16) next_adr = 1'b1; |
if(bw8) next_state = ACS_RD_8_1; |
else |
if(bw16) next_state = ACS_RD_8_5; |
else next_state = ACS_RD2A; |
end |
end |
|
ACS_RD_8_1: |
begin // 8 bit 2nd byte |
pack_le0_d = 1'b1; |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr2_ld_trdv = 1'b1; |
next_state = ACS_RD_8_2; |
end |
|
ACS_RD_8_2: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
if(tmr2_done) |
begin |
next_adr = 1'b1; |
next_state = ACS_RD_8_3; |
end |
end |
|
ACS_RD_8_3: |
begin // 8 bit 3rd byte |
pack_le1_d = 1'b1; |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr2_ld_trdv = 1'b1; |
next_state = ACS_RD_8_4; |
end |
|
ACS_RD_8_4: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
if(tmr2_done) |
begin |
next_adr = 1'b1; |
next_state = ACS_RD_8_5; |
end |
end |
|
ACS_RD_8_5: |
begin // 8 bit 4th byte; 16 bit 2nd word |
if(bw8) pack_le2_d = 1'b1; |
if(bw16) pack_le0_d = 1'b1; |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
tmr2_ld_trdv = 1'b1; |
next_state = ACS_RD_8_6; |
end |
|
ACS_RD_8_6: |
begin |
cmd = `MC_CMD_XRD; |
oe_d = 1'b1; |
if(tmr2_done) |
begin |
next_state = ACS_RD2; |
end |
end |
|
ACS_RD2A: |
begin |
oe_d = 1'b1; |
cmd = `MC_CMD_XRD; |
next_state = ACS_RD2; |
end |
|
ACS_RD2: |
begin |
cmd = `MC_CMD_XRD; |
next_state = ACS_RD3; |
end |
|
ACS_RD3: |
begin |
mem_ack_d = 1'b1; |
tmr2_ld_trdz = 1'b1; |
next_state = IDLE_T2; |
end |
|
ACS_WR: |
begin |
tmr2_ld_twpw = 1'b1; |
cmd = `MC_CMD_XWR; |
data_oe_d = 1'b1; |
next_state = ACS_WR1; |
end |
|
ACS_WR1: |
begin |
if(!cmd_asserted) tmr2_ld_twpw = 1'b1; |
cmd = `MC_CMD_XWR; |
data_oe_d = 1'b1; |
if(tmr2_done) |
begin |
tmr2_ld_twd = 1'b1; |
next_state = ACS_WR2; |
end |
end |
|
ACS_WR2: |
begin |
if(twd_is_zero) next_state = ACS_WR3; |
else |
begin |
cmd = `MC_CMD_XRD; |
data_oe_d = 1'b1; |
next_state = ACS_WR3; |
end |
end |
|
ACS_WR3: |
begin |
if(tmr2_done) next_state = ACS_WR4; |
else cmd = `MC_CMD_XRD; |
end |
|
ACS_WR4: |
begin |
tmr2_ld_twwd = 1'b1; |
mem_ack_d = 1'b1; |
next_state = IDLE_T2; |
end |
|
///////////////////////////////////////// |
// SDRAM STATES .... |
///////////////////////////////////////// |
|
PRECHARGE: |
begin |
cmd = `MC_CMD_PC; |
if(rfr_ack_r) |
begin |
rfr_ack_d = 1'b1; |
cmd_a10 = `MC_ALL_BANKS; |
bank_clr_all = 1'b1; |
end |
else |
begin |
bank_clr = 1'b1; |
cmd_a10 = `MC_SINGLE_BANK; |
end |
tmr_ld_trp = 1'b1; |
if(cmd_asserted) next_state = PRECHARGE_W; |
end |
|
PRECHARGE_W: |
begin |
rfr_ack_d = rfr_ack_r; |
if(tmr_done) |
begin |
if(rfr_ack_r) next_state = REFR; |
else next_state = ACTIVATE; |
end |
end |
|
ACTIVATE: |
begin |
if(!wb_wait_r) |
begin |
row_sel = 1'b1; |
tmr_ld_trcd = 1'b1; |
cmd = `MC_CMD_ACT; |
end |
if(cmd_asserted) next_state = ACTIVATE_W; |
end |
|
ACTIVATE_W: |
begin |
row_sel = 1'b1; |
if(wb_write_go | (wb_we_i & wb_stb_i)) wr_set = 1'b1; |
|
if(kro) bank_set = 1'b1; |
|
if(tmr_done) |
begin |
if(wb_write_go) |
begin |
mem_ack_d = ~mem_ack_r; |
cmd_a10 = ap_en | (single_write & !kro); |
next_state = SD_WR; |
end |
else |
if(!wb_wait_r) next_state = SD_RD; |
end |
end |
|
SD_RD_WR: |
begin |
if(wb_write_go | (wb_we_i & wb_stb_i)) wr_set = 1'b1; |
|
if(wb_write_go & !wb_wait) |
begin // Write |
data_oe_d = 1'b1; |
mem_ack_d = ~mem_ack_r; |
cmd_a10 = ap_en | (single_write & !kro); |
next_state = SD_WR; |
end |
else |
if(!wb_wait) |
begin // Read |
if(kro) |
begin |
if(!wb_wait_r) next_state = SD_RD; |
end |
else next_state = SD_RD; |
end |
end |
|
SD_WR: // Write Command |
begin // Does the first single write |
data_oe_d = 1'b1; |
tmr_ld_twr = 1'b1; |
cnt_next = ~cnt; |
cmd = `MC_CMD_WR; |
|
cmd_a10 = ap_en | (single_write & !kro); |
|
if(!cnt & wb_cycle & burst_act) cke_d = ~wb_wait; |
else cke_d = cke_r; |
|
if(cmd_asserted) |
begin |
mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wb_cycle & burst_act; |
|
if(wb_cycle & !burst_act) next_state = IDLE_T; |
else |
if(wb_write_go) next_state = SD_WR_W; |
else |
if(burst_act & !single_write) next_state = BT; |
else |
if(!ap_en) next_state = BT_W; |
else next_state = IDLE_T; |
end |
|
end |
|
SD_WR_W: |
begin // Does additional Writes or Times them |
tmr_ld_twr = 1'b1; |
cnt_next = ~cnt; |
|
if(single_write & wb_cycle) |
begin |
cmd = `MC_CMD_WR; |
end |
cmd_a10 = ap_en | (single_write & !kro); |
|
data_oe_d = 1'b1; |
mem_ack_d = !mem_ack_r & wb_write_go & !wb_wait & wr_cycle & burst_act; |
|
if(!cnt) cke_d = ~wb_wait; |
else cke_d = cke_r; |
|
if( (single_write & cke_r) | (!single_write & !cnt & !wb_wait) | (!single_write & cnt & cke_r) ) |
begin |
if(single_write & !wb_cycle) next_state = IDLE_T; |
else |
if(burst_act & !single_write & !wb_write_go_r) |
begin |
cmd = `MC_CMD_BT; |
next_state = BT; |
end |
else |
if(!burst_act & !ap_en) next_state = BT_W; |
else |
if(!burst_act) next_state = IDLE_T; |
else |
if(!wb_write_go_r & wb_read_go) next_state = IDLE_T; // Added for WMR |
end |
end |
|
SD_RD: // Read Command |
begin |
cmd = `MC_CMD_RD; |
cmd_a10 = ap_en; |
tmr_ld_tcl = 1'b1; |
if(cmd_asserted) next_state = SD_RD_W; |
end |
|
SD_RD_W: |
begin |
if(tmr_done) next_state = SD_RD_LOOP; |
end |
|
SD_RD_LOOP: |
begin |
cnt_next = ~cnt; |
|
if(cnt & !(burst_act & !wb_cycle) & burst_act ) cke_rd = !wb_wait; |
else cke_rd = cke_; |
|
if(wb_cycle & !cnt & burst_act_rd & cke_o_del) dv = 1'b1; |
|
if(wb_cycle & wb_write_go) next_state = BT; |
else |
if(burst_act & !wb_cycle) next_state = BT; |
else |
if(!burst_act) next_state = SD_RD_W2; |
end |
|
SD_RD_W2: |
begin |
if(wb_write_go | ack_cnt_is_0) |
begin |
if(!ap_en & !kro) next_state = BT_W; |
else |
if(!wb_wait & !mem_ack_r) next_state = IDLE_T; |
end |
end |
|
BT: |
begin |
cmd = `MC_CMD_BT; |
tmr_ld_trp = 1'b1; |
if(cmd_asserted) next_state = BT_W; |
end |
|
BT_W: |
begin |
cmd_a10 = cmd_a10_r; // Hold Auto Precharge 'til cycle finishes |
|
if(kro & tmr_done) |
begin |
if(kro & !wb_wait & (wb_read_go | wb_write_go) ) cs_le_d = 1'b1; |
next_state = IDLE; |
end |
else |
if(!kro & tmr_done) // Must do a PRECHARGE after Burst Terminate |
begin |
bank_clr = 1'b1; |
cmd = `MC_CMD_PC; |
cmd_a10 = `MC_SINGLE_BANK; |
tmr_ld_trp = 1'b1; |
if(cmd_asserted) next_state = IDLE_T; |
end |
end |
|
REFR: // Refresh Cycle |
begin |
cs_le_d = 1'b1; |
cmd = `MC_CMD_ARFR; |
tmr_ld_trfc = 1'b1; |
rfr_ack_d = 1'b1; |
if(cmd_asserted) |
begin |
susp_sel_clr = 1'b1; |
next_state = IDLE_T; |
end |
end |
|
LMR0: |
begin |
lmr_ack_d = 1'b1; |
cmd = `MC_CMD_PC; |
cmd_a10 = `MC_ALL_BANKS; |
bank_clr_all = 1'b1; |
tmr_ld_trp = 1'b1; |
if(cmd_asserted) next_state = LMR1; |
end |
|
LMR1: |
begin |
lmr_ack_d = 1'b1; |
if(tmr_done) next_state = LMR2; |
end |
|
LMR2: |
begin |
bank_clr_all = 1'b1; |
cmd = `MC_CMD_LMR; |
tmr_ld_trfc = 1'b1; |
lmr_ack_d = 1'b1; |
if(cmd_asserted) next_state = IDLE_T; |
end |
|
INIT0: |
begin |
cs_le_d = 1'b1; |
next_state = INIT; |
end |
|
INIT: // Initialize SDRAMS |
begin // PRECHARGE |
init_ack = 1'b1; |
cmd = `MC_CMD_PC; |
cmd_a10 = `MC_ALL_BANKS; |
bank_clr_all = 1'b1; |
tmr_ld_trp = 1'b1; |
ir_cnt_ld = 1'b1; |
if(cmd_asserted) next_state = INIT_W; |
end |
|
INIT_W: |
begin |
init_ack = 1'b1; |
if(tmr_done) next_state = INIT_REFR1; |
end |
|
INIT_REFR1: // Init Refresh Cycle 1 |
begin |
init_ack = 1'b1; |
cmd = `MC_CMD_ARFR; |
tmr_ld_trfc = 1'b1; |
if(cmd_asserted) |
begin |
ir_cnt_dec = 1'b1; |
next_state = INIT_REFR1_W; |
end |
end |
|
INIT_REFR1_W: |
begin |
init_ack = 1'b1; |
if(tmr_done) |
begin |
if(ir_cnt_done) next_state = INIT_LMR; |
else next_state = INIT_REFR1; |
end |
end |
|
INIT_LMR: |
begin |
init_ack = 1'b1; |
cmd = `MC_CMD_LMR; |
bank_clr_all = 1'b1; |
tmr_ld_trfc = 1'b1; |
if(cmd_asserted) next_state = IDLE_T; |
end |
|
///////////////////////////////////////// |
// Bus Arbitration STATES .... |
///////////////////////////////////////// |
BG0: |
begin // Bus Grant |
mc_bg = 1'b1; |
mc_c_oe_d = 1'b0; |
next_state = BG1; |
end |
BG1: |
begin // Bus Grant |
mc_bg = 1'b1; |
cs_le_d = 1'b1; |
mc_c_oe_d = 1'b0; |
next_state = BG2; |
end |
BG2: |
begin // Bus Grant |
cs_le_d = 1'b1; |
mc_bg = !wb_read_go & !wb_write_go & |
!rfr_req & !init_req & !lmr_req & |
!susp_req_r; |
tmr_ld_tavav = 1'b1; |
mc_c_oe_d = mc_br; |
if(!mc_br) next_state = IDLE_T; |
end |
|
///////////////////////////////////////// |
// SUSPEND/RESUME STATES .... |
///////////////////////////////////////// |
SUSP1: |
begin // Precharge All |
cmd = `MC_CMD_PC; |
cmd_a10 = `MC_ALL_BANKS; |
bank_clr_all = 1'b1; |
tmr_ld_trp = 1'b1; |
if(cmd_asserted) next_state = SUSP2; |
end |
|
SUSP2: |
begin |
if(tmr_done) next_state = SUSP3; |
end |
|
SUSP3: |
begin // Enter Self refresh Mode |
cke_d = 1'b0; |
cmd = `MC_CMD_ARFR; |
rfr_ack_d = 1'b1; |
if(cmd_asserted) |
begin |
next_state = SUSP4; |
end |
end |
|
SUSP4: |
begin // Now we are suspended |
cke_rd = 1'b0; |
suspended_d = 1'b1; |
tmr_ld_txsr = 1'b1; |
if(resume_req_r) next_state = RESUME1; |
end |
|
RESUME1: |
begin |
suspended_d = 1'b1; |
tmr_ld_txsr = 1'b1; |
next_state = RESUME2; |
end |
|
RESUME2: |
begin |
suspended_d = 1'b1; |
if(tmr_done) next_state = REFR; |
end |
|
// synopsys translate_off |
default: |
$display("MC_TIMING SM: Entered non existing state ... (%t)",$time); |
// synopsys translate_on |
|
endcase |
end |
|
endmodule |
/verilog/minsoc/mc/mc_rf.v
0,0 → 1,836
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Register File //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_rf.v,v 1.8 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.8 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_rf.v,v $ |
// Revision 1.8 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.7 2001/12/21 05:09:29 rudi |
// |
// - Fixed combinatorial loops in synthesis |
// - Fixed byte select bug |
// |
// Revision 1.6 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.5 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.4 2001/10/04 03:19:37 rudi |
// |
// Fixed Register reads |
// Tightened up timing for register rd/wr |
// |
// Revision 1.3 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:42 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_rf(clk, rst, |
|
wb_data_i, rf_dout, wb_addr_i, wb_we_i, wb_cyc_i, |
wb_stb_i, wb_ack_o, wp_err, |
|
csc, tms, poc, |
sp_csc, sp_tms, cs, |
mc_data_i, mc_sts, mc_vpen, fs, |
|
cs_le_d, cs_le, cs_need_rfr, ref_int, rfr_ps_val, init_req, |
init_ack, lmr_req, lmr_ack, |
spec_req_cs |
); |
|
input clk, rst; |
|
// -------------------------------------- |
// WISHBONE INTERFACE |
|
// Slave Interface |
input [31:0] wb_data_i; |
output [31:0] rf_dout; |
input [31:0] wb_addr_i; |
input wb_we_i; |
input wb_cyc_i; |
input wb_stb_i; |
output wb_ack_o; |
output wp_err; |
|
// -------------------------------------- |
// Misc Signals |
output [31:0] csc; |
output [31:0] tms; |
output [31:0] poc; |
output [31:0] sp_csc; |
output [31:0] sp_tms; |
output [7:0] cs; |
|
input [31:0] mc_data_i; |
input mc_sts; |
output mc_vpen; |
output fs; |
|
input cs_le_d; |
input cs_le; |
|
output [7:0] cs_need_rfr; // Indicates which chip selects have SDRAM |
// attached and need to be refreshed |
output [2:0] ref_int; // Refresh Interval |
output [7:0] rfr_ps_val; |
|
output init_req; |
input init_ack; |
output lmr_req; |
input lmr_ack; |
|
output [7:0] spec_req_cs; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Wires |
// |
|
reg wb_ack_o; |
|
reg [31:0] csc; |
reg [31:0] tms; |
reg [31:0] sp_csc; |
reg [31:0] sp_tms; |
reg [31:0] rf_dout; |
reg [7:0] cs; |
|
reg rf_we; |
wire [31:0] csr; |
reg [10:0] csr_r; |
reg [7:0] csr_r2; |
reg [31:0] poc; |
|
wire [31:0] csc_mask; |
reg [10:0] csc_mask_r; |
|
wire [31:0] csc0, tms0; |
wire [31:0] csc1, tms1; |
wire [31:0] csc2, tms2; |
wire [31:0] csc3, tms3; |
wire [31:0] csc4, tms4; |
wire [31:0] csc5, tms5; |
wire [31:0] csc6, tms6; |
wire [31:0] csc7, tms7; |
|
wire cs0, cs1, cs2, cs3; |
wire cs4, cs5, cs6, cs7; |
wire wp_err0, wp_err1, wp_err2, wp_err3; |
wire wp_err4, wp_err5, wp_err6, wp_err7; |
reg wp_err; |
|
wire lmr_req7, lmr_req6, lmr_req5, lmr_req4; |
wire lmr_req3, lmr_req2, lmr_req1, lmr_req0; |
wire lmr_ack7, lmr_ack6, lmr_ack5, lmr_ack4; |
wire lmr_ack3, lmr_ack2, lmr_ack1, lmr_ack0; |
|
wire init_req7, init_req6, init_req5, init_req4; |
wire init_req3, init_req2, init_req1, init_req0; |
wire init_ack7, init_ack6, init_ack5, init_ack4; |
wire init_ack3, init_ack2, init_ack1, init_ack0; |
|
reg init_ack_r; |
wire init_ack_fe; |
reg lmr_ack_r; |
wire lmr_ack_fe; |
wire [7:0] spec_req_cs_t; |
wire [7:0] spec_req_cs_d; |
reg [7:0] spec_req_cs; |
reg init_req, lmr_req; |
reg sreq_cs_le; |
|
// Aliases |
assign csr = {csr_r2, 8'h0, 5'h0, csr_r}; |
assign csc_mask = {21'h0, csc_mask_r}; |
|
//////////////////////////////////////////////////////////////////// |
// |
// WISHBONE Register Read logic |
// |
|
always @(wb_addr_i or csr or poc or csc_mask or csc0 or tms0 or csc1 or |
tms1 or csc2 or tms2 or csc3 or tms3 or csc4 or tms4 or csc5 or |
tms5 or csc6 or tms6 or csc7 or tms7) |
case(wb_addr_i[6:2]) // synopsys full_case parallel_case |
5'h00: rf_dout <= #1 csr; |
5'h01: rf_dout <= #1 poc; |
5'h02: rf_dout <= #1 csc_mask; |
|
5'h04: rf_dout <= #1 csc0; |
5'h05: rf_dout <= #1 tms0; |
5'h06: rf_dout <= #1 csc1; |
5'h07: rf_dout <= #1 tms1; |
5'h08: rf_dout <= #1 csc2; |
5'h09: rf_dout <= #1 tms2; |
5'h0a: rf_dout <= #1 csc3; |
5'h0b: rf_dout <= #1 tms3; |
5'h0c: rf_dout <= #1 csc4; |
5'h0d: rf_dout <= #1 tms4; |
5'h0e: rf_dout <= #1 csc5; |
5'h0f: rf_dout <= #1 tms5; |
5'h10: rf_dout <= #1 csc6; |
5'h11: rf_dout <= #1 tms6; |
5'h12: rf_dout <= #1 csc7; |
5'h13: rf_dout <= #1 tms7; |
endcase |
|
//////////////////////////////////////////////////////////////////// |
// |
// WISHBONE Register Write logic |
// |
|
reg [6:0] wb_addr_r; |
|
always @(posedge clk) |
wb_addr_r <= #1 wb_addr_i[6:0]; |
|
always @(posedge clk or posedge rst) |
if(rst) rf_we <= #1 1'b0; |
else rf_we <= #1 `MC_REG_SEL & wb_we_i & wb_cyc_i & wb_stb_i & !rf_we; |
|
always @(posedge clk or posedge rst) |
if(rst) csr_r2 <= #1 8'h0; |
else |
if(rf_we & (wb_addr_r[6:2] == 5'h0) ) |
csr_r2 <= #1 wb_data_i[31:24]; |
|
always @(posedge clk or posedge rst) |
if(rst) csr_r[10:1] <= #1 10'h0; |
else |
if(rf_we & (wb_addr_r[6:2] == 5'h0) ) |
csr_r[10:1] <= #1 wb_data_i[10:1]; |
|
always @(posedge clk) |
csr_r[0] <= #1 mc_sts; |
|
assign mc_vpen = csr_r[1]; |
assign fs = csr_r[2]; |
assign rfr_ps_val = csr_r2[7:0]; |
|
always @(posedge clk or posedge rst) |
if(rst) csc_mask_r <= #1 `MC_BA_MASK_VAL; |
else |
if(rf_we & (wb_addr_r[6:2] == 5'h2) ) |
csc_mask_r <= #1 wb_data_i[10:0]; |
|
//////////////////////////////////////////////////////////////////// |
// |
// A kludge for cases where there is no clock during reset ... |
// |
|
reg rst_r1, rst_r2, rst_r3; |
|
always @(posedge clk or posedge rst) |
if(rst) rst_r1 <= #1 1'b1; |
else rst_r1 <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) rst_r2 <= #1 1'b1; |
else rst_r2 <= #1 rst_r1; |
|
always @(posedge clk or posedge rst) |
if(rst) rst_r3 <= #1 1'b1; |
else rst_r3 <= #1 rst_r2; |
|
always @(posedge clk) |
if(rst_r3) poc <= #1 `MC_POC_VAL; |
|
//////////////////////////////////////////////////////////////////// |
// |
// WISHBONE Register Ack logic |
// |
|
always @(posedge clk) |
wb_ack_o <= #1 `MC_REG_SEL & wb_cyc_i & wb_stb_i & !wb_ack_o; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Select CSC and TMS Registers |
// |
|
always @(posedge clk or posedge rst) |
if(rst) cs <= #1 8'h0; |
else |
if(cs_le) cs <= #1 {cs7, cs6, cs5, cs4, cs3, cs2, cs1, cs0}; |
|
always @(posedge clk or posedge rst) |
if(rst) wp_err <= #1 1'b0; |
else |
if(cs_le & wb_cyc_i & wb_stb_i) |
wp_err <= #1 wp_err7 | wp_err6 | wp_err5 | wp_err4 | |
wp_err3 | wp_err2 | wp_err1 | wp_err0; |
else |
if(!wb_cyc_i) wp_err <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) csc <= #1 32'h0; |
else |
if(cs_le_d & wb_cyc_i & wb_stb_i) |
begin |
if(cs0) csc <= #1 csc0; |
else |
if(cs1) csc <= #1 csc1; |
else |
if(cs2) csc <= #1 csc2; |
else |
if(cs3) csc <= #1 csc3; |
else |
if(cs4) csc <= #1 csc4; |
else |
if(cs5) csc <= #1 csc5; |
else |
if(cs6) csc <= #1 csc6; |
else csc <= #1 csc7; |
end |
|
always @(posedge clk or posedge rst) |
if(rst) tms <= #1 32'hffff_ffff; |
else |
if((cs_le_d | rf_we) & wb_cyc_i & wb_stb_i) |
begin |
if(cs0) tms <= #1 tms0; |
else |
if(cs1) tms <= #1 tms1; |
else |
if(cs2) tms <= #1 tms2; |
else |
if(cs3) tms <= #1 tms3; |
else |
if(cs4) tms <= #1 tms4; |
else |
if(cs5) tms <= #1 tms5; |
else |
if(cs6) tms <= #1 tms6; |
else tms <= #1 tms7; |
end |
|
always @(posedge clk or posedge rst) |
if(rst) sp_csc <= #1 32'h0; |
else |
if(cs_le_d & wb_cyc_i & wb_stb_i) |
begin |
if(spec_req_cs[0]) sp_csc <= #1 csc0; |
else |
if(spec_req_cs[1]) sp_csc <= #1 csc1; |
else |
if(spec_req_cs[2]) sp_csc <= #1 csc2; |
else |
if(spec_req_cs[3]) sp_csc <= #1 csc3; |
else |
if(spec_req_cs[4]) sp_csc <= #1 csc4; |
else |
if(spec_req_cs[5]) sp_csc <= #1 csc5; |
else |
if(spec_req_cs[6]) sp_csc <= #1 csc6; |
else sp_csc <= #1 csc7; |
end |
|
always @(posedge clk or posedge rst) |
if(rst) sp_tms <= #1 32'hffff_ffff; |
else |
if((cs_le_d | rf_we) & wb_cyc_i & wb_stb_i) |
begin |
if(spec_req_cs[0]) sp_tms <= #1 tms0; |
else |
if(spec_req_cs[1]) sp_tms <= #1 tms1; |
else |
if(spec_req_cs[2]) sp_tms <= #1 tms2; |
else |
if(spec_req_cs[3]) sp_tms <= #1 tms3; |
else |
if(spec_req_cs[4]) sp_tms <= #1 tms4; |
else |
if(spec_req_cs[5]) sp_tms <= #1 tms5; |
else |
if(spec_req_cs[6]) sp_tms <= #1 tms6; |
else sp_tms <= #1 tms7; |
end |
|
assign cs_need_rfr[0] = csc0[0] & (csc0[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[1] = csc1[0] & (csc1[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[2] = csc2[0] & (csc2[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[3] = csc3[0] & (csc3[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[4] = csc4[0] & (csc4[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[5] = csc5[0] & (csc5[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[6] = csc6[0] & (csc6[3:1] == `MC_MEM_TYPE_SDRAM); |
assign cs_need_rfr[7] = csc7[0] & (csc7[3:1] == `MC_MEM_TYPE_SDRAM); |
|
assign ref_int = csr_r[10:8]; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Init & Lmr Logic |
// |
|
// Init Ack falling edge detector |
always @(posedge clk) |
init_ack_r <= #1 init_ack; |
|
assign init_ack_fe = init_ack_r & !init_ack; |
|
// LMR Ack falling edge detector |
always @(posedge clk) |
lmr_ack_r <= #1 lmr_ack; |
|
assign lmr_ack_fe = lmr_ack_r & !lmr_ack; |
|
// Chip Select Output |
always @(posedge clk or posedge rst) |
if(rst) spec_req_cs <= #1 8'h0; |
else |
if(sreq_cs_le) spec_req_cs <= #1 spec_req_cs_d; |
|
always @(posedge clk or posedge rst) |
if(rst) sreq_cs_le <= #1 1'b0; |
else sreq_cs_le <= #1 (!init_req & !lmr_req) | lmr_ack_fe | init_ack_fe; |
|
// Make sure only one is serviced at a time |
assign spec_req_cs_d[0] = spec_req_cs_t[0]; |
assign spec_req_cs_d[1] = spec_req_cs_t[1] & !spec_req_cs_t[0]; |
assign spec_req_cs_d[2] = spec_req_cs_t[2] & !( |spec_req_cs_t[1:0] ); |
assign spec_req_cs_d[3] = spec_req_cs_t[3] & !( |spec_req_cs_t[2:0] ); |
assign spec_req_cs_d[4] = spec_req_cs_t[4] & !( |spec_req_cs_t[3:0] ); |
assign spec_req_cs_d[5] = spec_req_cs_t[5] & !( |spec_req_cs_t[4:0] ); |
assign spec_req_cs_d[6] = spec_req_cs_t[6] & !( |spec_req_cs_t[5:0] ); |
assign spec_req_cs_d[7] = spec_req_cs_t[7] & !( |spec_req_cs_t[6:0] ); |
|
// Request Tracking |
always @(posedge clk or posedge rst) |
if(rst) init_req <= #1 1'b0; |
else init_req <= #1 init_req0 | init_req1 | init_req2 | init_req3 | |
init_req4 | init_req5 | init_req6 | init_req7; |
|
always @(posedge clk or posedge rst) |
if(rst) lmr_req <= #1 1'b0; |
else lmr_req <= #1 lmr_req0 | lmr_req1 | lmr_req2 | lmr_req3 | |
lmr_req4 | lmr_req5 | lmr_req6 | lmr_req7; |
|
assign spec_req_cs_t = !init_req ? // Load Mode Register Requests |
{lmr_req7, lmr_req6, lmr_req5, lmr_req4, |
lmr_req3, lmr_req2, lmr_req1, lmr_req0 } : |
// Initialize SDRAM Requests |
{init_req7, init_req6, init_req5, init_req4, |
init_req3, init_req2, init_req1, init_req0 }; |
|
// Ack distribution |
assign lmr_ack0 = spec_req_cs[0] & lmr_ack_fe; |
assign lmr_ack1 = spec_req_cs[1] & lmr_ack_fe; |
assign lmr_ack2 = spec_req_cs[2] & lmr_ack_fe; |
assign lmr_ack3 = spec_req_cs[3] & lmr_ack_fe; |
assign lmr_ack4 = spec_req_cs[4] & lmr_ack_fe; |
assign lmr_ack5 = spec_req_cs[5] & lmr_ack_fe; |
assign lmr_ack6 = spec_req_cs[6] & lmr_ack_fe; |
assign lmr_ack7 = spec_req_cs[7] & lmr_ack_fe; |
|
assign init_ack0 = spec_req_cs[0] & init_ack_fe; |
assign init_ack1 = spec_req_cs[1] & init_ack_fe; |
assign init_ack2 = spec_req_cs[2] & init_ack_fe; |
assign init_ack3 = spec_req_cs[3] & init_ack_fe; |
assign init_ack4 = spec_req_cs[4] & init_ack_fe; |
assign init_ack5 = spec_req_cs[5] & init_ack_fe; |
assign init_ack6 = spec_req_cs[6] & init_ack_fe; |
assign init_ack7 = spec_req_cs[7] & init_ack_fe; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Modules |
// |
|
mc_cs_rf #(3'h0) u0( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc0 ), |
.tms( tms0 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs0 ), |
.wp_err( wp_err0 ), |
.lmr_req( lmr_req0 ), |
.lmr_ack( lmr_ack0 ), |
.init_req( init_req0 ), |
.init_ack( init_ack0 ) |
); |
|
`ifdef MC_HAVE_CS1 |
mc_cs_rf #(3'h1) u1( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc1 ), |
.tms( tms1 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs1 ), |
.wp_err( wp_err1 ), |
.lmr_req( lmr_req1 ), |
.lmr_ack( lmr_ack1 ), |
.init_req( init_req1 ), |
.init_ack( init_ack1 ) |
); |
`else |
mc_cs_rf_dummy #(3'h1) u1( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc1 ), |
.tms( tms1 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs1 ), |
.wp_err( wp_err1 ), |
.lmr_req( lmr_req1 ), |
.lmr_ack( lmr_ack1 ), |
.init_req( init_req1 ), |
.init_ack( init_ack1 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS2 |
mc_cs_rf #(3'h2) u2( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc2 ), |
.tms( tms2 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs2 ), |
.wp_err( wp_err2 ), |
.lmr_req( lmr_req2 ), |
.lmr_ack( lmr_ack2 ), |
.init_req( init_req2 ), |
.init_ack( init_ack2 ) |
); |
`else |
mc_cs_rf_dummy #(3'h2) u2( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc2 ), |
.tms( tms2 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs2 ), |
.wp_err( wp_err2 ), |
.lmr_req( lmr_req2 ), |
.lmr_ack( lmr_ack2 ), |
.init_req( init_req2 ), |
.init_ack( init_ack2 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS3 |
mc_cs_rf #(3'h3) u3( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc3 ), |
.tms( tms3 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs3 ), |
.wp_err( wp_err3 ), |
.lmr_req( lmr_req3 ), |
.lmr_ack( lmr_ack3 ), |
.init_req( init_req3 ), |
.init_ack( init_ack3 ) |
); |
`else |
mc_cs_rf_dummy #(3'h3) u3( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc3 ), |
.tms( tms3 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs3 ), |
.wp_err( wp_err3 ), |
.lmr_req( lmr_req3 ), |
.lmr_ack( lmr_ack3 ), |
.init_req( init_req3 ), |
.init_ack( init_ack3 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS4 |
mc_cs_rf #(3'h4) u4( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc4 ), |
.tms( tms4 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs4 ), |
.wp_err( wp_err4 ), |
.lmr_req( lmr_req4 ), |
.lmr_ack( lmr_ack4 ), |
.init_req( init_req4 ), |
.init_ack( init_ack4 ) |
); |
`else |
mc_cs_rf_dummy #(3'h4) u4( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc4 ), |
.tms( tms4 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs4 ), |
.wp_err( wp_err4 ), |
.lmr_req( lmr_req4 ), |
.lmr_ack( lmr_ack4 ), |
.init_req( init_req4 ), |
.init_ack( init_ack4 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS5 |
mc_cs_rf #(3'h5) u5( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc5 ), |
.tms( tms5 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs5 ), |
.wp_err( wp_err5 ), |
.lmr_req( lmr_req5 ), |
.lmr_ack( lmr_ack5 ), |
.init_req( init_req5 ), |
.init_ack( init_ack5 ) |
); |
`else |
mc_cs_rf_dummy #(3'h5) u5( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc5 ), |
.tms( tms5 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs5 ), |
.wp_err( wp_err5 ), |
.lmr_req( lmr_req5 ), |
.lmr_ack( lmr_ack5 ), |
.init_req( init_req5 ), |
.init_ack( init_ack5 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS6 |
mc_cs_rf #(3'h6) u6( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc6 ), |
.tms( tms6 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs6 ), |
.wp_err( wp_err6 ), |
.lmr_req( lmr_req6 ), |
.lmr_ack( lmr_ack6 ), |
.init_req( init_req6 ), |
.init_ack( init_ack6 ) |
); |
`else |
mc_cs_rf_dummy #(3'h6) u6( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc6 ), |
.tms( tms6 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs6 ), |
.wp_err( wp_err6 ), |
.lmr_req( lmr_req6 ), |
.lmr_ack( lmr_ack6 ), |
.init_req( init_req6 ), |
.init_ack( init_ack6 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS7 |
mc_cs_rf #(3'h7) u7( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc7 ), |
.tms( tms7 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs7 ), |
.wp_err( wp_err7 ), |
.lmr_req( lmr_req7 ), |
.lmr_ack( lmr_ack7 ), |
.init_req( init_req7 ), |
.init_ack( init_ack7 ) |
); |
`else |
mc_cs_rf_dummy #(3'h7) u7( |
.clk( clk ), |
.rst( rst ), |
.wb_we_i( wb_we_i ), |
.din( wb_data_i ), |
.rf_we( rf_we ), |
.addr( wb_addr_i ), |
.csc( csc7 ), |
.tms( tms7 ), |
.poc( poc ), |
.csc_mask( csc_mask ), |
.cs( cs7 ), |
.wp_err( wp_err7 ), |
.lmr_req( lmr_req7 ), |
.lmr_ack( lmr_ack7 ), |
.init_req( init_req7 ), |
.init_ack( init_ack7 ) |
); |
`endif |
|
endmodule |
|
/verilog/minsoc/mc/mc_obct.v
0,0 → 1,236
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Open Bank & Row Tracking Block //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_obct.v,v 1.4 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.4 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_obct.v,v $ |
// Revision 1.4 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.3 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.2 2001/09/24 00:38:21 rudi |
// |
// Changed Reset to be active high and async. |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.3 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.2 2001/06/03 11:37:17 rudi |
// |
// |
// 1) Fixed Chip Select Mask Register |
// - Power On Value is now all ones |
// - Comparison Logic is now correct |
// |
// 2) All resets are now asynchronous |
// |
// 3) Converted Power On Delay to an configurable item |
// |
// 4) Added reset to Chip Select Output Registers |
// |
// 5) Forcing all outputs to Hi-Z state during reset |
// |
// Revision 1.1.1.1 2001/05/13 09:39:45 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_obct(clk, rst, row_adr, bank_adr, bank_set, bank_clr, bank_clr_all, |
bank_open, any_bank_open, row_same); |
input clk, rst; |
input [12:0] row_adr; |
input [1:0] bank_adr; |
input bank_set; |
input bank_clr; |
input bank_clr_all; |
output bank_open; |
output any_bank_open; |
output row_same; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg bank0_open, bank1_open, bank2_open, bank3_open; |
reg bank_open; |
reg [12:0] b0_last_row; |
reg [12:0] b1_last_row; |
reg [12:0] b2_last_row; |
reg [12:0] b3_last_row; |
wire row0_same, row1_same, row2_same, row3_same; |
reg row_same; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Bank Open/Closed Tracking |
// |
|
always @(posedge clk or posedge rst) |
if(rst) bank0_open <= #1 1'b0; |
else |
if((bank_adr == 2'h0) & bank_set) bank0_open <= #1 1'b1; |
else |
if((bank_adr == 2'h0) & bank_clr) bank0_open <= #1 1'b0; |
else |
if(bank_clr_all) bank0_open <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) bank1_open <= #1 1'b0; |
else |
if((bank_adr == 2'h1) & bank_set) bank1_open <= #1 1'b1; |
else |
if((bank_adr == 2'h1) & bank_clr) bank1_open <= #1 1'b0; |
else |
if(bank_clr_all) bank1_open <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) bank2_open <= #1 1'b0; |
else |
if((bank_adr == 2'h2) & bank_set) bank2_open <= #1 1'b1; |
else |
if((bank_adr == 2'h2) & bank_clr) bank2_open <= #1 1'b0; |
else |
if(bank_clr_all) bank2_open <= #1 1'b0; |
|
always @(posedge clk or posedge rst) |
if(rst) bank3_open <= #1 1'b0; |
else |
if((bank_adr == 2'h3) & bank_set) bank3_open <= #1 1'b1; |
else |
if((bank_adr == 2'h3) & bank_clr) bank3_open <= #1 1'b0; |
else |
if(bank_clr_all) bank3_open <= #1 1'b0; |
|
always @(bank_adr or bank0_open or bank1_open or bank2_open or bank3_open) |
case(bank_adr) // synopsys full_case parallel_case |
2'h0: bank_open = bank0_open; |
2'h1: bank_open = bank1_open; |
2'h2: bank_open = bank2_open; |
2'h3: bank_open = bank3_open; |
endcase |
|
assign any_bank_open = bank0_open | bank1_open | bank2_open | bank3_open; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Raw Address Tracking |
// |
|
always @(posedge clk) |
if((bank_adr == 2'h0) & bank_set) b0_last_row <= #1 row_adr; |
|
always @(posedge clk) |
if((bank_adr == 2'h1) & bank_set) b1_last_row <= #1 row_adr; |
|
always @(posedge clk) |
if((bank_adr == 2'h2) & bank_set) b2_last_row <= #1 row_adr; |
|
always @(posedge clk) |
if((bank_adr == 2'h3) & bank_set) b3_last_row <= #1 row_adr; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Raw address checking |
// |
|
assign row0_same = (b0_last_row == row_adr); |
assign row1_same = (b1_last_row == row_adr); |
assign row2_same = (b2_last_row == row_adr); |
assign row3_same = (b3_last_row == row_adr); |
|
always @(bank_adr or row0_same or row1_same or row2_same or row3_same) |
case(bank_adr) // synopsys full_case parallel_case |
2'h0: row_same = row0_same; |
2'h1: row_same = row1_same; |
2'h2: row_same = row2_same; |
2'h3: row_same = row3_same; |
endcase |
|
endmodule |
|
|
// This is used for unused Chip Selects |
module mc_obct_dummy(clk, rst, row_adr, bank_adr, bank_set, bank_clr, bank_clr_all, |
bank_open, any_bank_open, row_same); |
input clk, rst; |
input [12:0] row_adr; |
input [1:0] bank_adr; |
input bank_set; |
input bank_clr; |
input bank_clr_all; |
output bank_open; |
output any_bank_open; |
output row_same; |
|
assign bank_open = 1'b0; |
assign any_bank_open = 1'b0; |
assign row_same = 1'b0; |
|
endmodule |
/verilog/minsoc/mc/mc_incn_r.v
0,0 → 1,102
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Parametarized, Pipelined Incrementer //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_incn_r.v,v 1.2 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.2 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_incn_r.v,v $ |
// Revision 1.2 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.1 2001/06/12 15:18:47 rudi |
// |
// |
// This is a pipelined primitive incrementor. |
// |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
// |
// USAGE: incN_r #(<WIDTH>) uN(clk, input, output); |
// |
module mc_incn_r(clk, inc_in, inc_out); |
|
parameter incN_width = 32; |
|
input clk; |
input [incN_width-1:0] inc_in; |
output [incN_width-1:0] inc_out; |
|
parameter incN_center = incN_width / 2; |
|
reg [incN_center:0] out_r; |
wire [31:0] tmp_zeros = 32'h0; |
wire [incN_center-1:0] inc_next; |
|
always @(posedge clk) |
out_r <= #1 inc_in[incN_center - 1:0] + {tmp_zeros[incN_center-2:0], 1'h1}; |
|
assign inc_out[incN_width-1:incN_center] = inc_in[incN_width-1:incN_center] + inc_next; |
|
assign inc_next = out_r[incN_center] ? |
{tmp_zeros[incN_center-2:0], 1'h1} : tmp_zeros[incN_center-2:0]; |
|
assign inc_out[incN_center-1:0] = out_r; |
|
endmodule |
|
/verilog/minsoc/mc/mc_rd_fifo.v
0,0 → 1,130
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Read FIFO //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_rd_fifo.v,v 1.4 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.4 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_rd_fifo.v,v $ |
// Revision 1.4 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.3 2001/12/11 02:47:19 rudi |
// |
// - Made some changes not to expect clock during reset ... |
// |
// Revision 1.2 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.1.1.1 2001/05/13 09:39:44 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_rd_fifo(clk, rst, clr, din, we, dout, re); |
|
input clk, rst, clr; |
input [35:0] din; |
input we; |
output [35:0] dout; |
input re; |
|
reg [3:0] rd_adr, wr_adr; |
reg [35:0] r0, r1, r2, r3; |
reg [35:0] dout; |
|
always @(posedge clk or posedge rst) |
if(rst) rd_adr <= #1 4'h1; |
else |
if(clr) rd_adr <= #1 4'h1; |
else |
if(re) rd_adr <= #1 {rd_adr[2:0], rd_adr[3]}; |
|
always @(posedge clk or posedge rst) |
if(rst) wr_adr <= #1 4'h1; |
else |
if(clr) wr_adr <= #1 4'h1; |
else |
if(we) wr_adr <= #1 {wr_adr[2:0], wr_adr[3]}; |
|
always @(posedge clk) |
if(we & wr_adr[0]) r0 <= #1 din; |
|
always @(posedge clk) |
if(we & wr_adr[1]) r1 <= #1 din; |
|
always @(posedge clk) |
if(we & wr_adr[2]) r2 <= #1 din; |
|
always @(posedge clk) |
if(we & wr_adr[3]) r3 <= #1 din; |
|
always @(rd_adr or r0 or r1 or r2 or r3 or re or we or din) |
case(rd_adr) // synopsys full_case parallel_case |
4'h1: dout = r0; |
4'h2: dout = r1; |
4'h4: dout = r2; |
4'h8: dout = r3; |
endcase |
|
endmodule |
/verilog/minsoc/mc/mc_adr_sel.v
0,0 → 1,290
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller Address Select Block //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_adr_sel.v,v 1.4 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.4 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_adr_sel.v,v $ |
// Revision 1.4 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.3 2001/11/29 02:16:28 rudi |
// |
// |
// - More Synthesis cleanup, mostly for speed |
// - Several bug fixes |
// - Changed code to avoid auto-precharge and |
// burst-terminate combinations (apparently illegal ?) |
// Now we will do a manual precharge ... |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.2 2001/06/12 15:19:49 rudi |
// |
// |
// Minor changes after running lint, and a small bug fix reading csr and ba_mask registers. |
// |
// Revision 1.1.1.1 2001/05/13 09:39:40 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_adr_sel(clk, csc, tms, wb_ack_o, wb_stb_i, wb_addr_i, wb_we_i, |
wb_write_go, wr_hold, cas_, |
mc_addr, row_adr, bank_adr, rfr_ack, |
cs_le, cmd_a10, row_sel, lmr_sel, next_adr, wr_cycle, |
page_size); |
|
input clk; |
input [31:0] csc; |
input [31:0] tms; |
input wb_ack_o, wb_stb_i; |
input [31:0] wb_addr_i; |
input wb_we_i; |
input wb_write_go; |
input wr_hold; |
input cas_; |
output [23:0] mc_addr; |
output [12:0] row_adr; |
output [1:0] bank_adr; |
input rfr_ack; |
input cs_le; |
input cmd_a10; |
input row_sel; |
input lmr_sel; |
input next_adr; |
input wr_cycle; |
output [10:0] page_size; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg [23:0] mc_addr_d; |
reg [23:0] acs_addr; |
wire [23:0] acs_addr_pl1; |
reg [23:0] sram_addr; |
wire [14:0] sdram_adr; |
reg [12:0] row_adr; |
reg [9:0] col_adr; |
reg [1:0] bank_adr; |
reg [10:0] page_size; |
|
wire [2:0] mem_type; |
wire [1:0] bus_width; |
wire [1:0] mem_size; |
wire bas; |
|
// Aliases |
assign mem_type = csc[3:1]; |
assign bus_width = csc[5:4]; |
assign mem_size = csc[7:6]; |
assign bas = csc[9]; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Misc Logic |
// |
|
always @(mem_type or wr_hold or sdram_adr or acs_addr or sram_addr or wb_addr_i) |
if(mem_type == `MC_MEM_TYPE_SDRAM) mc_addr_d = {9'h0, sdram_adr}; |
else |
if(mem_type == `MC_MEM_TYPE_ACS) mc_addr_d = acs_addr; |
else |
if((mem_type == `MC_MEM_TYPE_SRAM) & wr_hold) mc_addr_d = sram_addr; |
else mc_addr_d = wb_addr_i[25:2]; |
|
assign mc_addr = rfr_ack ? {mc_addr_d[23:11], 1'b1, mc_addr_d[9:0]} : mc_addr_d; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Async Devices Address Latch & Counter |
// |
|
mc_incn_r #(24) u0( .clk( clk ), |
.inc_in( acs_addr ), |
.inc_out( acs_addr_pl1 ) ); |
|
always @(posedge clk) |
if(wb_stb_i) sram_addr <= #1 wb_addr_i[25:2]; |
|
always @(posedge clk) |
if(cs_le | wb_we_i) |
case(bus_width) // synopsys full_case parallel_case |
`MC_BW_8: acs_addr <= #1 wb_addr_i[23:0]; |
`MC_BW_16: acs_addr <= #1 wb_addr_i[24:1]; |
`MC_BW_32: acs_addr <= #1 wb_addr_i[25:2]; |
endcase |
else |
if(next_adr) acs_addr <= #1 acs_addr_pl1; |
|
//////////////////////////////////////////////////////////////////// |
// |
// SDRAM Address Mux |
// |
|
assign sdram_adr[12:0] = (lmr_sel & !cas_) ? tms[12:0] : |
row_sel ? row_adr : |
{2'h0, cmd_a10, col_adr}; |
|
assign sdram_adr[14:13] = bank_adr; |
|
always @(posedge clk) |
if(wr_cycle ? wb_ack_o : wb_stb_i) |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: col_adr <= #1 {1'h0, wb_addr_i[10:2]}; |
{`MC_BW_8, `MC_MEM_SIZE_128}: col_adr <= #1 wb_addr_i[11:2]; |
{`MC_BW_8, `MC_MEM_SIZE_256}: col_adr <= #1 wb_addr_i[11:2]; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: col_adr <= #1 {2'h0, wb_addr_i[09:2]}; |
{`MC_BW_16, `MC_MEM_SIZE_128}: col_adr <= #1 {1'h0, wb_addr_i[10:2]}; |
{`MC_BW_16, `MC_MEM_SIZE_256}: col_adr <= #1 {1'h0, wb_addr_i[10:2]}; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: col_adr <= #1 {2'h0, wb_addr_i[09:2]}; |
{`MC_BW_32, `MC_MEM_SIZE_128}: col_adr <= #1 {2'h0, wb_addr_i[09:2]}; |
{`MC_BW_32, `MC_MEM_SIZE_256}: col_adr <= #1 {2'h0, wb_addr_i[09:2]}; |
endcase |
|
always @(posedge clk) |
if(cs_le) |
begin |
if(!bas) |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: row_adr <= #1 {1'h0, wb_addr_i[24:13]}; |
{`MC_BW_8, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[25:14]}; |
{`MC_BW_8, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[26:14]; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: row_adr <= #1 {1'h0, wb_addr_i[23:12]}; |
{`MC_BW_16, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[24:13]}; |
{`MC_BW_16, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[25:13]; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: row_adr <= #1 {2'h0, wb_addr_i[22:12]}; |
{`MC_BW_32, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[23:12]}; |
{`MC_BW_32, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[24:12]; |
endcase |
else |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: row_adr <= #1 {1'h0, wb_addr_i[22:11]}; |
{`MC_BW_8, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[23:12]}; |
{`MC_BW_8, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[24:12]; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: row_adr <= #1 {1'h0, wb_addr_i[21:10]}; |
{`MC_BW_16, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[22:11]}; |
{`MC_BW_16, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[23:11]; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: row_adr <= #1 {2'h0, wb_addr_i[20:10]}; |
{`MC_BW_32, `MC_MEM_SIZE_128}: row_adr <= #1 {1'h0, wb_addr_i[21:10]}; |
{`MC_BW_32, `MC_MEM_SIZE_256}: row_adr <= #1 wb_addr_i[22:10]; |
endcase |
end |
|
|
always @(posedge clk) |
if(cs_le) |
begin |
if(!bas) |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[12:11]; |
{`MC_BW_8, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[13:12]; |
{`MC_BW_8, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[13:12]; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[11:10]; |
{`MC_BW_16, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[12:11]; |
{`MC_BW_16, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[12:11]; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[11:10]; |
{`MC_BW_32, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[11:10]; |
{`MC_BW_32, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[11:10]; |
endcase |
else |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[24:23]; |
{`MC_BW_8, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[25:24]; |
{`MC_BW_8, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[26:25]; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[23:22]; |
{`MC_BW_16, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[24:23]; |
{`MC_BW_16, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[25:24]; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: bank_adr <= #1 wb_addr_i[22:21]; |
{`MC_BW_32, `MC_MEM_SIZE_128}: bank_adr <= #1 wb_addr_i[23:22]; |
{`MC_BW_32, `MC_MEM_SIZE_256}: bank_adr <= #1 wb_addr_i[24:23]; |
endcase |
end |
|
always @(bus_width or mem_size) |
casex({bus_width, mem_size}) // synopsys full_case parallel_case |
{`MC_BW_8, `MC_MEM_SIZE_64}: page_size = 11'd512; |
{`MC_BW_8, `MC_MEM_SIZE_128}: page_size = 11'd1024; |
{`MC_BW_8, `MC_MEM_SIZE_256}: page_size = 11'd1024; |
|
{`MC_BW_16, `MC_MEM_SIZE_64}: page_size = 11'd256; |
{`MC_BW_16, `MC_MEM_SIZE_128}: page_size = 11'd512; |
{`MC_BW_16, `MC_MEM_SIZE_256}: page_size = 11'd512; |
|
{`MC_BW_32, `MC_MEM_SIZE_64}: page_size = 11'd256; |
{`MC_BW_32, `MC_MEM_SIZE_128}: page_size = 11'd256; |
{`MC_BW_32, `MC_MEM_SIZE_256}: page_size = 11'd256; |
endcase |
|
endmodule |
|
/verilog/minsoc/mc/mc_obct_top.v
0,0 → 1,426
///////////////////////////////////////////////////////////////////// |
//// //// |
//// WISHBONE Memory Controller //// |
//// Open Bank & Row Tracking Block Top Level //// |
//// //// |
//// //// |
//// Author: Rudolf Usselmann //// |
//// rudi@asics.ws //// |
//// //// |
//// //// |
//// Downloaded from: http://www.opencores.org/cores/mem_ctrl/ //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000-2002 Rudolf Usselmann //// |
//// www.asics.ws //// |
//// rudi@asics.ws //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer.//// |
//// //// |
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
//// POSSIBILITY OF SUCH DAMAGE. //// |
//// //// |
///////////////////////////////////////////////////////////////////// |
|
// CVS Log |
// |
// $Id: mc_obct_top.v,v 1.4 2002/01/21 13:08:52 rudi Exp $ |
// |
// $Date: 2002/01/21 13:08:52 $ |
// $Revision: 1.4 $ |
// $Author: rudi $ |
// $Locker: $ |
// $State: Exp $ |
// |
// Change History: |
// $Log: mc_obct_top.v,v $ |
// Revision 1.4 2002/01/21 13:08:52 rudi |
// |
// Fixed several minor bugs, cleaned up the code further ... |
// |
// Revision 1.3 2001/12/21 05:09:29 rudi |
// |
// - Fixed combinatorial loops in synthesis |
// - Fixed byte select bug |
// |
// Revision 1.2 2001/08/10 08:16:21 rudi |
// |
// - Changed IO names to be more clear. |
// - Uniquifyed define names to be core specific. |
// - Removed "Refresh Early" configuration |
// |
// Revision 1.1 2001/07/29 07:34:41 rudi |
// |
// |
// 1) Changed Directory Structure |
// 2) Fixed several minor bugs |
// |
// Revision 1.1.1.1 2001/05/13 09:39:47 rudi |
// Created Directory Structure |
// |
// |
// |
// |
|
`include "mc_defines.v" |
|
module mc_obct_top(clk, rst, cs, row_adr, bank_adr, bank_set, bank_clr, bank_clr_all, |
bank_open, any_bank_open, row_same, rfr_ack); |
input clk, rst; |
input [7:0] cs; |
input [12:0] row_adr; |
input [1:0] bank_adr; |
input bank_set; |
input bank_clr; |
input bank_clr_all; |
output bank_open; |
output any_bank_open; |
output row_same; |
input rfr_ack; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Local Registers & Wires |
// |
|
reg bank_open; |
reg row_same; |
reg any_bank_open; |
|
wire bank_set_0; |
wire bank_clr_0; |
wire bank_clr_all_0; |
wire bank_open_0; |
wire row_same_0; |
wire any_bank_open_0; |
|
wire bank_set_1; |
wire bank_clr_1; |
wire bank_clr_all_1; |
wire bank_open_1; |
wire row_same_1; |
wire any_bank_open_1; |
|
wire bank_set_2; |
wire bank_clr_2; |
wire bank_clr_all_2; |
wire bank_open_2; |
wire row_same_2; |
wire any_bank_open_2; |
|
wire bank_set_3; |
wire bank_clr_3; |
wire bank_clr_all_3; |
wire bank_open_3; |
wire row_same_3; |
wire any_bank_open_3; |
|
wire bank_set_4; |
wire bank_clr_4; |
wire bank_clr_all_4; |
wire bank_open_4; |
wire row_same_4; |
wire any_bank_open_4; |
|
wire bank_set_5; |
wire bank_clr_5; |
wire bank_clr_all_5; |
wire bank_open_5; |
wire row_same_5; |
wire any_bank_open_5; |
|
wire bank_set_6; |
wire bank_clr_6; |
wire bank_clr_all_6; |
wire bank_open_6; |
wire row_same_6; |
wire any_bank_open_6; |
|
wire bank_set_7; |
wire bank_clr_7; |
wire bank_clr_all_7; |
wire bank_open_7; |
wire row_same_7; |
wire any_bank_open_7; |
|
//////////////////////////////////////////////////////////////////// |
// |
// Misc Logic |
// |
|
assign bank_set_0 = cs[0] & bank_set; |
assign bank_set_1 = cs[1] & bank_set; |
assign bank_set_2 = cs[2] & bank_set; |
assign bank_set_3 = cs[3] & bank_set; |
assign bank_set_4 = cs[4] & bank_set; |
assign bank_set_5 = cs[5] & bank_set; |
assign bank_set_6 = cs[6] & bank_set; |
assign bank_set_7 = cs[7] & bank_set; |
|
assign bank_clr_0 = cs[0] & bank_clr; |
assign bank_clr_1 = cs[1] & bank_clr; |
assign bank_clr_2 = cs[2] & bank_clr; |
assign bank_clr_3 = cs[3] & bank_clr; |
assign bank_clr_4 = cs[4] & bank_clr; |
assign bank_clr_5 = cs[5] & bank_clr; |
assign bank_clr_6 = cs[6] & bank_clr; |
assign bank_clr_7 = cs[7] & bank_clr; |
|
assign bank_clr_all_0 = (cs[0] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_1 = (cs[1] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_2 = (cs[2] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_3 = (cs[3] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_4 = (cs[4] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_5 = (cs[5] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_6 = (cs[6] & bank_clr_all) | rfr_ack; |
assign bank_clr_all_7 = (cs[7] & bank_clr_all) | rfr_ack; |
|
always @(posedge clk) |
bank_open <= #1 (cs[0] & bank_open_0) | (cs[1] & bank_open_1) | |
(cs[2] & bank_open_2) | (cs[3] & bank_open_3) | |
(cs[4] & bank_open_4) | (cs[5] & bank_open_5) | |
(cs[6] & bank_open_6) | (cs[7] & bank_open_7); |
|
always @(posedge clk) |
row_same <= #1 (cs[0] & row_same_0) | (cs[1] & row_same_1) | |
(cs[2] & row_same_2) | (cs[3] & row_same_3) | |
(cs[4] & row_same_4) | (cs[5] & row_same_5) | |
(cs[6] & row_same_6) | (cs[7] & row_same_7); |
|
always @(posedge clk) |
any_bank_open <= #1 (cs[0] & any_bank_open_0) | (cs[1] & any_bank_open_1) | |
(cs[2] & any_bank_open_2) | (cs[3] & any_bank_open_3) | |
(cs[4] & any_bank_open_4) | (cs[5] & any_bank_open_5) | |
(cs[6] & any_bank_open_6) | (cs[7] & any_bank_open_7); |
|
|
//////////////////////////////////////////////////////////////////// |
// |
// OBCT Modules for each Chip Select |
// |
|
mc_obct u0( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_0 ), |
.bank_clr( bank_clr_0 ), |
.bank_clr_all( bank_clr_all_0 ), |
.bank_open( bank_open_0 ), |
.any_bank_open( any_bank_open_0 ), |
.row_same( row_same_0 ) |
); |
|
`ifdef MC_HAVE_CS1 |
mc_obct u1( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_1 ), |
.bank_clr( bank_clr_1 ), |
.bank_clr_all( bank_clr_all_1 ), |
.bank_open( bank_open_1 ), |
.any_bank_open( any_bank_open_1 ), |
.row_same( row_same_1 ) |
); |
`else |
mc_obct_dummy u1( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_1 ), |
.bank_clr( bank_clr_1 ), |
.bank_clr_all( bank_clr_all_1 ), |
.bank_open( bank_open_1 ), |
.any_bank_open( any_bank_open_1 ), |
.row_same( row_same_1 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS2 |
mc_obct u2( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_2 ), |
.bank_clr( bank_clr_2 ), |
.bank_clr_all( bank_clr_all_2 ), |
.bank_open( bank_open_2 ), |
.any_bank_open( any_bank_open_2 ), |
.row_same( row_same_2 ) |
); |
`else |
mc_obct_dummy u2( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_2 ), |
.bank_clr( bank_clr_2 ), |
.bank_clr_all( bank_clr_all_2 ), |
.bank_open( bank_open_2 ), |
.any_bank_open( any_bank_open_2 ), |
.row_same( row_same_2 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS3 |
mc_obct u3( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_3 ), |
.bank_clr( bank_clr_3 ), |
.bank_clr_all( bank_clr_all_3 ), |
.bank_open( bank_open_3 ), |
.any_bank_open( any_bank_open_3 ), |
.row_same( row_same_3 ) |
); |
`else |
mc_obct_dummy u3( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_3 ), |
.bank_clr( bank_clr_3 ), |
.bank_clr_all( bank_clr_all_3 ), |
.bank_open( bank_open_3 ), |
.any_bank_open( any_bank_open_3 ), |
.row_same( row_same_3 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS4 |
mc_obct u4( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_4 ), |
.bank_clr( bank_clr_4 ), |
.bank_clr_all( bank_clr_all_4 ), |
.bank_open( bank_open_4 ), |
.any_bank_open( any_bank_open_4 ), |
.row_same( row_same_4 ) |
); |
`else |
mc_obct_dummy u4( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_4 ), |
.bank_clr( bank_clr_4 ), |
.bank_clr_all( bank_clr_all_4 ), |
.bank_open( bank_open_4 ), |
.any_bank_open( any_bank_open_4 ), |
.row_same( row_same_4 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS5 |
mc_obct u5( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_5 ), |
.bank_clr( bank_clr_5 ), |
.bank_clr_all( bank_clr_all_5 ), |
.bank_open( bank_open_5 ), |
.any_bank_open( any_bank_open_5 ), |
.row_same( row_same_5 ) |
); |
`else |
mc_obct_dummy u5( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_5 ), |
.bank_clr( bank_clr_5 ), |
.bank_clr_all( bank_clr_all_5 ), |
.bank_open( bank_open_5 ), |
.any_bank_open( any_bank_open_5 ), |
.row_same( row_same_5 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS6 |
mc_obct u6( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_6 ), |
.bank_clr( bank_clr_6 ), |
.bank_clr_all( bank_clr_all_6 ), |
.bank_open( bank_open_6 ), |
.any_bank_open( any_bank_open_6 ), |
.row_same( row_same_6 ) |
); |
`else |
mc_obct_dummy u6( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_6 ), |
.bank_clr( bank_clr_6 ), |
.bank_clr_all( bank_clr_all_6 ), |
.bank_open( bank_open_6 ), |
.any_bank_open( any_bank_open_6 ), |
.row_same( row_same_6 ) |
); |
`endif |
|
`ifdef MC_HAVE_CS7 |
mc_obct u7( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_7 ), |
.bank_clr( bank_clr_7 ), |
.bank_clr_all( bank_clr_all_7 ), |
.bank_open( bank_open_7 ), |
.any_bank_open( any_bank_open_7 ), |
.row_same( row_same_7 ) |
); |
`else |
mc_obct_dummy u7( |
.clk( clk ), |
.rst( rst ), |
.row_adr( row_adr ), |
.bank_adr( bank_adr ), |
.bank_set( bank_set_7 ), |
.bank_clr( bank_clr_7 ), |
.bank_clr_all( bank_clr_all_7 ), |
.bank_open( bank_open_7 ), |
.any_bank_open( any_bank_open_7 ), |
.row_same( row_same_7 ) |
); |
`endif |
|
endmodule |
/verilog/minsoc/minsoc_onchip_ram.v
0,0 → 1,458
////////////////////////////////////////////////////////////////////// |
//// //// |
//// Generic Single-Port Synchronous RAM //// |
//// //// |
//// This file is part of memory library available from //// |
//// http://www.opencores.org/cvsweb.shtml/minsoc/ //// |
//// //// |
//// Description //// |
//// This block is a wrapper with common single-port //// |
//// synchronous memory interface for different //// |
//// types of ASIC and FPGA RAMs. Beside universal memory //// |
//// interface it also provides behavioral model of generic //// |
//// single-port synchronous RAM. //// |
//// It should be used in all OPENCORES designs that want to be //// |
//// portable accross different target technologies and //// |
//// independent of target memory. //// |
//// //// |
//// Supported ASIC RAMs are: //// |
//// - Artisan Single-Port Sync RAM //// |
//// - Avant! Two-Port Sync RAM (*) //// |
//// - Virage Single-Port Sync RAM //// |
//// - Virtual Silicon Single-Port Sync RAM //// |
//// //// |
//// Supported FPGA RAMs are: //// |
//// - Xilinx Virtex RAMB16 //// |
//// - Xilinx Virtex RAMB4 //// |
//// - Altera LPM //// |
//// //// |
//// To Do: //// |
//// - fix avant! two-port ram //// |
//// - add additional RAMs //// |
//// //// |
//// Author(s): //// |
//// - Raul Fajardo, rfajardo@gmail.com //// |
//// - Damjan Lampret, lampret@opencores.org //// |
//// //// |
////////////////////////////////////////////////////////////////////// |
//// //// |
//// Copyright (C) 2000 Authors and OPENCORES.ORG //// |
//// //// |
//// This source file may be used and distributed without //// |
//// restriction provided that this copyright statement is not //// |
//// removed from the file and that any derivative work contains //// |
//// the original copyright notice and the associated disclaimer. //// |
//// //// |
//// This source file is free software; you can redistribute it //// |
//// and/or modify it under the terms of the GNU Lesser General //// |
//// Public License as published by the Free Software Foundation; //// |
//// either version 2.1 of the License, or (at your option) any //// |
//// later version. //// |
//// //// |
//// This source is distributed in the hope that it will be //// |
//// useful, but WITHOUT ANY WARRANTY; without even the implied //// |
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// |
//// PURPOSE. See the GNU Lesser General Public License for more //// |
//// details. //// |
//// //// |
//// You should have received a copy of the GNU Lesser General //// |
//// Public License along with this source; if not, download it //// |
//// from http://www.gnu.org/licenses/lgpl.html //// |
//// //// |
////////////////////////////////////////////////////////////////////// |
// |
// Revision History |
// |
// |
// Revision 2.1 2009/08/23 16:41:00 fajardo |
// Sensitivity of addr_reg and memory write changed back to posedge clk for GENERIC_MEMORY |
// This actually models appropriately the behavior of the FPGA internal RAMs |
// |
// Revision 2.0 2009/09/10 11:30:00 fajardo |
// Added tri-state buffering for altera output |
// Sensitivity of addr_reg and memory write changed to negedge clk for GENERIC_MEMORY |
// |
// Revision 1.9 2009/08/18 15:15:00 fajardo |
// Added tri-state buffering for xilinx and generic memory output |
// |
// $Log: not supported by cvs2svn $ |
// Revision 1.8 2004/06/08 18:15:32 lampret |
// Changed behavior of the simulation generic models |
// |
// Revision 1.7 2004/04/05 08:29:57 lampret |
// Merged branch_qmem into main tree. |
// |
// Revision 1.3.4.1 2003/12/09 11:46:48 simons |
// Mbist nameing changed, Artisan ram instance signal names fixed, some synthesis waning fixed. |
// |
// Revision 1.3 2003/04/07 01:19:07 lampret |
// Added Altera LPM RAMs. Changed generic RAM output when OE inactive. |
// |
// Revision 1.2 2002/10/17 20:04:40 lampret |
// Added BIST scan. Special VS RAMs need to be used to implement BIST. |
// |
// Revision 1.1 2002/01/03 08:16:15 lampret |
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs. |
// |
// Revision 1.8 2001/11/02 18:57:14 lampret |
// Modified virtual silicon instantiations. |
// |
// Revision 1.7 2001/10/21 17:57:16 lampret |
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF. |
// |
// Revision 1.6 2001/10/14 13:12:09 lampret |
// MP3 version. |
// |
// Revision 1.1.1.1 2001/10/06 10:18:36 igorm |
// no message |
// |
// Revision 1.1 2001/08/09 13:39:33 lampret |
// Major clean-up. |
// |
// Revision 1.2 2001/07/30 05:38:02 lampret |
// Adding empty directories required by HDL coding guidelines |
// |
// |
|
// synopsys translate_off |
`include "timescale.v" |
// synopsys translate_on |
`include "minsoc_defines.v" |
|
module minsoc_onchip_ram( |
`ifdef BIST |
// RAM BIST |
mbist_si_i, mbist_so_o, mbist_ctrl_i, |
`endif |
// Generic synchronous single-port RAM interface |
clk, rst, ce, we, oe, addr, di, doq |
); |
|
// |
// Default address and data buses width |
// |
parameter aw = 11; |
parameter dw = 8; |
|
`ifdef BIST |
// |
// RAM BIST |
// |
input mbist_si_i; |
input [`MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i; |
output mbist_so_o; |
`endif |
|
// |
// Generic synchronous single-port RAM interface |
// |
input clk; // Clock |
input rst; // Reset |
input ce; // Chip enable input |
input we; // Write enable input |
input oe; // Output enable input |
input [aw-1:0] addr; // address bus inputs |
input [dw-1:0] di; // input data bus |
output [dw-1:0] doq; // output data bus |
|
// |
// Decide memory implementation for Xilinx FPGAs |
// |
`ifdef SPARTAN2 |
`define MINSOC_XILINX_RAMB4 |
`elsif VIRTEX |
`define MINSOC_XILINX_RAMB4 |
`endif // !SPARTAN2/VIRTEX |
|
`ifdef SPARTAN3 |
`define MINSOC_XILINX_RAMB16 |
`elsif SPARTAN3E |
`define MINSOC_XILINX_RAMB16 |
`elsif SPARTAN3A |
`define MINSOC_XILINX_RAMB16 |
`elsif VIRTEX2 |
`define MINSOC_XILINX_RAMB16 |
`elsif VIRTEX4 |
`define MINSOC_XILINX_RAMB16 |
`elsif VIRTEX5 |
`define MINSOC_XILINX_RAMB16 |
`endif // !SPARTAN3/SPARTAN3E/SPARTAN3A/VIRTEX2/VIRTEX4/VIRTEX5 |
|
|
// |
// Internal wires and registers |
// |
|
`ifdef ARTISAN_SSP |
`else |
`ifdef VIRTUALSILICON_SSP |
`else |
`ifdef BIST |
assign mbist_so_o = mbist_si_i; |
`endif |
`endif |
`endif |
|
|
`ifdef GENERIC_MEMORY |
// |
// Generic single-port synchronous RAM model |
// |
|
// |
// Generic RAM's registers and wires |
// |
reg [dw-1:0] mem [(1<<aw)-1:0]; // RAM content |
reg [aw-1:0] addr_reg; // RAM address register |
|
// |
// Data output drivers |
// |
assign doq = (oe) ? mem[addr_reg] : {dw{1'bZ}}; |
|
// |
// RAM address register |
// |
always @(posedge clk or posedge rst) |
if (rst) |
addr_reg <= #1 {aw{1'b0}}; |
else if (ce) |
addr_reg <= #1 addr; |
|
// |
// RAM write |
// |
always @(posedge clk) |
if (ce && we) |
mem[addr] <= #1 di; |
|
|
`elsif ARTISAN_SSP |
// |
// Instantiation of ASIC memory: |
// |
// Artisan Synchronous Single-Port RAM (ra1sh) |
// |
`ifdef UNUSED |
art_hssp_2048x8 #(dw, 1<<aw, aw) artisan_ssp( |
`else |
`ifdef BIST |
art_hssp_2048x8_bist artisan_ssp( |
`else |
art_hssp_2048x8 artisan_ssp( |
`endif |
`endif |
`ifdef BIST |
// RAM BIST |
.mbist_si_i(mbist_si_i), |
.mbist_so_o(mbist_so_o), |
.mbist_ctrl_i(mbist_ctrl_i), |
`endif |
.CLK(clk), |
.CEN(~ce), |
.WEN(~we), |
.A(addr), |
.D(di), |
.OEN(~oe), |
.Q(doq) |
); |
|
|
`elsif AVANT_ATP |
// |
// Instantiation of ASIC memory: |
// |
// Avant! Asynchronous Two-Port RAM |
// |
avant_atp avant_atp( |
.web(~we), |
.reb(), |
.oeb(~oe), |
.rcsb(), |
.wcsb(), |
.ra(addr), |
.wa(addr), |
.di(di), |
.doq(doq) |
); |
|
|
`elsif VIRAGE_SSP |
// |
// Instantiation of ASIC memory: |
// |
// Virage Synchronous 1-port R/W RAM |
// |
virage_ssp virage_ssp( |
.clk(clk), |
.adr(addr), |
.d(di), |
.we(we), |
.oe(oe), |
.me(ce), |
.q(doq) |
); |
|
|
`elsif VIRTUALSILICON_SSP |
// |
// Instantiation of ASIC memory: |
// |
// Virtual Silicon Single-Port Synchronous SRAM |
// |
`ifdef UNUSED |
vs_hdsp_2048x8 #(1<<aw, aw-1, dw-1) vs_ssp( |
`else |
`ifdef BIST |
vs_hdsp_2048x8_bist vs_ssp( |
`else |
vs_hdsp_2048x8 vs_ssp( |
`endif |
`endif |
`ifdef BIST |
// RAM BIST |
.mbist_si_i(mbist_si_i), |
.mbist_so_o(mbist_so_o), |
.mbist_ctrl_i(mbist_ctrl_i), |
`endif |
.CK(clk), |
.ADR(addr), |
.DI(di), |
.WEN(~we), |
.CEN(~ce), |
.OEN(~oe), |
.DOUT(doq) |
); |
|
|
`elsif MINSOC_XILINX_RAMB4 |
// |
// Instantiation of FPGA memory: |
// |
// SPARTAN2/VIRTEX |
// |
|
wire [dw-1:0] doq_internal; // output data bus |
|
// |
// Block 0 |
// |
RAMB4_S2 ramb4_s2_0( |
.CLK(clk), |
.RST(rst), |
.ADDR(addr), |
.DI(di[1:0]), |
.EN(ce), |
.WE(we), |
.DO(doq_internal[1:0]) |
); |
|
// |
// Block 1 |
// |
RAMB4_S2 ramb4_s2_1( |
.CLK(clk), |
.RST(rst), |
.ADDR(addr), |
.DI(di[3:2]), |
.EN(ce), |
.WE(we), |
.DO(doq_internal[3:2]) |
); |
|
// |
// Block 2 |
// |
RAMB4_S2 ramb4_s2_2( |
.CLK(clk), |
.RST(rst), |
.ADDR(addr), |
.DI(di[5:4]), |
.EN(ce), |
.WE(we), |
.DO(doq_internal[5:4]) |
); |
|
// |
// Block 3 |
// |
RAMB4_S2 ramb4_s2_3( |
.CLK(clk), |
.RST(rst), |
.ADDR(addr), |
.DI(di[7:6]), |
.EN(ce), |
.WE(we), |
.DO(doq_internal[7:6]) |
); |
|
assign doq = (oe) ? (doq_internal) : { dw{1'bZ} }; |
|
|
`elsif MINSOC_XILINX_RAMB16 |
// |
// Instantiation of FPGA memory: |
// |
// SPARTAN3/SPARTAN3E/VIRTEX2 |
// SPARTAN3A/VIRTEX4/VIRTEX5 are automatically reallocated by ISE |
// |
// Added By Nir Mor |
// |
|
wire [dw-1:0] doq_internal; // output data bus |
|
RAMB16_S9 ramb16_s9( |
.CLK(clk), |
.SSR(rst), |
.ADDR(addr), |
.DI(di), |
.DIP(1'b0), |
.EN(ce), |
.WE(we), |
.DO(doq_internal), |
.DOP() |
); |
|
assign doq = (oe) ? (doq_internal) : { dw{1'bZ} }; |
|
|
`elsif ALTERA_FPGA |
// |
// Instantiation of FPGA memory: |
// |
// Altera LPM |
// |
// Added By Jamil Khatib |
// |
|
wire wr; |
|
assign wr = ce & we; |
|
wire [dw-1:0] doq_internal; // output data bus |
|
initial $display("Using Altera LPM."); |
|
lpm_ram_dq lpm_ram_dq_component ( |
.address(addr), |
.inclock(clk), |
.data(di), |
.we(wr), |
.q(doq_internal) |
); |
|
assign doq = (oe) ? (doq_internal) : { dw{1'bZ} }; |
|
defparam lpm_ram_dq_component.lpm_width = dw, |
lpm_ram_dq_component.lpm_widthad = aw, |
lpm_ram_dq_component.lpm_indata = "REGISTERED", |
lpm_ram_dq_component.lpm_address_control = "REGISTERED", |
lpm_ram_dq_component.lpm_outdata = "UNREGISTERED", |
lpm_ram_dq_component.lpm_hint = "USE_EAB=ON"; |
// examplar attribute lpm_ram_dq_component NOOPT TRUE |
|
|
`endif // !ALTERA_FPGA/MINCON_XILINX_RAMB16/MINCON_XILINX_RAMB4/VIRTUALSILICON_SSP/VIRAGE_SSP/AVANT_ATP/ARTISAN_SSP/GENERIC_MEMORY |
|
|
endmodule |
/vhdl/WISHBONE_IIR/.vhd
0,0 → 1,26
--Second Order Sections (SOS) automatically generated VHDL package file |
--M.Eng. Alexander López Parrado |
|
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
|
package coefs_sos is |
|
|
--The number of sections |
constant NSECT:integer:=6; |
|
--Number of bits in fractional part of coeffcients |
--Fixed point format with 16 bits ([3].[13]) |
constant Q: integer:=13; |
|
--Gain on each stage |
constant GAIN: std_logic_vector(15 downto 0):= std_logic_vector(to_signed(169,16)); |
|
--Filter Coefficients ...(b0,b1,b2,a0,a1,a2)_stage1,(b0,b1,b2,a0,a1,a2)_stage0 |
constant COEFFS: std_logic_vector(575 downto 0):="001000000000000011000000000000000010000000000000001000000000000011000011110101000001111110110000001000000000000011000000000111010001111111100011001000000000000011000100110001100001111110011101001000000000000010111111111000110010000000011101001000000000000011000100011001010001111100101000001000000000000000111111111011100001111111101110001000000000000011000101000110010001111100011001001000000000000001000000000000000010000000000000001000000000000011000101010011000001111010111110001000000000000001000000000100100010000000010010001000000000000011000101001000010001111010011100"; |
|
end coefs_sos; |
/vhdl/WISHBONE_IIR/SOS.vhd
0,0 → 1,168
library ieee; |
--library work; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
--Structure SOS |
entity SOS is |
generic (WordWidth:integer;--width signal of in/out |
Bit_growth:integer; |
NSECT:integer;--Cant of sections |
M:integer;--width word of coefs |
Q:integer--Q--Quantifer |
|
); |
|
port( |
|
signal_input :in std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
h0: in std_logic_vector((NSECT*M*6)-1 downto 0); |
gain: in std_logic_vector(M-1 downto 0); |
signal_output:out std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
en_out : in std_logic_vector(3 downto 0); |
enable_out:out std_logic; |
clk,reset,clear,enable:in std_logic |
|
); |
end entity; |
|
architecture RTL of SOS is |
--Filter Tworder component |
component Tworder is |
generic (WordWidth:integer;--:=16;--width signal of in/out |
Bit_growth:integer; |
M:integer;--:=16;--width word of coefs |
Q:integer--:=15--Quantifer |
); |
|
port( |
|
signal_input :in std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
a0,a1,a2,b0,b1,b2: in std_logic_vector(M-1 downto 0); |
signal_output:out std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
clk,reset,clear,enable:in std_logic |
|
); |
end component; |
|
--The fullregister component |
component fullregister is |
|
generic |
( |
N: integer |
); |
|
port |
( |
clk : in std_logic; |
reset_n : in std_logic; |
enable : in std_logic; |
clear : in std_logic; |
d : in std_logic_vector(N-1 downto 0); |
q : out std_logic_vector(N-1 downto 0) |
|
); |
end component; |
-- |
type output_aux is array(NSECT downto 0) of std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
signal output,out_reg: output_aux; |
|
type gain_out_t is array(NSECT downto 0) of std_logic_vector(M+WordWidth+Bit_growth-1 downto 0); |
|
signal gain_out: gain_out_t; |
|
|
constant Nh: integer :=(NSECT*M*6); |
|
signal filter_coef:std_logic_vector(Nh-1 downto 0); |
signal signal_output_aux:std_logic_vector(WordWidth+Bit_growth-1 downto 0); |
--type aux_enable is array (0 to NSECT) of std_logic_vector(0 downto 0); |
type aux_enable is array (0 to 2*NSECT) of std_logic_vector(0 downto 0); |
signal enable_aux:aux_enable; |
begin |
|
filter_coef<=h0; |
myfilter: |
for k in NSECT-1 downto 0 generate |
|
filter:Tworder |
generic map( |
WordWidth=>WordWidth, |
Bit_growth=>Bit_growth, |
M=>M, |
Q=>Q |
) |
|
port map( |
signal_input => out_reg(k), |
a2=>filter_coef((1*(M)+(k*(M)*6))-1 downto (k*(M)*6)), |
a1=>filter_coef((2*(M)+(k*(M)*6))-1 downto (1*(M)+(k*(M)*6))), |
a0=>filter_coef((3*(M)+(k*(M)*6))-1 downto (2*(M)+(k*(M)*6))), |
b2=>filter_coef((4*(M)+(k*(M)*6))-1 downto (3*(M)+(k*(M)*6))), |
b1=>filter_coef((5*(M)+(k*(M)*6))-1 downto (4*(M)+(k*(M)*6))), |
b0=>filter_coef((6*(M)+(k*(M)*6))-1 downto (5*(M)+(k*(M)*6))), |
signal_output => output(k), |
clk=>clk, |
reset=>reset, |
clear=>clear, |
enable=>enable_aux(k*2)(0) |
); |
|
gain_out(k)<=std_logic_vector(signed(gain)*signed(output(k))); |
|
Reg_seg:fullregister |
generic map( |
N=>WordWidth+Bit_growth |
) |
port map ( |
clk=>clk, |
reset_n=>reset, |
enable=>'1', |
clear=>clear, |
d=>gain_out(k)(WordWidth+Bit_growth-1+Q downto Q), |
q=>out_reg(k+1) |
); |
|
|
end generate; |
|
myenables: |
for k in 0 to 2*NSECT-1 generate |
|
|
Reg_enables:fullregister |
generic map( |
N=>1 |
) |
port map ( |
clk=>clk, |
reset_n=>reset, |
enable=>'1', |
clear=>clear, |
d=>enable_aux(k), |
q=>enable_aux(k+1) |
); |
|
end generate; |
|
out_reg(0)<=signal_input; |
enable_aux(0)(0)<=enable; |
enable_out<=enable_aux(to_integer((2*(unsigned(en_out))+2)))(0); |
|
|
|
signal_output_aux <= gain_out(to_integer(unsigned(en_out)))(WordWidth+Bit_growth-1+Q downto Q); |
|
Reg_out:fullregister |
generic map( |
N=>WordWidth+Bit_growth |
) |
port map ( |
clk=>clk, |
reset_n=>reset, |
enable=>'1', |
clear=>clear, |
d=>signal_output_aux, |
q=>signal_output |
); |
end architecture; |
vhdl/WISHBONE_IIR/SOS.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_IIR/Tworder.vhd
===================================================================
--- vhdl/WISHBONE_IIR/Tworder.vhd (nonexistent)
+++ vhdl/WISHBONE_IIR/Tworder.vhd (revision 5)
@@ -0,0 +1,108 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity Tworder is
+generic (WordWidth:integer;--:=16;--width signal of in/out
+ Bit_growth:integer;--:=8;
+ M:integer;--:=16;--width word of coefs
+ Q:integer--:=15--Quantifer
+ );
+
+port(
+
+signal_input :in std_logic_vector(WordWidth+Bit_growth-1 downto 0);
+a0,a1,a2,b0,b1,b2: in std_logic_vector(M-1 downto 0);
+signal_output:out std_logic_vector(WordWidth+Bit_growth-1 downto 0);
+clk,reset,clear,enable:in std_logic
+
+);
+end entity;
+
+architecture RTL of Tworder is
+--The fullregister component
+component fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+end component;
+
+signal signal_output_aux,signal_input_aux: std_logic_vector(M+Bit_growth+WordWidth-1 downto 0);
+signal sum_in,sum_out_aux,sum_out: std_logic_vector((M+WordWidth+Bit_growth)-1 downto 0);
+signal RegOut1,RegOut2,RegOut1_aux: std_logic_vector(WordWidth+Bit_growth-1 downto 0);
+signal signal1_in,signal2_in,signal3_in,signal1_out,signal2_out,signal3_out : std_logic_vector(M+WordWidth+Bit_growth-1 downto 0);
+
+begin
+
+--EXTENSION DE SIGNO
+signal_input_aux(WordWidth+Bit_growth+Q-1 downto Q)<=signal_input;
+signal_input_aux(Q-1 downto 0)<=(others=>'0');
+signal_input_aux(M+WordWidth+Bit_growth-1 downto WordWidth+Bit_growth+Q)<=(others=>signal_input(WordWidth+Bit_growth-1));
+
+
+
+signal1_in<=std_logic_vector(signed(RegOut1)*signed(a1));
+signal2_in<=std_logic_vector(signed(RegOut2)*signed(a2));
+signal3_in<=signal_input_aux;
+signal1_out<=std_logic_vector(signed(RegOut1)*signed(b1));
+signal2_out<=std_logic_vector(signed(RegOut2)*signed(b2));
+--signal3_out<=std_logic_vector(signed(sum_in_aux((WordWidth+Bit_growth-1)+Q downto Q))*signed(b0));
+signal3_out<=std_logic_vector(signed(sum_in((WordWidth+Bit_growth-1)+Q downto Q))*signed(b0));
+
+sum_in<=std_logic_vector(-(signed(signal1_in)) - (signed( signal2_in)) + signed(signal3_in));
+sum_out<=std_logic_vector(signed(signal1_out)+ signed( signal2_out) + signed(signal3_out));
+REG1:fullregister
+generic map(
+ N=>WordWidth+Bit_growth
+)
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enable,
+ clear=>clear,
+ d=>sum_in(WordWidth+Bit_growth+Q-1 downto Q),
+ q=>RegOut1
+ );
+REG2:fullregister
+generic map(
+ N=>WordWidth+Bit_growth
+)
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enable,
+ clear=>clear,
+ d=>RegOut1,
+ q=>RegOut2
+ );
+
+Reg_seg:fullregister
+generic map(
+ N=>M+WordWidth+Bit_growth
+)
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>'1',
+ clear=>clear,
+ d=>sum_out,
+ q=>sum_out_aux
+ );
+
+
+signal_output<=sum_out_aux((WordWidth+Bit_growth-1)+Q downto Q);-----OJO
+
+end architecture;
\ No newline at end of file
vhdl/WISHBONE_IIR/Tworder.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_IIR/fullregister.vhd
===================================================================
--- vhdl/WISHBONE_IIR/fullregister.vhd (nonexistent)
+++ vhdl/WISHBONE_IIR/fullregister.vhd (revision 5)
@@ -0,0 +1,54 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+
+end entity;
+
+architecture rtl of fullregister is
+begin
+
+ process (clk,reset_n,d,clear,enable)
+
+ begin
+ if reset_n = '0' then
+ q <= (others=>'0');
+ elsif (rising_edge(clk)) then
+
+ if enable = '1' then
+ if clear='1' then
+
+ q <= (others=>'0');
+
+ else
+
+ q<=d;
+
+ end if;
+
+
+ end if;
+
+ end if;
+
+
+ end process;
+
+end rtl;
\ No newline at end of file
vhdl/WISHBONE_IIR/fullregister.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_IIR/.vhd.bak
===================================================================
--- vhdl/WISHBONE_IIR/.vhd.bak (nonexistent)
+++ vhdl/WISHBONE_IIR/.vhd.bak (revision 5)
@@ -0,0 +1,17 @@
+library ieee;
+use ieee.math_real.all;
+
+package coeff_pkg is
+ constant Nb : integer := 16;
+ constant Q : integer := 14;
+
+ type coeff is array (Nb-1 downto 0) of integer range -(2**(Nb-1)) to (2**(Nb-1)-1);
+ constant h0 : coeff := (
+ 1579,
+ -3067,
+ 1579,
+ 16384,
+ -31076,
+ 14784
+ );
+end coeff_pkg;
Index: vhdl/WISHBONE_IIR/WB_SOS.vhd
===================================================================
--- vhdl/WISHBONE_IIR/WB_SOS.vhd (nonexistent)
+++ vhdl/WISHBONE_IIR/WB_SOS.vhd (revision 5)
@@ -0,0 +1,171 @@
+library ieee;
+--library work;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity WB_SOS is
+generic (Filter_Width:integer:=16;--Filter width signals of in/out
+ WB_Width:integer:=32;--WishBone width signal of in/out
+ Bit_Growth:integer:=8;
+ NSECT:integer:=6;--Cant of sections
+ M:integer:=16;--width word of coefs
+ Q:integer:=13;--Q--Quantifer
+ Adress_wordwidth:integer:=32 ;
+ Adr_bas:integer:=9;
+ Reg_control:integer:=0;
+ Reg_data:integer:=4;
+ Reg_status:integer:=8;
+ Reg_Nsec:integer:=12;
+ Reg_gain: integer:=16;
+ Reg_coef:integer:=20
+
+ --Reg_coef:integer:=20
+ --N_coef:integer:=42
+
+ );
+
+port(
+
+DAT_I: in std_logic_vector(WB_Width-1 downto 0);
+DAT_O:out std_logic_vector(WB_Width-1 downto 0);
+ADR_I :in std_logic_vector(Adress_wordwidth-1 downto 0);
+STB_I,RST_I,CLK_I,WE_I: in std_logic;
+ACK_O: out std_logic;
+clear:in std_logic
+);
+end entity;
+
+architecture RTL of WB_SOS is
+--Structure SOS
+component SOS is
+generic (WordWidth:integer;--width signal of in/out
+ Bit_growth:integer;
+ NSECT:integer;--Cant of sections
+ M:integer;--width word of coefs
+ Q:integer--Q--Quantifer
+
+ );
+
+port(
+
+signal_input :in std_logic_vector(WordWidth+Bit_growth-1 downto 0);
+h0: in std_logic_vector((NSECT*M*6)-1 downto 0);
+gain: in std_logic_vector(M-1 downto 0);
+signal_output:out std_logic_vector(WordWidth+Bit_growth-1 downto 0);
+en_out : in std_logic_vector(3 downto 0);
+enable_out:out std_logic;
+clk,reset,clear,enable:in std_logic
+
+); end component;
+
+--
+component interface_slave_iir is
+generic(
+
+Data_wordwidth: integer;
+Adress_wordwidth: integer;
+Adr_bas:integer;
+Reg_control:integer;
+Reg_data:integer;
+Reg_status:integer;
+Reg_coef:integer;
+Reg_gain:integer;
+Reg_Nsec:integer;
+NSECT:integer;
+--Offset_coef:integer;
+M:integer
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( Adress_wordwidth-1 downto 0 );
+ DAT_I: in std_logic_vector( Data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( Data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( Data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( Data_wordwidth-1 downto 0 );--to SLAVE
+ en_out: out std_logic_vector( 3 downto 0 );--to slave
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ Start: out std_logic;--to SLAVE
+ h0: out std_logic_vector( (NSECT*M*6)-1 downto 0 );--to SLAVE
+ gain: out std_logic_vector(M-1 downto 0);
+ enable_in: in std_logic;
+ clear,reset,clk: in std_logic
+ );
+end component;
+signal h0_aux:std_logic_vector((NSECT*M*6)-1 downto 0);
+signal gain_aux:std_logic_vector(M-1 downto 0);
+signal iir_data_in, iir_data_out:std_logic_vector(Filter_Width+Bit_Growth-1 downto 0);
+signal en_out_aux:std_logic_vector(3 downto 0);
+signal Start_aux, WE_O_aux,enable_aux:std_logic;
+signal sext:std_logic_vector(bit_growth-1 downto 0);
+begin
+sext<=(others=>iir_data_out(Filter_Width-1));
+
+sos_1:SOS
+generic map(WordWidth=>Filter_Width,--width signal of in/out
+ Bit_growth=>Bit_Growth,
+ NSECT=>NSECT,--Cant of sections
+ M=>M,--width word of coefs
+ Q=>Q--Quantifer
+
+ )
+
+port map(
+
+signal_input=>iir_data_in((Filter_Width+Bit_Growth)-1 downto 0),
+--signal_input((WordWidth-(8*2))-1 downto 0)<=(others=>'0'),
+h0=>h0_aux,
+gain=>gain_aux,
+signal_output=>iir_data_out,
+en_out=>en_out_aux,
+enable_out=>enable_aux,
+clk=>CLK_I,
+reset=>RST_I,
+clear=>clear,
+enable=>start_aux
+
+);
+
+inteface:interface_slave_iir
+generic map(
+
+Data_wordwidth=>WB_Width,
+Adress_wordwidth=>Adress_wordwidth,
+Adr_bas=>Adr_bas,
+Reg_control=>Reg_control,
+Reg_data=>Reg_data,
+Reg_status=>Reg_status,
+Reg_coef=>Reg_coef,
+Reg_gain=>Reg_gain,
+Reg_Nsec=>Reg_Nsec,
+NSECT=>NSECT,
+--Offset_coef=>Offset_coef,
+M=>M
+
+)
+port map(
+
+
+ ACK_O=>ACK_O,
+ ADR_I=>ADR_I,
+ DAT_I=>DAT_I,
+ sDAT_I=>sext&iir_data_out,
+ DAT_O=>DAT_O,
+ sDAT_O((Filter_Width+Bit_Growth)-1 downto 0)=>iir_data_in,
+ en_out=>en_out_aux,
+ enable_in=>enable_aux,
+ STB_I=>STB_I,
+ WE_I=>WE_I,
+ Start=>Start_aux,
+ h0=>h0_aux,
+ gain=>gain_aux,
+ clear=>clear,
+ reset=>RST_I,
+ clk=>CLK_I
+ );
+
+
+end architecture;
\ No newline at end of file
vhdl/WISHBONE_IIR/WB_SOS.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_IIR/interface_slave_iir.vhd
===================================================================
--- vhdl/WISHBONE_IIR/interface_slave_iir.vhd (nonexistent)
+++ vhdl/WISHBONE_IIR/interface_slave_iir.vhd (revision 5)
@@ -0,0 +1,231 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity interface_slave_iir is
+generic(
+
+Data_wordwidth: integer;
+Adress_wordwidth: integer;
+Adr_bas:integer;
+Reg_control:integer;
+Reg_data:integer;
+Reg_status:integer;
+Reg_coef:integer;
+Reg_gain:integer;
+Reg_Nsec:integer;
+NSECT:integer;
+M:integer
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( Adress_wordwidth-1 downto 0 );
+ DAT_I: in std_logic_vector( Data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( Data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( Data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( Data_wordwidth-1 downto 0 );--to SLAVE
+ en_out: out std_logic_vector( 3 downto 0 );--to slave
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ Start: out std_logic;--to SLAVE
+ h0: out std_logic_vector( (NSECT*M*6)-1 downto 0 );--to SLAVE
+ gain: out std_logic_vector(M-1 downto 0);
+ enable_in: in std_logic;
+ clear,reset,clk: in std_logic
+ );
+end entity;
+
+architecture RTL of interface_slave_iir is
+
+--The fullregister component
+component fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+end component;
+
+signal OUT_AUX, ZERO,ssDAT_O,RegsDAT_O: std_logic_vector( Data_wordwidth-1 downto 0 );
+signal rSTATUS_O,enable_in_aux:std_logic_vector( 0 downto 0 );
+signal Clear_Status:std_logic;
+signal enable_gain:std_logic;
+signal EN_ZERO: std_logic_vector(3 downto 0);
+
+type array_aux is array(6*NSECT downto 0) of std_logic_vector(M-1 downto 0);
+signal h0_aux:array_aux;
+
+signal gains: std_logic_vector(M-1 downto 0);
+
+type array_aux1 is array(6*NSECT downto 0) of std_logic;
+signal enables:array_aux1;
+
+begin
+ ZERO<=std_logic_vector(to_unsigned(0,Data_wordwidth));
+
+ EN_ZERO<=std_logic_vector(to_unsigned(0,4));
+ OUT_AUX<=DAT_I;
+ ACK_O<=STB_I;
+ enable_in_aux(0)<=enable_in;
+ --DAT_O<=sDAT_I;
+ coefficients:
+ for k in 6*NSECT-1 downto 0 generate
+
+ enables(k)<='1' when ( WE_I='1' and STB_I='1' and ADR_I(7 downto 0)=std_logic_vector(to_unsigned((4*k)+Reg_coef,8))) else
+ '0';
+
+ coefs:fullregister
+ generic map(
+ N=>M
+ )
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enables(k),
+ clear=>clear,
+ d=>OUT_AUX(M-1 downto 0),
+ q=>h0_aux(k)
+ );
+ h0((k+1)*M-1 downto k*M)<=std_logic_vector(h0_aux(k));
+
+ end generate;
+
+
+
+ process(ADR_I,STB_I,WE_I,ZERO,EN_ZERO,OUT_AUX,rSTATUS_O)
+ begin
+
+ if (WE_I='1' and STB_I='1') then--ESCRIBIR EN EL FILTRO
+ case ADR_I(7 downto 0) is
+
+ when std_logic_vector(to_unsigned(Reg_control,8)) => start<='1';
+ DAT_O<=ZERO;
+ Clear_Status<='0';
+
+ when std_logic_vector(to_unsigned(Reg_status,8))=> Clear_Status<='1';
+ DAT_O<=ZERO;
+ start<='0';
+ when OTHERS => start<='0';
+ DAT_O<=ZERO;
+ Clear_Status<='0';
+ end case;
+ elsif (WE_I='0' and STB_I='1') then
+ case ADR_I(7 downto 0) is --LEER EL FILTRO
+ when std_logic_vector(to_unsigned(Reg_data,8)) =>
+
+ DAT_O<=RegsDAT_O;
+ start<='0';
+
+ Clear_Status<='0';
+
+ when std_logic_vector(to_unsigned(Reg_status,8)) => DAT_O(0)<=rSTATUS_O(0);
+ DAT_O(Data_wordwidth-1 downto 1)<=ZERO(Data_wordwidth-1 downto 1);
+ start<='0';
+
+ Clear_Status<='0';
+ when OTHERS => start<='0';
+
+ --DAT_O(M-1 downto 0)<= h0_aux(to_integer(unsigned(ADR_I(7 downto 0))-Reg_coef)/4);
+ --DAT_O(Data_wordwidth-1 downto M)<=(others => h0_aux(to_integer(unsigned(ADR_I(7 downto 0))-Reg_coef)/4)(M-1) );
+
+ --DAT_O<=ssDAT_O;
+
+ DAT_O(M-1 downto 0)<= gains;
+ DAT_O(Data_wordwidth-1 downto M)<=(others => gains(M-1) );
+
+
+
+ Clear_Status<='0';
+ end case;
+
+
+ else
+ start<='0';
+ DAT_O<=ZERO;
+ Clear_Status<='0';
+ end if;
+
+ end process;
+
+ process(ADR_I,STB_I,WE_I,OUT_AUX)
+ begin
+ if rising_edge(clk) then
+
+ if (WE_I='1' and STB_I='1') then
+ if ADR_I(7 downto 0)=std_logic_vector(to_unsigned(reg_data,8)) then
+ ssDAT_O<=OUT_AUX;
+ end if;
+ if ADR_I(7 downto 0)=std_logic_vector(to_unsigned(Reg_Nsec,8)) then
+ en_out<=OUT_AUX(3 downto 0);
+ end if;
+
+ end if;
+ end if;
+
+
+ end process;
+
+ Reg_Stat:fullregister
+ generic map(
+ N=>1
+ )
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>(enable_in or Clear_Status),
+ clear=>Clear_Status,
+ d=>enable_in_aux,
+ q=>rSTATUS_O
+ );
+ Reg_sDat_O:fullregister
+ generic map(
+ N=>Data_wordwidth
+ )
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enable_in ,
+ clear=>clear,
+ d=>sDAT_I,
+ q=>RegsDAT_O
+ );
+
+ sDAT_O<=ssDAT_O;
+
+ --Registro para gain
+
+ enable_gain<='1' when ( WE_I='1' and STB_I='1' and ADR_I(7 downto 0)=std_logic_vector(to_unsigned(Reg_gain,8))) else
+ '0';
+ gainreg:fullregister
+ generic map(
+ N=>M
+ )
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enable_gain,
+ clear=>clear,
+ d=>DAT_I(M-1 downto 0),
+ q=>gains
+ );
+
+ gain<=gains;
+
+end architecture;
+
+
+
vhdl/WISHBONE_IIR/interface_slave_iir.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/comp_mult.vhd
===================================================================
--- vhdl/WISHBONE_FFT/comp_mult.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/comp_mult.vhd (revision 5)
@@ -0,0 +1,97 @@
+--Since both the real and imaginary values have the same number of fractio nal bits,
+-- there is no need to truncate.
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity comp_mult is
+
+generic ( inst_width1 : INTEGER := 14;
+ inst_width2 : INTEGER := 14
+ );
+
+port ( Re1 : in std_logic_vector(inst_width1-1 downto 0);
+ Im1 : in std_logic_vector(inst_width1-1 downto 0);
+ Re2 : in std_logic_vector(inst_width2-1 downto 0);
+ Im2 : in std_logic_vector(inst_width2-1 downto 0);
+ Re : out std_logic_vector(inst_width1 + inst_width2 downto 0);
+ Im : out std_logic_vector(inst_width1 + inst_width2 downto 0)
+
+);
+end comp_mult;
+
+architecture behavior of comp_mult is
+--multiplier outputs
+signal product1 :std_logic_vector(inst_width1+inst_width2-1 downto 0);--re1*re2
+signal product2 :std_logic_vector(inst_width1+inst_width2-1 downto 0);--i m1*im2
+signal product3 :std_logic_vector(inst_width1+inst_width2-1 downto 0);
+signal product4 :std_logic_vector(inst_width1+inst_width2-1 downto 0);
+
+
+
+component adder
+ generic (inst_width:integer);
+ port (
+ inst_A : in std_logic_vector(inst_width-1 downto 0);
+ inst_B : in std_logic_vector(inst_width-1 downto 0);
+ SUM : out std_logic_vector(inst_width downto 0)
+ );
+
+end component;
+
+
+component subtract
+ generic (inst_width:integer);
+ port (
+ inst_A : in std_logic_vector(inst_width-1 downto 0);
+ inst_B : in std_logic_vector(inst_width-1 downto 0);
+ DIFF : out std_logic_vector(inst_width downto 0)
+ );
+end component;
+
+component multiplier
+ generic (inst_width1:integer ;
+ inst_width2:integer
+ );
+ port (
+ inst_A : in std_logic_vector(inst_width1-1 downto 0);
+ inst_B : in std_logic_vector(inst_width2-1 downto 0);
+ PRODUCT_inst : out
+std_logic_vector(inst_width1+inst_width2-1 downto 0)
+ );
+end component;
+
+
+begin
+
+ U1 : multiplier
+ generic map( inst_width1=> inst_width1,
+inst_width2=>inst_width2)
+ port map ( inst_A => Re1, inst_B => Re2, PRODUCT_inst =>
+product1 );
+
+ U2 : multiplier
+ generic map( inst_width1=>inst_width1,
+inst_width2=>inst_width2)
+ port map ( inst_A => Im1, inst_B => Im2, PRODUCT_inst =>
+product2 );
+
+ U3 : multiplier
+ generic map( inst_width1=>inst_width1,
+inst_width2=>inst_width2)
+ port map( inst_A => Re1, inst_B => Im2, PRODUCT_inst =>product3 );
+
+ U4 : multiplier
+ generic map( inst_width1=>inst_width2, inst_width2=>inst_width1)
+ port map ( inst_A => Re2, inst_B => Im1, PRODUCT_inst =>product4);
+
+ U5 : subtract
+ generic map ( inst_width=>inst_width1+inst_width2)
+ port map(inst_A => product1, inst_B => product2, DIFF => Re );
+
+ U6 : adder
+ generic map ( inst_width=>inst_width1+inst_width2)
+ port map ( inst_A => product3, inst_B => product4, SUM =>Im );
+
+end;
vhdl/WISHBONE_FFT/comp_mult.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/FFT_WB.vhd
===================================================================
--- vhdl/WISHBONE_FFT/FFT_WB.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/FFT_WB.vhd (revision 5)
@@ -0,0 +1,143 @@
+library ieee;
+library work;
+
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use ieee.math_real.all;
+
+
+entity FFT_WB is
+generic (WB_Width:integer:=32;--Filter width signals of in/out
+ Adress_wordwidth:integer:=32 ;
+ N:integer:=1024;--width word of coefs
+ reg_control:integer:=0;
+ reg_data:integer:=4;
+ reg_status:integer:=8;
+ reg_memory:integer:=12
+
+ );
+
+port(
+DAT_I: in std_logic_vector(WB_Width-1 downto 0);
+DAT_O:out std_logic_vector(WB_Width-1 downto 0);
+ADR_I :in std_logic_vector(Adress_wordwidth-1 downto 0);
+STB_I,RST_I,CLK_I,WE_I: in std_logic;
+ACK_O: out std_logic
+);
+end entity;
+
+
+architecture RTL of FFT_WB is
+
+
+component fft_core_pipeline1 is
+ generic (
+ input_width : integer :=16;
+ twiddle_width : integer :=16;
+ N : integer :=1024;
+ add_g : integer:=0;--1; --Either 0 or 1 only.
+ mult_g : integer:=0--9 --Can be any number from 0 to twiddle_width+1
+ );
+ port ( clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ enable_out: out std_logic;
+ frame_ready: out std_logic;
+ index : out std_logic_vector(integer(ceil(log2(real((N)))))-1 downto 0);
+ xin_r : in std_logic_vector(input_width-1 downto 0);
+ xin_i : in std_logic_vector(input_width-1 downto 0);
+ Xout_r : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0);
+ Xout_i : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0)
+ );
+end component;
+
+component interface_slave_fft is
+generic(
+N: integer;
+data_wordwidth: integer;
+adress_wordwidth: integer;
+reg_control:integer;
+reg_data:integer;
+reg_status:integer;
+reg_memory:integer
+
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( adress_wordwidth-1 downto 0 );
+ ADR_FFT: in std_logic_vector( integer(ceil(log2(real(N))))-1 downto 0 );
+ DAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to SLAVE
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ FFT_finish_in: in std_logic;--from SLAVE
+ FFT_enable: out std_logic;--to SLAVE
+ enable_in: in std_logic;--from SLAVE
+ clear_out: out std_logic;--to SLAVE
+ clk: in std_logic
+ );
+end component;
+
+signal index_aux: std_logic_vector(integer(ceil(log2(real(N))))-1 downto 0);
+signal frame_ready_aux,enable_out_aux,FFT_enable_aux,clear_aux:std_logic;
+signal Data1_aux,Data2_aux: std_logic_vector(WB_Width-1 downto 0);
+begin
+
+--Instancia del FFT-Core
+FFT: fft_core_pipeline1
+ generic map(
+ input_width=>WB_Width/2,
+ twiddle_width=>WB_Width/2,
+ N=>N,
+ add_g=>0,
+ mult_g=>0
+ )
+ port map(
+ clock=>CLK_I,
+ resetn=>RST_I,
+ enable=>FFT_enable_aux,
+ clear=>clear_aux,
+ enable_out=>enable_out_aux,
+ frame_ready=>frame_ready_aux,
+ index=>index_aux,
+ xin_r=>Data1_aux(WB_Width-1 downto WB_Width/2),
+ xin_i=>Data1_aux((WB_Width/2)-1 downto 0),
+ Xout_r=>Data2_aux(WB_Width-1 downto WB_Width/2),
+ Xout_i=>Data2_aux((WB_Width/2)-1 downto 0)
+ );
+
+ --Instancia de interfaz con arbitro Wishbone
+ Interface: interface_slave_fft
+generic map(
+N=>N,
+data_wordwidth=>WB_Width,
+adress_wordwidth=>Adress_wordwidth,
+reg_control=>reg_control,
+reg_data=>reg_data,
+reg_status=>reg_status,
+reg_memory=>reg_memory
+)
+port map(
+ ACK_O=>ACK_O,
+ ADR_I=>ADR_I,
+ ADR_FFT=>index_aux,
+ DAT_I=>DAT_I,
+ sDAT_I=>Data2_aux,
+ DAT_O=>DAT_O,
+ sDAT_O=>Data1_aux,
+ STB_I=>STB_I,
+ WE_I=>WE_I,
+ FFT_finish_in=>frame_ready_aux,
+ FFT_enable=>FFT_enable_aux,
+ enable_in=>enable_out_aux,
+ clear_out=>clear_aux,
+ clk=>CLK_I
+ );
+
+ end architecture;
\ No newline at end of file
vhdl/WISHBONE_FFT/FFT_WB.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/stage_II_last.vhd
===================================================================
--- vhdl/WISHBONE_FFT/stage_II_last.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/stage_II_last.vhd (revision 5)
@@ -0,0 +1,149 @@
+--Component for Stages using BF2II (last stage only)
+--When BF2II is the last butterfly, there is no multiplier after it
+--Input is a standar d logic vector of data_width -add_g
+--data_width - wid th of the internal busses
+--add_g - Add growth variable - if 1, data_width grows by 1, if 0 then - 0
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity stage_II_last is
+generic (
+ data_width : INTEGER :=14;
+ add_g : INTEGER := 1
+ );
+
+port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ t :in std_logic;
+ s :in std_logic;
+ clock : in std_logic;
+ enable : in std_logic;
+ resetn : in std_logic ;
+ tonext_r :out std_logic_vector(data_width -1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+
+end stage_II_last;
+
+architecture structure of stage_II_last is
+signal toreg_r : std_logic_vector(data_width-1 downto 0);
+signal toreg_i : std_logic_vector(data_width-1 downto 0);
+signal fromreg_r : std_logic_vector( data_width-1 downto 0);
+signal fromreg_i : std_logic_vector( data_width-1 downto 0);
+
+signal tonext_r_aux : std_logic_vector(data_width-1 downto 0);
+signal tonext_i_aux : std_logic_vector(data_width-1 downto 0);
+
+
+component shiftreg1
+ generic (
+ data_width : integer
+ );
+ port (
+ clock : IN std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0 );
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+component BF2II
+ generic (
+ data_width : INTEGER;
+ add_g: INTEGER
+ );
+ port (
+ fromreg_r :in std_logic_vector(data_width-1 downto 0);
+ fromreg_i :in std_logic_vector(data_width-1 downto 0);
+ prvs_r :in std_logic_vector(data_width-add_g-1 downto 0);
+ prvs_i :in std_logic_vector(data_width-add_g-1 downto 0);
+ t : in std_logic;
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width-1 downto 0);
+ toreg_i : out std_logic_vector(data_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+end component;
+
+begin
+regr : shiftreg1
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ clock=>clock,
+ enable=>enable,
+ clear =>'0',
+ read_data=>fromreg_r,
+ write_data=>toreg_r,
+ resetn=>resetn
+ );
+
+regi : shiftreg1
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ clock=>clock,
+ enable=>enable,
+ clear =>'0',
+ read_data=>fromreg_i,
+ write_data=>toreg_i,
+ resetn=>resetn
+ );
+
+btrfly : BF2II
+ generic map (
+ data_width=>data_width,
+ add_g=>add_g
+ )
+ port map (
+ fromreg_r=>fromreg_r,
+ fromreg_i=>fromreg_i,
+ prvs_r=>prvs_r,
+ prvs_i=>prvs_i,
+ t=>t,
+ s=>s,
+ toreg_r=>toreg_r,
+ toreg_i=>toreg_i,
+ tonext_r=>tonext_r_aux,
+ tonext_i=>tonext_i_aux
+ );
+
+
+
+regsegr : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_r,
+ write_data=>tonext_r_aux,
+ resetn=>resetn
+ );
+
+regsegi : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_i,
+ write_data=>tonext_i_aux,
+ resetn=>resetn
+ );
+
+end;
vhdl/WISHBONE_FFT/stage_II_last.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/RAM_Memory.vhd
===================================================================
--- vhdl/WISHBONE_FFT/RAM_Memory.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/RAM_Memory.vhd (revision 5)
@@ -0,0 +1,46 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+entity RAM_Memory is
+generic(
+
+Add_WordWidth: integer:=10;
+Data_WordWidth: integer:=32
+);
+port(
+ DATi: in std_logic_vector( Data_WordWidth-1 downto 0 );
+ DATo: out std_logic_vector( Data_WordWidth-1 downto 0 );
+ ADR_WB: in std_logic_vector( Add_WordWidth-1 downto 0 );
+ ADR_FFT: in std_logic_vector( Add_WordWidth-1 downto 0 );
+ W_R: in std_logic;
+ clk: in std_logic
+ );
+end entity;
+
+architecture RTL of RAM_Memory is
+
+type array_aux is array((2**Add_WordWidth)-1 downto 0) of std_logic_vector(Data_WordWidth-1 downto 0);
+signal mem:array_aux;
+signal reg0: std_logic_vector(Data_WordWidth-1 downto 0);
+begin
+process(clk)
+begin
+ if rising_edge(clk) then
+
+ if ( W_R='1') then
+ mem(to_integer(unsigned(ADR_FFT)))<=DATi ;
+ end if;
+
+
+ --DATo<=reg0;
+ DATo <= mem(to_integer(unsigned(ADR_WB)));
+
+ end if;
+
+
+
+
+end process;
+end architecture;
\ No newline at end of file
vhdl/WISHBONE_FFT/RAM_Memory.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/FFT_WBtest.vhd
===================================================================
--- vhdl/WISHBONE_FFT/FFT_WBtest.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/FFT_WBtest.vhd (revision 5)
@@ -0,0 +1,120 @@
+library ieee;
+library work;
+--use work.fft_pkg.all;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use ieee.math_real.all;
+
+
+entity FFT_WBtest is
+generic (WB_Width:integer:=32;--Filter width signals of in/out
+ Adress_wordwidth:integer:=32 ;
+ N:integer:=1024;--width word of coefs
+ reg_control:integer:=0;
+ reg_data:integer:=4;
+ reg_status:integer:=8;
+ reg_memory:integer:=12
+
+ );
+
+port(
+DAT_I: in std_logic_vector(WB_Width-1 downto 0);
+DAT_O:out std_logic_vector(WB_Width-1 downto 0);
+ADR_I :in std_logic_vector(Adress_wordwidth-1 downto 0);
+STB_I,RST_I,CLK_I,WE_I: in std_logic;
+ACK_O: out std_logic
+);
+end entity;
+
+
+architecture RTL of FFT_WBtest is
+
+
+component fft_core_pipeline1 is
+ generic (
+ input_width : integer :=16;
+ twiddle_width : integer :=16;
+ N : integer :=1024;
+ add_g : integer:=0;--1; --Either 0 or 1 only.
+ mult_g : integer:=0--9 --Can be any number from 0 to twiddle_width+1
+ );
+ port ( clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ enable_out: out std_logic;
+ frame_ready: out std_logic;
+ index : out std_logic_vector(integer(ceil(log2(real((N)))))-1 downto 0);
+ xin_r : in std_logic_vector(input_width-1 downto 0);
+ xin_i : in std_logic_vector(input_width-1 downto 0);
+ Xout_r : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0);
+ Xout_i : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0)
+ );
+end component;
+
+component interface_slave_fft is
+generic(
+N: integer;
+data_wordwidth: integer;
+adress_wordwidth: integer;
+reg_control:integer;
+reg_data:integer;
+reg_status:integer;
+reg_memory:integer
+
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( adress_wordwidth-1 downto 0 );
+ ADR_FFT: in std_logic_vector( integer(ceil(log2(real((N)))))-1 downto 0 );
+ DAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to SLAVE
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ FFT_finish_in: in std_logic;--from SLAVE
+ FFT_enable: out std_logic;--to SLAVE
+ enable_in: in std_logic;--from SLAVE
+ clear_out: out std_logic;--to SLAVE
+ clk: in std_logic
+ );
+end component;
+
+signal index_aux: std_logic_vector(integer(ceil(log2(real(N))))-1 downto 0);
+signal frame_ready_aux,enable_out_aux,FFT_enable_aux,clear_aux:std_logic;
+signal Data1_aux,Data2_aux: std_logic_vector(WB_Width-1 downto 0);
+begin
+
+
+ Interface: interface_slave_fft
+generic map(
+N=>N,
+data_wordwidth=>WB_Width,
+adress_wordwidth=>Adress_wordwidth,
+reg_control=>reg_control,
+reg_data=>reg_data,
+reg_status=>reg_status,
+reg_memory=>reg_memory
+)
+port map(
+ ACK_O=>ACK_O,
+ ADR_I=>ADR_I,
+ ADR_FFT=>std_logic_vector(unsigned(ADR_I(integer(ceil(log2(real((N+3)*4))))-1 downto 0))-(reg_memory))(integer(ceil(log2(real((N)))))+1 downto 2),
+ DAT_I=>DAT_I,
+ sDAT_I=>DAT_I,
+ DAT_O=>DAT_O,
+ sDAT_O=>Data1_aux,
+ STB_I=>STB_I,
+ WE_I=>WE_I,
+ FFT_finish_in=>frame_ready_aux,
+ FFT_enable=>FFT_enable_aux,
+ enable_in=>WE_I,
+ clear_out=>clear_aux,
+ clk=>CLK_I
+ );
+
+ end architecture;
\ No newline at end of file
Index: vhdl/WISHBONE_FFT/counterhle.vhd
===================================================================
--- vhdl/WISHBONE_FFT/counterhle.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/counterhle.vhd (revision 5)
@@ -0,0 +1,46 @@
+--Counter with resetn and load enable
+--When load enable is high, it counts.
+--When load enable is low, it stops counting.
+--When a reset is triggered, it resets to zero.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+entity counterhle is
+ generic (
+ width: integer :=3
+ );
+ port (
+ clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ countout : out std_logic_vector(width-1 downto 0)
+
+ );
+end counterhle;
+
+architecture behavior of counterhle is
+signal count : std_logic_vector(width-1 downto 0);
+
+begin
+process(clock,resetn,enable)
+begin
+ if (resetn='0')then
+ count <= (others => '0');
+
+ elsif (clock'event and clock='1') then
+ if (enable = '1' ) then
+ if (clear = '1') then
+ count <= (others => '0');
+ else
+ count <= unsigned(count) + '1';
+ end if;
+ end if;
+
+ end if ;
+end process;
+countout <= count;
+
+end;
vhdl/WISHBONE_FFT/counterhle.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/mux2_mmw.vhd
===================================================================
--- vhdl/WISHBONE_FFT/mux2_mmw.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/mux2_mmw.vhd (revision 5)
@@ -0,0 +1,34 @@
+
+--Special 2 to 1 mux (mismatched width)
+--7/17/02
+-- First input is data_width bits
+--Second input is data_width+1 bits
+--Ign ores highest bit of second input
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY mux2_mmw IS
+ GENERIC( data_width : integer := 35
+ );
+ PORT ( s : in std_logic;
+ in0 : in std_logic_vector(data_width-1 downto 0);
+ in1: in std_logic_vector(data_width downto 0);
+ data: out std_logic_vector(data_width-1 downto 0)
+ );
+END mux2_mmw ;
+
+-- hds interface_end
+ARCHITECTURE behavior OF mux2_mmw IS
+BEGIN
+process(in0,in1,s)
+begin
+ if s='0' then
+ data<=in0;
+ else
+ data<=in1(data_width-1 downto 0);
+ end if;
+end process;
+END behavior;
+
vhdl/WISHBONE_FFT/mux2_mmw.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/stage_I.vhd
===================================================================
--- vhdl/WISHBONE_FFT/stage_I.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/stage_I.vhd (revision 5)
@@ -0,0 +1,162 @@
+--Component for Stages using BF2I (first and every odd stage)
+--Doesn't handle last stage
+--Input is a standard logic vector of data_width-add_g
+--data_width - width of the internal busses
+--add_g - Add growth variable - if 1, data _width grows by 1, if 0 then 0
+-- t_stages number of shift -shif register stages
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity stage_I is
+generic (
+ data_width : INTEGER :=13;
+ add_g : INTEGER := 1;
+ shift_stages : INTEGER := 32
+ );
+port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ s :in std_logic;
+ clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+end stage_I;
+
+architecture structure of stage_I is
+
+signal toreg_r : std_logic_vector(data_width-1 downto 0);
+signal toreg_i : std_logic_vector(data_width-1 downto 0);
+signal fromreg_r : std_logic_vector(data_width-1 downto 0);
+signal fromreg_i : std_logic_vector(data_width-1 downto 0);
+
+signal tonext_r_aux : std_logic_vector(data_width-1 downto 0);
+signal tonext_i_aux : std_logic_vector(data_width-1 downto 0);
+
+component shiftregN
+ generic (
+ data_width : integer;
+ n : integer
+ );
+ port (
+ clock : IN std_logic;
+ enable : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0 );
+ resetn : IN std_logic
+ );
+end component;
+
+component shiftreg1
+ generic (
+ data_width : integer
+);
+ port (
+ clock : IN std_logic;
+ enable: in std_logic;
+ clear: in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+
+component BF2I
+ generic (
+ data_width : INTEGER;
+ add_g: INTEGER
+ );
+ port (
+ fromreg_r :in std_logic_vector(data_width-1 downto 0);
+ fromreg_i :in std_logic_vector(data_width-1 downto 0);
+ prvs_r :in std_logic_vector(data_width-add_g-1 downto 0 );
+ prvs_i :in std_logic_vector(data_width-add_g-1 downto 0);
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width-1 downto 0);
+ toreg_i :out std_logic_vector(data_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+end component;
+
+begin
+regr : shiftregN
+ generic map (
+ data_width=>data_width,
+ n=>shift_stages
+ )
+ port map (
+clock=>clock,
+enable=>enable,
+read_data=>fromreg_r,
+write_data=>toreg_r,
+resetn=>resetn
+);
+
+regi : shiftregN
+ generic map (
+ data_width=>data_width,
+ n=>shift_stages
+ )
+port map (
+ clock=>clock,
+ enable=>enable,
+ read_data=>fromreg_i,
+ write_data=>toreg_i,
+ resetn=>resetn
+ );
+
+btrfly : BF2I
+ generic map (
+ data_width=>data_width,
+ add_g=>add_g
+ )
+ port map (
+ fromreg_r=>fromreg_r,
+ fromreg_i=>fromreg_i,
+ prvs_r=>prvs_r,
+ prvs_i=>prvs_i,
+ s=>s,
+ toreg_r=>toreg_r,
+ toreg_i=>toreg_i,
+ tonext_r=>tonext_r_aux,
+ tonext_i=>tonext_i_aux
+ );
+
+
+regsegr : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_r,
+ write_data=>tonext_r_aux,
+ resetn=>resetn
+ );
+
+regsegi : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_i,
+ write_data=>tonext_i_aux,
+ resetn=>resetn
+ );
+
+
+end;
+
vhdl/WISHBONE_FFT/stage_I.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/rom1.vhd
===================================================================
--- vhdl/WISHBONE_FFT/rom1.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/rom1.vhd (revision 5)
@@ -0,0 +1,1061 @@
+-- Rom file for twiddle factors
+-- ../../../rtl/vhdl/WISHBONE_FFT/rom1.vhd contains 1024 points of 16 width
+-- for a 1024 point fft.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY rom1 IS
+ GENERIC(
+ data_width : integer :=16;
+ address_width : integer :=10
+ );
+ PORT(
+ clk :in std_logic;
+ address :in std_logic_vector (9 downto 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0) ;
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end rom1;
+ARCHITECTURE behavior OF rom1 IS
+
+ BEGIN
+
+process (address,clk)
+begin
+ if(rising_edge(clk)) then
+ case address is
+ when "0000000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "0000000001" => datar <= "0111111111111101";datai <= "1111111001101110"; --2
+ when "0000000010" => datar <= "0111111111110101";datai <= "1111110011011100"; --4
+ when "0000000011" => datar <= "0111111111101001";datai <= "1111101101001010"; --6
+ when "0000000100" => datar <= "0111111111011000";datai <= "1111100110111000"; --8
+ when "0000000101" => datar <= "0111111111000001";datai <= "1111100000100111"; --10
+ when "0000000110" => datar <= "0111111110100110";datai <= "1111011010010110"; --12
+ when "0000000111" => datar <= "0111111110000110";datai <= "1111010100000101"; --14
+ when "0000001000" => datar <= "0111111101100001";datai <= "1111001101110100"; --16
+ when "0000001001" => datar <= "0111111100110111";datai <= "1111000111100100"; --18
+ when "0000001010" => datar <= "0111111100001001";datai <= "1111000001010101"; --20
+ when "0000001011" => datar <= "0111111011010101";datai <= "1110111011000110"; --22
+ when "0000001100" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "0000001101" => datar <= "0111111001011111";datai <= "1110101110101011"; --26
+ when "0000001110" => datar <= "0111111000011101";datai <= "1110101000011110"; --28
+ when "0000001111" => datar <= "0111110111010101";datai <= "1110100010010010"; --30
+ when "0000010000" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "0000010001" => datar <= "0111110100111001";datai <= "1110010101111110"; --34
+ when "0000010010" => datar <= "0111110011100011";datai <= "1110001111110101"; --36
+ when "0000010011" => datar <= "0111110010001000";datai <= "1110001001101101"; --38
+ when "0000010100" => datar <= "0111110000101001";datai <= "1110000011100110"; --40
+ when "0000010101" => datar <= "0111101111000101";datai <= "1101111101100001"; --42
+ when "0000010110" => datar <= "0111101101011100";datai <= "1101110111011101"; --44
+ when "0000010111" => datar <= "0111101011101110";datai <= "1101110001011010"; --46
+ when "0000011000" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "0000011001" => datar <= "0111101000000101";datai <= "1101100101011000"; --50
+ when "0000011010" => datar <= "0111100110001001";datai <= "1101011111011010"; --52
+ when "0000011011" => datar <= "0111100100001001";datai <= "1101011001011101"; --54
+ when "0000011100" => datar <= "0111100010000100";datai <= "1101010011100001"; --56
+ when "0000011101" => datar <= "0111011111111010";datai <= "1101001101100111"; --58
+ when "0000011110" => datar <= "0111011101101011";datai <= "1101000111101111"; --60
+ when "0000011111" => datar <= "0111011011011000";datai <= "1101000001111001"; --62
+ when "0000100000" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "0000100001" => datar <= "0111010110100101";datai <= "1100110110010010"; --66
+ when "0000100010" => datar <= "0111010100000100";datai <= "1100110000100001"; --68
+ when "0000100011" => datar <= "0111010001011111";datai <= "1100101010110011"; --70
+ when "0000100100" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "0000100101" => datar <= "0111001100000111";datai <= "1100011111011100"; --74
+ when "0000100110" => datar <= "0111001001010100";datai <= "1100011001110100"; --76
+ when "0000100111" => datar <= "0111000110011101";datai <= "1100010100001110"; --78
+ when "0000101000" => datar <= "0111000011100010";datai <= "1100001110101010"; --80
+ when "0000101001" => datar <= "0111000000100010";datai <= "1100001001001000"; --82
+ when "0000101010" => datar <= "0110111101011110";datai <= "1100000011101001"; --84
+ when "0000101011" => datar <= "0110111010010110";datai <= "1011111110001101"; --86
+ when "0000101100" => datar <= "0110110111001001";datai <= "1011111000110010"; --88
+ when "0000101101" => datar <= "0110110011111000";datai <= "1011110011011011"; --90
+ when "0000101110" => datar <= "0110110000100011";datai <= "1011101110000110"; --92
+ when "0000101111" => datar <= "0110101101001010";datai <= "1011101000110011"; --94
+ when "0000110000" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "0000110001" => datar <= "0110100110001011";datai <= "1011011110010111"; --98
+ when "0000110010" => datar <= "0110100010100110";datai <= "1011011001001100"; --100
+ when "0000110011" => datar <= "0110011110111100";datai <= "1011010100000101"; --102
+ when "0000110100" => datar <= "0110011011001111";datai <= "1011001111000001"; --104
+ when "0000110101" => datar <= "0110010111011101";datai <= "1011001001111111"; --106
+ when "0000110110" => datar <= "0110010011101000";datai <= "1011000101000001"; --108
+ when "0000110111" => datar <= "0110001111101110";datai <= "1011000000000101"; --110
+ when "0000111000" => datar <= "0110001011110001";datai <= "1010111011001101"; --112
+ when "0000111001" => datar <= "0110000111110000";datai <= "1010110110011000"; --114
+ when "0000111010" => datar <= "0110000011101011";datai <= "1010110001100101"; --116
+ when "0000111011" => datar <= "0101111111100011";datai <= "1010101100110111"; --118
+ when "0000111100" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "0000111101" => datar <= "0101110111000111";datai <= "1010100011100011"; --122
+ when "0000111110" => datar <= "0101110010110011";datai <= "1010011110111110"; --124
+ when "0000111111" => datar <= "0101101110011100";datai <= "1010011010011100"; --126
+ when "0001000000" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "0001000001" => datar <= "0101100101100100";datai <= "1010010001100100"; --130
+ when "0001000010" => datar <= "0101100001000010";datai <= "1010001101001101"; --132
+ when "0001000011" => datar <= "0101011100011101";datai <= "1010001000111001"; --134
+ when "0001000100" => datar <= "0101010111110101";datai <= "1010000100101001"; --136
+ when "0001000101" => datar <= "0101010011001001";datai <= "1010000000011101"; --138
+ when "0001000110" => datar <= "0101001110011011";datai <= "1001111100010101"; --140
+ when "0001000111" => datar <= "0101001001101000";datai <= "1001111000010000"; --142
+ when "0001001000" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "0001001001" => datar <= "0100111111111011";datai <= "1001110000010010"; --146
+ when "0001001010" => datar <= "0100111010111111";datai <= "1001101100011000"; --148
+ when "0001001011" => datar <= "0100110110000001";datai <= "1001101000100011"; --150
+ when "0001001100" => datar <= "0100110000111111";datai <= "1001100100110001"; --152
+ when "0001001101" => datar <= "0100101011111011";datai <= "1001100001000100"; --154
+ when "0001001110" => datar <= "0100100110110100";datai <= "1001011101011010"; --156
+ when "0001001111" => datar <= "0100100001101001";datai <= "1001011001110101"; --158
+ when "0001010000" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "0001010001" => datar <= "0100010111001101";datai <= "1001010010110110"; --162
+ when "0001010010" => datar <= "0100010001111010";datai <= "1001001111011101"; --164
+ when "0001010011" => datar <= "0100001100100101";datai <= "1001001100001000"; --166
+ when "0001010100" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "0001010101" => datar <= "0100000001110011";datai <= "1001000101101010"; --170
+ when "0001010110" => datar <= "0011111100010111";datai <= "1001000010100010"; --172
+ when "0001010111" => datar <= "0011110110111000";datai <= "1000111111011110"; --174
+ when "0001011000" => datar <= "0011110001010110";datai <= "1000111100011110"; --176
+ when "0001011001" => datar <= "0011101011110010";datai <= "1000111001100011"; --178
+ when "0001011010" => datar <= "0011100110001100";datai <= "1000110110101100"; --180
+ when "0001011011" => datar <= "0011100000100100";datai <= "1000110011111001"; --182
+ when "0001011100" => datar <= "0011011010111010";datai <= "1000110001001011"; --184
+ when "0001011101" => datar <= "0011010101001101";datai <= "1000101110100001"; --186
+ when "0001011110" => datar <= "0011001111011111";datai <= "1000101011111100"; --188
+ when "0001011111" => datar <= "0011001001101110";datai <= "1000101001011011"; --190
+ when "0001100000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "0001100001" => datar <= "0010111110000111";datai <= "1000100100101000"; --194
+ when "0001100010" => datar <= "0010111000010001";datai <= "1000100010010101"; --196
+ when "0001100011" => datar <= "0010110010011001";datai <= "1000100000000110"; --198
+ when "0001100100" => datar <= "0010101100011111";datai <= "1000011101111100"; --200
+ when "0001100101" => datar <= "0010100110100011";datai <= "1000011011110111"; --202
+ when "0001100110" => datar <= "0010100000100110";datai <= "1000011001110111"; --204
+ when "0001100111" => datar <= "0010011010101000";datai <= "1000010111111011"; --206
+ when "0001101000" => datar <= "0010010100101000";datai <= "1000010110000100"; --208
+ when "0001101001" => datar <= "0010001110100110";datai <= "1000010100010010"; --210
+ when "0001101010" => datar <= "0010001000100011";datai <= "1000010010100100"; --212
+ when "0001101011" => datar <= "0010000010011111";datai <= "1000010000111011"; --214
+ when "0001101100" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "0001101101" => datar <= "0001110110010011";datai <= "1000001101111000"; --218
+ when "0001101110" => datar <= "0001110000001011";datai <= "1000001100011101"; --220
+ when "0001101111" => datar <= "0001101010000010";datai <= "1000001011000111"; --222
+ when "0001110000" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "0001110001" => datar <= "0001011101101110";datai <= "1000001000101011"; --226
+ when "0001110010" => datar <= "0001010111100010";datai <= "1000000111100011"; --228
+ when "0001110011" => datar <= "0001010001010101";datai <= "1000000110100001"; --230
+ when "0001110100" => datar <= "0001001011001000";datai <= "1000000101100100"; --232
+ when "0001110101" => datar <= "0001000100111010";datai <= "1000000100101011"; --234
+ when "0001110110" => datar <= "0000111110101011";datai <= "1000000011110111"; --236
+ when "0001110111" => datar <= "0000111000011100";datai <= "1000000011001001"; --238
+ when "0001111000" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "0001111001" => datar <= "0000101011111011";datai <= "1000000001111010"; --242
+ when "0001111010" => datar <= "0000100101101010";datai <= "1000000001011010"; --244
+ when "0001111011" => datar <= "0000011111011001";datai <= "1000000000111111"; --246
+ when "0001111100" => datar <= "0000011001001000";datai <= "1000000000101000"; --248
+ when "0001111101" => datar <= "0000010010110110";datai <= "1000000000010111"; --250
+ when "0001111110" => datar <= "0000001100100100";datai <= "1000000000001011"; --252
+ when "0001111111" => datar <= "0000000110010010";datai <= "1000000000000011"; --254
+ when "0010000000" => datar <= "0000000000000000";datai <= "1000000000000001"; --256
+ when "0010000001" => datar <= "1111111001101110";datai <= "1000000000000011"; --258
+ when "0010000010" => datar <= "1111110011011100";datai <= "1000000000001011"; --260
+ when "0010000011" => datar <= "1111101101001010";datai <= "1000000000010111"; --262
+ when "0010000100" => datar <= "1111100110111000";datai <= "1000000000101000"; --264
+ when "0010000101" => datar <= "1111100000100111";datai <= "1000000000111111"; --266
+ when "0010000110" => datar <= "1111011010010110";datai <= "1000000001011010"; --268
+ when "0010000111" => datar <= "1111010100000101";datai <= "1000000001111010"; --270
+ when "0010001000" => datar <= "1111001101110100";datai <= "1000000010011111"; --272
+ when "0010001001" => datar <= "1111000111100100";datai <= "1000000011001001"; --274
+ when "0010001010" => datar <= "1111000001010101";datai <= "1000000011110111"; --276
+ when "0010001011" => datar <= "1110111011000110";datai <= "1000000100101011"; --278
+ when "0010001100" => datar <= "1110110100111000";datai <= "1000000101100100"; --280
+ when "0010001101" => datar <= "1110101110101011";datai <= "1000000110100001"; --282
+ when "0010001110" => datar <= "1110101000011110";datai <= "1000000111100011"; --284
+ when "0010001111" => datar <= "1110100010010010";datai <= "1000001000101011"; --286
+ when "0010010000" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "0010010001" => datar <= "1110010101111110";datai <= "1000001011000111"; --290
+ when "0010010010" => datar <= "1110001111110101";datai <= "1000001100011101"; --292
+ when "0010010011" => datar <= "1110001001101101";datai <= "1000001101111000"; --294
+ when "0010010100" => datar <= "1110000011100110";datai <= "1000001111010111"; --296
+ when "0010010101" => datar <= "1101111101100001";datai <= "1000010000111011"; --298
+ when "0010010110" => datar <= "1101110111011101";datai <= "1000010010100100"; --300
+ when "0010010111" => datar <= "1101110001011010";datai <= "1000010100010010"; --302
+ when "0010011000" => datar <= "1101101011011000";datai <= "1000010110000100"; --304
+ when "0010011001" => datar <= "1101100101011000";datai <= "1000010111111011"; --306
+ when "0010011010" => datar <= "1101011111011010";datai <= "1000011001110111"; --308
+ when "0010011011" => datar <= "1101011001011101";datai <= "1000011011110111"; --310
+ when "0010011100" => datar <= "1101010011100001";datai <= "1000011101111100"; --312
+ when "0010011101" => datar <= "1101001101100111";datai <= "1000100000000110"; --314
+ when "0010011110" => datar <= "1101000111101111";datai <= "1000100010010101"; --316
+ when "0010011111" => datar <= "1101000001111001";datai <= "1000100100101000"; --318
+ when "0010100000" => datar <= "1100111100000101";datai <= "1000100110111111"; --320
+ when "0010100001" => datar <= "1100110110010010";datai <= "1000101001011011"; --322
+ when "0010100010" => datar <= "1100110000100001";datai <= "1000101011111100"; --324
+ when "0010100011" => datar <= "1100101010110011";datai <= "1000101110100001"; --326
+ when "0010100100" => datar <= "1100100101000110";datai <= "1000110001001011"; --328
+ when "0010100101" => datar <= "1100011111011100";datai <= "1000110011111001"; --330
+ when "0010100110" => datar <= "1100011001110100";datai <= "1000110110101100"; --332
+ when "0010100111" => datar <= "1100010100001110";datai <= "1000111001100011"; --334
+ when "0010101000" => datar <= "1100001110101010";datai <= "1000111100011110"; --336
+ when "0010101001" => datar <= "1100001001001000";datai <= "1000111111011110"; --338
+ when "0010101010" => datar <= "1100000011101001";datai <= "1001000010100010"; --340
+ when "0010101011" => datar <= "1011111110001101";datai <= "1001000101101010"; --342
+ when "0010101100" => datar <= "1011111000110010";datai <= "1001001000110111"; --344
+ when "0010101101" => datar <= "1011110011011011";datai <= "1001001100001000"; --346
+ when "0010101110" => datar <= "1011101110000110";datai <= "1001001111011101"; --348
+ when "0010101111" => datar <= "1011101000110011";datai <= "1001010010110110"; --350
+ when "0010110000" => datar <= "1011100011100100";datai <= "1001010110010011"; --352
+ when "0010110001" => datar <= "1011011110010111";datai <= "1001011001110101"; --354
+ when "0010110010" => datar <= "1011011001001100";datai <= "1001011101011010"; --356
+ when "0010110011" => datar <= "1011010100000101";datai <= "1001100001000100"; --358
+ when "0010110100" => datar <= "1011001111000001";datai <= "1001100100110001"; --360
+ when "0010110101" => datar <= "1011001001111111";datai <= "1001101000100011"; --362
+ when "0010110110" => datar <= "1011000101000001";datai <= "1001101100011000"; --364
+ when "0010110111" => datar <= "1011000000000101";datai <= "1001110000010010"; --366
+ when "0010111000" => datar <= "1010111011001101";datai <= "1001110100001111"; --368
+ when "0010111001" => datar <= "1010110110011000";datai <= "1001111000010000"; --370
+ when "0010111010" => datar <= "1010110001100101";datai <= "1001111100010101"; --372
+ when "0010111011" => datar <= "1010101100110111";datai <= "1010000000011101"; --374
+ when "0010111100" => datar <= "1010101000001011";datai <= "1010000100101001"; --376
+ when "0010111101" => datar <= "1010100011100011";datai <= "1010001000111001"; --378
+ when "0010111110" => datar <= "1010011110111110";datai <= "1010001101001101"; --380
+ when "0010111111" => datar <= "1010011010011100";datai <= "1010010001100100"; --382
+ when "0011000000" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "0011000001" => datar <= "1010010001100100";datai <= "1010011010011100"; --386
+ when "0011000010" => datar <= "1010001101001101";datai <= "1010011110111110"; --388
+ when "0011000011" => datar <= "1010001000111001";datai <= "1010100011100011"; --390
+ when "0011000100" => datar <= "1010000100101001";datai <= "1010101000001011"; --392
+ when "0011000101" => datar <= "1010000000011101";datai <= "1010101100110111"; --394
+ when "0011000110" => datar <= "1001111100010101";datai <= "1010110001100101"; --396
+ when "0011000111" => datar <= "1001111000010000";datai <= "1010110110011000"; --398
+ when "0011001000" => datar <= "1001110100001111";datai <= "1010111011001101"; --400
+ when "0011001001" => datar <= "1001110000010010";datai <= "1011000000000101"; --402
+ when "0011001010" => datar <= "1001101100011000";datai <= "1011000101000001"; --404
+ when "0011001011" => datar <= "1001101000100011";datai <= "1011001001111111"; --406
+ when "0011001100" => datar <= "1001100100110001";datai <= "1011001111000001"; --408
+ when "0011001101" => datar <= "1001100001000100";datai <= "1011010100000101"; --410
+ when "0011001110" => datar <= "1001011101011010";datai <= "1011011001001100"; --412
+ when "0011001111" => datar <= "1001011001110101";datai <= "1011011110010111"; --414
+ when "0011010000" => datar <= "1001010110010011";datai <= "1011100011100100"; --416
+ when "0011010001" => datar <= "1001010010110110";datai <= "1011101000110011"; --418
+ when "0011010010" => datar <= "1001001111011101";datai <= "1011101110000110"; --420
+ when "0011010011" => datar <= "1001001100001000";datai <= "1011110011011011"; --422
+ when "0011010100" => datar <= "1001001000110111";datai <= "1011111000110010"; --424
+ when "0011010101" => datar <= "1001000101101010";datai <= "1011111110001101"; --426
+ when "0011010110" => datar <= "1001000010100010";datai <= "1100000011101001"; --428
+ when "0011010111" => datar <= "1000111111011110";datai <= "1100001001001000"; --430
+ when "0011011000" => datar <= "1000111100011110";datai <= "1100001110101010"; --432
+ when "0011011001" => datar <= "1000111001100011";datai <= "1100010100001110"; --434
+ when "0011011010" => datar <= "1000110110101100";datai <= "1100011001110100"; --436
+ when "0011011011" => datar <= "1000110011111001";datai <= "1100011111011100"; --438
+ when "0011011100" => datar <= "1000110001001011";datai <= "1100100101000110"; --440
+ when "0011011101" => datar <= "1000101110100001";datai <= "1100101010110011"; --442
+ when "0011011110" => datar <= "1000101011111100";datai <= "1100110000100001"; --444
+ when "0011011111" => datar <= "1000101001011011";datai <= "1100110110010010"; --446
+ when "0011100000" => datar <= "1000100110111111";datai <= "1100111100000101"; --448
+ when "0011100001" => datar <= "1000100100101000";datai <= "1101000001111001"; --450
+ when "0011100010" => datar <= "1000100010010101";datai <= "1101000111101111"; --452
+ when "0011100011" => datar <= "1000100000000110";datai <= "1101001101100111"; --454
+ when "0011100100" => datar <= "1000011101111100";datai <= "1101010011100001"; --456
+ when "0011100101" => datar <= "1000011011110111";datai <= "1101011001011101"; --458
+ when "0011100110" => datar <= "1000011001110111";datai <= "1101011111011010"; --460
+ when "0011100111" => datar <= "1000010111111011";datai <= "1101100101011000"; --462
+ when "0011101000" => datar <= "1000010110000100";datai <= "1101101011011000"; --464
+ when "0011101001" => datar <= "1000010100010010";datai <= "1101110001011010"; --466
+ when "0011101010" => datar <= "1000010010100100";datai <= "1101110111011101"; --468
+ when "0011101011" => datar <= "1000010000111011";datai <= "1101111101100001"; --470
+ when "0011101100" => datar <= "1000001111010111";datai <= "1110000011100110"; --472
+ when "0011101101" => datar <= "1000001101111000";datai <= "1110001001101101"; --474
+ when "0011101110" => datar <= "1000001100011101";datai <= "1110001111110101"; --476
+ when "0011101111" => datar <= "1000001011000111";datai <= "1110010101111110"; --478
+ when "0011110000" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "0011110001" => datar <= "1000001000101011";datai <= "1110100010010010"; --482
+ when "0011110010" => datar <= "1000000111100011";datai <= "1110101000011110"; --484
+ when "0011110011" => datar <= "1000000110100001";datai <= "1110101110101011"; --486
+ when "0011110100" => datar <= "1000000101100100";datai <= "1110110100111000"; --488
+ when "0011110101" => datar <= "1000000100101011";datai <= "1110111011000110"; --490
+ when "0011110110" => datar <= "1000000011110111";datai <= "1111000001010101"; --492
+ when "0011110111" => datar <= "1000000011001001";datai <= "1111000111100100"; --494
+ when "0011111000" => datar <= "1000000010011111";datai <= "1111001101110100"; --496
+ when "0011111001" => datar <= "1000000001111010";datai <= "1111010100000101"; --498
+ when "0011111010" => datar <= "1000000001011010";datai <= "1111011010010110"; --500
+ when "0011111011" => datar <= "1000000000111111";datai <= "1111100000100111"; --502
+ when "0011111100" => datar <= "1000000000101000";datai <= "1111100110111000"; --504
+ when "0011111101" => datar <= "1000000000010111";datai <= "1111101101001010"; --506
+ when "0011111110" => datar <= "1000000000001011";datai <= "1111110011011100"; --508
+ when "0011111111" => datar <= "1000000000000011";datai <= "1111111001101110"; --510
+ when "0100000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "0100000001" => datar <= "0111111111111110";datai <= "1111111100110111"; --1
+ when "0100000010" => datar <= "0111111111111101";datai <= "1111111001101110"; --2
+ when "0100000011" => datar <= "0111111111111001";datai <= "1111110110100101"; --3
+ when "0100000100" => datar <= "0111111111110101";datai <= "1111110011011100"; --4
+ when "0100000101" => datar <= "0111111111110000";datai <= "1111110000010011"; --5
+ when "0100000110" => datar <= "0111111111101001";datai <= "1111101101001010"; --6
+ when "0100000111" => datar <= "0111111111100001";datai <= "1111101010000001"; --7
+ when "0100001000" => datar <= "0111111111011000";datai <= "1111100110111000"; --8
+ when "0100001001" => datar <= "0111111111001101";datai <= "1111100011101111"; --9
+ when "0100001010" => datar <= "0111111111000001";datai <= "1111100000100111"; --10
+ when "0100001011" => datar <= "0111111110110100";datai <= "1111011101011110"; --11
+ when "0100001100" => datar <= "0111111110100110";datai <= "1111011010010110"; --12
+ when "0100001101" => datar <= "0111111110010111";datai <= "1111010111001101"; --13
+ when "0100001110" => datar <= "0111111110000110";datai <= "1111010100000101"; --14
+ when "0100001111" => datar <= "0111111101110100";datai <= "1111010000111100"; --15
+ when "0100010000" => datar <= "0111111101100001";datai <= "1111001101110100"; --16
+ when "0100010001" => datar <= "0111111101001101";datai <= "1111001010101100"; --17
+ when "0100010010" => datar <= "0111111100110111";datai <= "1111000111100100"; --18
+ when "0100010011" => datar <= "0111111100100001";datai <= "1111000100011101"; --19
+ when "0100010100" => datar <= "0111111100001001";datai <= "1111000001010101"; --20
+ when "0100010101" => datar <= "0111111011101111";datai <= "1110111110001110"; --21
+ when "0100010110" => datar <= "0111111011010101";datai <= "1110111011000110"; --22
+ when "0100010111" => datar <= "0111111010111001";datai <= "1110110111111111"; --23
+ when "0100011000" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "0100011001" => datar <= "0111111001111110";datai <= "1110110001110001"; --25
+ when "0100011010" => datar <= "0111111001011111";datai <= "1110101110101011"; --26
+ when "0100011011" => datar <= "0111111000111110";datai <= "1110101011100100"; --27
+ when "0100011100" => datar <= "0111111000011101";datai <= "1110101000011110"; --28
+ when "0100011101" => datar <= "0111110111111010";datai <= "1110100101011000"; --29
+ when "0100011110" => datar <= "0111110111010101";datai <= "1110100010010010"; --30
+ when "0100011111" => datar <= "0111110110110000";datai <= "1110011111001101"; --31
+ when "0100100000" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "0100100001" => datar <= "0111110101100010";datai <= "1110011001000010"; --33
+ when "0100100010" => datar <= "0111110100111001";datai <= "1110010101111110"; --34
+ when "0100100011" => datar <= "0111110100001110";datai <= "1110010010111001"; --35
+ when "0100100100" => datar <= "0111110011100011";datai <= "1110001111110101"; --36
+ when "0100100101" => datar <= "0111110010110110";datai <= "1110001100110001"; --37
+ when "0100100110" => datar <= "0111110010001000";datai <= "1110001001101101"; --38
+ when "0100100111" => datar <= "0111110001011001";datai <= "1110000110101001"; --39
+ when "0100101000" => datar <= "0111110000101001";datai <= "1110000011100110"; --40
+ when "0100101001" => datar <= "0111101111111000";datai <= "1110000000100011"; --41
+ when "0100101010" => datar <= "0111101111000101";datai <= "1101111101100001"; --42
+ when "0100101011" => datar <= "0111101110010001";datai <= "1101111010011111"; --43
+ when "0100101100" => datar <= "0111101101011100";datai <= "1101110111011101"; --44
+ when "0100101101" => datar <= "0111101100100110";datai <= "1101110100011011"; --45
+ when "0100101110" => datar <= "0111101011101110";datai <= "1101110001011010"; --46
+ when "0100101111" => datar <= "0111101010110110";datai <= "1101101110011001"; --47
+ when "0100110000" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "0100110001" => datar <= "0111101001000001";datai <= "1101101000011000"; --49
+ when "0100110010" => datar <= "0111101000000101";datai <= "1101100101011000"; --50
+ when "0100110011" => datar <= "0111100111001000";datai <= "1101100010011001"; --51
+ when "0100110100" => datar <= "0111100110001001";datai <= "1101011111011010"; --52
+ when "0100110101" => datar <= "0111100101001010";datai <= "1101011100011011"; --53
+ when "0100110110" => datar <= "0111100100001001";datai <= "1101011001011101"; --54
+ when "0100110111" => datar <= "0111100011000111";datai <= "1101010110011111"; --55
+ when "0100111000" => datar <= "0111100010000100";datai <= "1101010011100001"; --56
+ when "0100111001" => datar <= "0111100000111111";datai <= "1101010000100100"; --57
+ when "0100111010" => datar <= "0111011111111010";datai <= "1101001101100111"; --58
+ when "0100111011" => datar <= "0111011110110011";datai <= "1101001010101011"; --59
+ when "0100111100" => datar <= "0111011101101011";datai <= "1101000111101111"; --60
+ when "0100111101" => datar <= "0111011100100010";datai <= "1101000100110100"; --61
+ when "0100111110" => datar <= "0111011011011000";datai <= "1101000001111001"; --62
+ when "0100111111" => datar <= "0111011010001101";datai <= "1100111110111111"; --63
+ when "0101000000" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "0101000001" => datar <= "0111010111110011";datai <= "1100111001001011"; --65
+ when "0101000010" => datar <= "0111010110100101";datai <= "1100110110010010"; --66
+ when "0101000011" => datar <= "0111010101010101";datai <= "1100110011011010"; --67
+ when "0101000100" => datar <= "0111010100000100";datai <= "1100110000100001"; --68
+ when "0101000101" => datar <= "0111010010110010";datai <= "1100101101101010"; --69
+ when "0101000110" => datar <= "0111010001011111";datai <= "1100101010110011"; --70
+ when "0101000111" => datar <= "0111010000001010";datai <= "1100100111111100"; --71
+ when "0101001000" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "0101001001" => datar <= "0111001101011110";datai <= "1100100010010001"; --73
+ when "0101001010" => datar <= "0111001100000111";datai <= "1100011111011100"; --74
+ when "0101001011" => datar <= "0111001010101110";datai <= "1100011100100111"; --75
+ when "0101001100" => datar <= "0111001001010100";datai <= "1100011001110100"; --76
+ when "0101001101" => datar <= "0111000111111001";datai <= "1100010111000000"; --77
+ when "0101001110" => datar <= "0111000110011101";datai <= "1100010100001110"; --78
+ when "0101001111" => datar <= "0111000101000000";datai <= "1100010001011011"; --79
+ when "0101010000" => datar <= "0111000011100010";datai <= "1100001110101010"; --80
+ when "0101010001" => datar <= "0111000010000011";datai <= "1100001011111001"; --81
+ when "0101010010" => datar <= "0111000000100010";datai <= "1100001001001000"; --82
+ when "0101010011" => datar <= "0110111111000001";datai <= "1100000110011000"; --83
+ when "0101010100" => datar <= "0110111101011110";datai <= "1100000011101001"; --84
+ when "0101010101" => datar <= "0110111011111011";datai <= "1100000000111011"; --85
+ when "0101010110" => datar <= "0110111010010110";datai <= "1011111110001101"; --86
+ when "0101010111" => datar <= "0110111000110000";datai <= "1011111011011111"; --87
+ when "0101011000" => datar <= "0110110111001001";datai <= "1011111000110010"; --88
+ when "0101011001" => datar <= "0110110101100001";datai <= "1011110110000110"; --89
+ when "0101011010" => datar <= "0110110011111000";datai <= "1011110011011011"; --90
+ when "0101011011" => datar <= "0110110010001110";datai <= "1011110000110000"; --91
+ when "0101011100" => datar <= "0110110000100011";datai <= "1011101110000110"; --92
+ when "0101011101" => datar <= "0110101110110111";datai <= "1011101011011100"; --93
+ when "0101011110" => datar <= "0110101101001010";datai <= "1011101000110011"; --94
+ when "0101011111" => datar <= "0110101011011100";datai <= "1011100110001011"; --95
+ when "0101100000" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "0101100001" => datar <= "0110100111111101";datai <= "1011100000111101"; --97
+ when "0101100010" => datar <= "0110100110001011";datai <= "1011011110010111"; --98
+ when "0101100011" => datar <= "0110100100011001";datai <= "1011011011110001"; --99
+ when "0101100100" => datar <= "0110100010100110";datai <= "1011011001001100"; --100
+ when "0101100101" => datar <= "0110100000110010";datai <= "1011010110101000"; --101
+ when "0101100110" => datar <= "0110011110111100";datai <= "1011010100000101"; --102
+ when "0101100111" => datar <= "0110011101000110";datai <= "1011010001100011"; --103
+ when "0101101000" => datar <= "0110011011001111";datai <= "1011001111000001"; --104
+ when "0101101001" => datar <= "0110011001010110";datai <= "1011001100100000"; --105
+ when "0101101010" => datar <= "0110010111011101";datai <= "1011001001111111"; --106
+ when "0101101011" => datar <= "0110010101100011";datai <= "1011000111100000"; --107
+ when "0101101100" => datar <= "0110010011101000";datai <= "1011000101000001"; --108
+ when "0101101101" => datar <= "0110010001101100";datai <= "1011000010100011"; --109
+ when "0101101110" => datar <= "0110001111101110";datai <= "1011000000000101"; --110
+ when "0101101111" => datar <= "0110001101110000";datai <= "1010111101101001"; --111
+ when "0101110000" => datar <= "0110001011110001";datai <= "1010111011001101"; --112
+ when "0101110001" => datar <= "0110001001110001";datai <= "1010111000110010"; --113
+ when "0101110010" => datar <= "0110000111110000";datai <= "1010110110011000"; --114
+ when "0101110011" => datar <= "0110000101101110";datai <= "1010110011111110"; --115
+ when "0101110100" => datar <= "0110000011101011";datai <= "1010110001100101"; --116
+ when "0101110101" => datar <= "0110000001101000";datai <= "1010101111001110"; --117
+ when "0101110110" => datar <= "0101111111100011";datai <= "1010101100110111"; --118
+ when "0101110111" => datar <= "0101111101011101";datai <= "1010101010100000"; --119
+ when "0101111000" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "0101111001" => datar <= "0101111001001111";datai <= "1010100101110110"; --121
+ when "0101111010" => datar <= "0101110111000111";datai <= "1010100011100011"; --122
+ when "0101111011" => datar <= "0101110100111110";datai <= "1010100001010000"; --123
+ when "0101111100" => datar <= "0101110010110011";datai <= "1010011110111110"; --124
+ when "0101111101" => datar <= "0101110000101000";datai <= "1010011100101101"; --125
+ when "0101111110" => datar <= "0101101110011100";datai <= "1010011010011100"; --126
+ when "0101111111" => datar <= "0101101100001111";datai <= "1010011000001101"; --127
+ when "0110000000" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "0110000001" => datar <= "0101100111110011";datai <= "1010010011110001"; --129
+ when "0110000010" => datar <= "0101100101100100";datai <= "1010010001100100"; --130
+ when "0110000011" => datar <= "0101100011010011";datai <= "1010001111011000"; --131
+ when "0110000100" => datar <= "0101100001000010";datai <= "1010001101001101"; --132
+ when "0110000101" => datar <= "0101011110110000";datai <= "1010001011000010"; --133
+ when "0110000110" => datar <= "0101011100011101";datai <= "1010001000111001"; --134
+ when "0110000111" => datar <= "0101011010001010";datai <= "1010000110110001"; --135
+ when "0110001000" => datar <= "0101010111110101";datai <= "1010000100101001"; --136
+ when "0110001001" => datar <= "0101010101100000";datai <= "1010000010100011"; --137
+ when "0110001010" => datar <= "0101010011001001";datai <= "1010000000011101"; --138
+ when "0110001011" => datar <= "0101010000110010";datai <= "1001111110011000"; --139
+ when "0110001100" => datar <= "0101001110011011";datai <= "1001111100010101"; --140
+ when "0110001101" => datar <= "0101001100000010";datai <= "1001111010010010"; --141
+ when "0110001110" => datar <= "0101001001101000";datai <= "1001111000010000"; --142
+ when "0110001111" => datar <= "0101000111001110";datai <= "1001110110001111"; --143
+ when "0110010000" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "0110010001" => datar <= "0101000010010111";datai <= "1001110010010000"; --145
+ when "0110010010" => datar <= "0100111111111011";datai <= "1001110000010010"; --146
+ when "0110010011" => datar <= "0100111101011101";datai <= "1001101110010100"; --147
+ when "0110010100" => datar <= "0100111010111111";datai <= "1001101100011000"; --148
+ when "0110010101" => datar <= "0100111000100000";datai <= "1001101010011101"; --149
+ when "0110010110" => datar <= "0100110110000001";datai <= "1001101000100011"; --150
+ when "0110010111" => datar <= "0100110011100000";datai <= "1001100110101010"; --151
+ when "0110011000" => datar <= "0100110000111111";datai <= "1001100100110001"; --152
+ when "0110011001" => datar <= "0100101110011101";datai <= "1001100010111010"; --153
+ when "0110011010" => datar <= "0100101011111011";datai <= "1001100001000100"; --154
+ when "0110011011" => datar <= "0100101001011000";datai <= "1001011111001110"; --155
+ when "0110011100" => datar <= "0100100110110100";datai <= "1001011101011010"; --156
+ when "0110011101" => datar <= "0100100100001111";datai <= "1001011011100111"; --157
+ when "0110011110" => datar <= "0100100001101001";datai <= "1001011001110101"; --158
+ when "0110011111" => datar <= "0100011111000011";datai <= "1001011000000011"; --159
+ when "0110100000" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "0110100001" => datar <= "0100011001110101";datai <= "1001010100100100"; --161
+ when "0110100010" => datar <= "0100010111001101";datai <= "1001010010110110"; --162
+ when "0110100011" => datar <= "0100010100100100";datai <= "1001010001001001"; --163
+ when "0110100100" => datar <= "0100010001111010";datai <= "1001001111011101"; --164
+ when "0110100101" => datar <= "0100001111010000";datai <= "1001001101110010"; --165
+ when "0110100110" => datar <= "0100001100100101";datai <= "1001001100001000"; --166
+ when "0110100111" => datar <= "0100001001111010";datai <= "1001001010011111"; --167
+ when "0110101000" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "0110101001" => datar <= "0100000100100001";datai <= "1001000111010000"; --169
+ when "0110101010" => datar <= "0100000001110011";datai <= "1001000101101010"; --170
+ when "0110101011" => datar <= "0011111111000101";datai <= "1001000100000101"; --171
+ when "0110101100" => datar <= "0011111100010111";datai <= "1001000010100010"; --172
+ when "0110101101" => datar <= "0011111001101000";datai <= "1001000000111111"; --173
+ when "0110101110" => datar <= "0011110110111000";datai <= "1000111111011110"; --174
+ when "0110101111" => datar <= "0011110100000111";datai <= "1000111101111101"; --175
+ when "0110110000" => datar <= "0011110001010110";datai <= "1000111100011110"; --176
+ when "0110110001" => datar <= "0011101110100101";datai <= "1000111011000000"; --177
+ when "0110110010" => datar <= "0011101011110010";datai <= "1000111001100011"; --178
+ when "0110110011" => datar <= "0011101001000000";datai <= "1000111000000111"; --179
+ when "0110110100" => datar <= "0011100110001100";datai <= "1000110110101100"; --180
+ when "0110110101" => datar <= "0011100011011001";datai <= "1000110101010010"; --181
+ when "0110110110" => datar <= "0011100000100100";datai <= "1000110011111001"; --182
+ when "0110110111" => datar <= "0011011101101111";datai <= "1000110010100010"; --183
+ when "0110111000" => datar <= "0011011010111010";datai <= "1000110001001011"; --184
+ when "0110111001" => datar <= "0011011000000100";datai <= "1000101111110110"; --185
+ when "0110111010" => datar <= "0011010101001101";datai <= "1000101110100001"; --186
+ when "0110111011" => datar <= "0011010010010110";datai <= "1000101101001110"; --187
+ when "0110111100" => datar <= "0011001111011111";datai <= "1000101011111100"; --188
+ when "0110111101" => datar <= "0011001100100110";datai <= "1000101010101011"; --189
+ when "0110111110" => datar <= "0011001001101110";datai <= "1000101001011011"; --190
+ when "0110111111" => datar <= "0011000110110101";datai <= "1000101000001101"; --191
+ when "0111000000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "0111000001" => datar <= "0011000001000001";datai <= "1000100101110011"; --193
+ when "0111000010" => datar <= "0010111110000111";datai <= "1000100100101000"; --194
+ when "0111000011" => datar <= "0010111011001100";datai <= "1000100011011110"; --195
+ when "0111000100" => datar <= "0010111000010001";datai <= "1000100010010101"; --196
+ when "0111000101" => datar <= "0010110101010101";datai <= "1000100001001101"; --197
+ when "0111000110" => datar <= "0010110010011001";datai <= "1000100000000110"; --198
+ when "0111000111" => datar <= "0010101111011100";datai <= "1000011111000001"; --199
+ when "0111001000" => datar <= "0010101100011111";datai <= "1000011101111100"; --200
+ when "0111001001" => datar <= "0010101001100001";datai <= "1000011100111001"; --201
+ when "0111001010" => datar <= "0010100110100011";datai <= "1000011011110111"; --202
+ when "0111001011" => datar <= "0010100011100101";datai <= "1000011010110110"; --203
+ when "0111001100" => datar <= "0010100000100110";datai <= "1000011001110111"; --204
+ when "0111001101" => datar <= "0010011101100111";datai <= "1000011000111000"; --205
+ when "0111001110" => datar <= "0010011010101000";datai <= "1000010111111011"; --206
+ when "0111001111" => datar <= "0010010111101000";datai <= "1000010110111111"; --207
+ when "0111010000" => datar <= "0010010100101000";datai <= "1000010110000100"; --208
+ when "0111010001" => datar <= "0010010001100111";datai <= "1000010101001010"; --209
+ when "0111010010" => datar <= "0010001110100110";datai <= "1000010100010010"; --210
+ when "0111010011" => datar <= "0010001011100101";datai <= "1000010011011010"; --211
+ when "0111010100" => datar <= "0010001000100011";datai <= "1000010010100100"; --212
+ when "0111010101" => datar <= "0010000101100001";datai <= "1000010001101111"; --213
+ when "0111010110" => datar <= "0010000010011111";datai <= "1000010000111011"; --214
+ when "0111010111" => datar <= "0001111111011101";datai <= "1000010000001000"; --215
+ when "0111011000" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "0111011001" => datar <= "0001111001010111";datai <= "1000001110100111"; --217
+ when "0111011010" => datar <= "0001110110010011";datai <= "1000001101111000"; --218
+ when "0111011011" => datar <= "0001110011001111";datai <= "1000001101001010"; --219
+ when "0111011100" => datar <= "0001110000001011";datai <= "1000001100011101"; --220
+ when "0111011101" => datar <= "0001101101000111";datai <= "1000001011110010"; --221
+ when "0111011110" => datar <= "0001101010000010";datai <= "1000001011000111"; --222
+ when "0111011111" => datar <= "0001100110111110";datai <= "1000001010011110"; --223
+ when "0111100000" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "0111100001" => datar <= "0001100000110011";datai <= "1000001001010000"; --225
+ when "0111100010" => datar <= "0001011101101110";datai <= "1000001000101011"; --226
+ when "0111100011" => datar <= "0001011010101000";datai <= "1000001000000110"; --227
+ when "0111100100" => datar <= "0001010111100010";datai <= "1000000111100011"; --228
+ when "0111100101" => datar <= "0001010100011100";datai <= "1000000111000010"; --229
+ when "0111100110" => datar <= "0001010001010101";datai <= "1000000110100001"; --230
+ when "0111100111" => datar <= "0001001110001111";datai <= "1000000110000010"; --231
+ when "0111101000" => datar <= "0001001011001000";datai <= "1000000101100100"; --232
+ when "0111101001" => datar <= "0001001000000001";datai <= "1000000101000111"; --233
+ when "0111101010" => datar <= "0001000100111010";datai <= "1000000100101011"; --234
+ when "0111101011" => datar <= "0001000001110010";datai <= "1000000100010001"; --235
+ when "0111101100" => datar <= "0000111110101011";datai <= "1000000011110111"; --236
+ when "0111101101" => datar <= "0000111011100011";datai <= "1000000011011111"; --237
+ when "0111101110" => datar <= "0000111000011100";datai <= "1000000011001001"; --238
+ when "0111101111" => datar <= "0000110101010100";datai <= "1000000010110011"; --239
+ when "0111110000" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "0111110001" => datar <= "0000101111000100";datai <= "1000000010001100"; --241
+ when "0111110010" => datar <= "0000101011111011";datai <= "1000000001111010"; --242
+ when "0111110011" => datar <= "0000101000110011";datai <= "1000000001101001"; --243
+ when "0111110100" => datar <= "0000100101101010";datai <= "1000000001011010"; --244
+ when "0111110101" => datar <= "0000100010100010";datai <= "1000000001001100"; --245
+ when "0111110110" => datar <= "0000011111011001";datai <= "1000000000111111"; --246
+ when "0111110111" => datar <= "0000011100010001";datai <= "1000000000110011"; --247
+ when "0111111000" => datar <= "0000011001001000";datai <= "1000000000101000"; --248
+ when "0111111001" => datar <= "0000010101111111";datai <= "1000000000011111"; --249
+ when "0111111010" => datar <= "0000010010110110";datai <= "1000000000010111"; --250
+ when "0111111011" => datar <= "0000001111101101";datai <= "1000000000010000"; --251
+ when "0111111100" => datar <= "0000001100100100";datai <= "1000000000001011"; --252
+ when "0111111101" => datar <= "0000001001011011";datai <= "1000000000000111"; --253
+ when "0111111110" => datar <= "0000000110010010";datai <= "1000000000000011"; --254
+ when "0111111111" => datar <= "0000000011001001";datai <= "1000000000000010"; --255
+ when "1000000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1000000001" => datar <= "0111111111111001";datai <= "1111110110100101"; --3
+ when "1000000010" => datar <= "0111111111101001";datai <= "1111101101001010"; --6
+ when "1000000011" => datar <= "0111111111001101";datai <= "1111100011101111"; --9
+ when "1000000100" => datar <= "0111111110100110";datai <= "1111011010010110"; --12
+ when "1000000101" => datar <= "0111111101110100";datai <= "1111010000111100"; --15
+ when "1000000110" => datar <= "0111111100110111";datai <= "1111000111100100"; --18
+ when "1000000111" => datar <= "0111111011101111";datai <= "1110111110001110"; --21
+ when "1000001000" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "1000001001" => datar <= "0111111000111110";datai <= "1110101011100100"; --27
+ when "1000001010" => datar <= "0111110111010101";datai <= "1110100010010010"; --30
+ when "1000001011" => datar <= "0111110101100010";datai <= "1110011001000010"; --33
+ when "1000001100" => datar <= "0111110011100011";datai <= "1110001111110101"; --36
+ when "1000001101" => datar <= "0111110001011001";datai <= "1110000110101001"; --39
+ when "1000001110" => datar <= "0111101111000101";datai <= "1101111101100001"; --42
+ when "1000001111" => datar <= "0111101100100110";datai <= "1101110100011011"; --45
+ when "1000010000" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "1000010001" => datar <= "0111100111001000";datai <= "1101100010011001"; --51
+ when "1000010010" => datar <= "0111100100001001";datai <= "1101011001011101"; --54
+ when "1000010011" => datar <= "0111100000111111";datai <= "1101010000100100"; --57
+ when "1000010100" => datar <= "0111011101101011";datai <= "1101000111101111"; --60
+ when "1000010101" => datar <= "0111011010001101";datai <= "1100111110111111"; --63
+ when "1000010110" => datar <= "0111010110100101";datai <= "1100110110010010"; --66
+ when "1000010111" => datar <= "0111010010110010";datai <= "1100101101101010"; --69
+ when "1000011000" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "1000011001" => datar <= "0111001010101110";datai <= "1100011100100111"; --75
+ when "1000011010" => datar <= "0111000110011101";datai <= "1100010100001110"; --78
+ when "1000011011" => datar <= "0111000010000011";datai <= "1100001011111001"; --81
+ when "1000011100" => datar <= "0110111101011110";datai <= "1100000011101001"; --84
+ when "1000011101" => datar <= "0110111000110000";datai <= "1011111011011111"; --87
+ when "1000011110" => datar <= "0110110011111000";datai <= "1011110011011011"; --90
+ when "1000011111" => datar <= "0110101110110111";datai <= "1011101011011100"; --93
+ when "1000100000" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "1000100001" => datar <= "0110100100011001";datai <= "1011011011110001"; --99
+ when "1000100010" => datar <= "0110011110111100";datai <= "1011010100000101"; --102
+ when "1000100011" => datar <= "0110011001010110";datai <= "1011001100100000"; --105
+ when "1000100100" => datar <= "0110010011101000";datai <= "1011000101000001"; --108
+ when "1000100101" => datar <= "0110001101110000";datai <= "1010111101101001"; --111
+ when "1000100110" => datar <= "0110000111110000";datai <= "1010110110011000"; --114
+ when "1000100111" => datar <= "0110000001101000";datai <= "1010101111001110"; --117
+ when "1000101000" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "1000101001" => datar <= "0101110100111110";datai <= "1010100001010000"; --123
+ when "1000101010" => datar <= "0101101110011100";datai <= "1010011010011100"; --126
+ when "1000101011" => datar <= "0101100111110011";datai <= "1010010011110001"; --129
+ when "1000101100" => datar <= "0101100001000010";datai <= "1010001101001101"; --132
+ when "1000101101" => datar <= "0101011010001010";datai <= "1010000110110001"; --135
+ when "1000101110" => datar <= "0101010011001001";datai <= "1010000000011101"; --138
+ when "1000101111" => datar <= "0101001100000010";datai <= "1001111010010010"; --141
+ when "1000110000" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "1000110001" => datar <= "0100111101011101";datai <= "1001101110010100"; --147
+ when "1000110010" => datar <= "0100110110000001";datai <= "1001101000100011"; --150
+ when "1000110011" => datar <= "0100101110011101";datai <= "1001100010111010"; --153
+ when "1000110100" => datar <= "0100100110110100";datai <= "1001011101011010"; --156
+ when "1000110101" => datar <= "0100011111000011";datai <= "1001011000000011"; --159
+ when "1000110110" => datar <= "0100010111001101";datai <= "1001010010110110"; --162
+ when "1000110111" => datar <= "0100001111010000";datai <= "1001001101110010"; --165
+ when "1000111000" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "1000111001" => datar <= "0011111111000101";datai <= "1001000100000101"; --171
+ when "1000111010" => datar <= "0011110110111000";datai <= "1000111111011110"; --174
+ when "1000111011" => datar <= "0011101110100101";datai <= "1000111011000000"; --177
+ when "1000111100" => datar <= "0011100110001100";datai <= "1000110110101100"; --180
+ when "1000111101" => datar <= "0011011101101111";datai <= "1000110010100010"; --183
+ when "1000111110" => datar <= "0011010101001101";datai <= "1000101110100001"; --186
+ when "1000111111" => datar <= "0011001100100110";datai <= "1000101010101011"; --189
+ when "1001000000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "1001000001" => datar <= "0010111011001100";datai <= "1000100011011110"; --195
+ when "1001000010" => datar <= "0010110010011001";datai <= "1000100000000110"; --198
+ when "1001000011" => datar <= "0010101001100001";datai <= "1000011100111001"; --201
+ when "1001000100" => datar <= "0010100000100110";datai <= "1000011001110111"; --204
+ when "1001000101" => datar <= "0010010111101000";datai <= "1000010110111111"; --207
+ when "1001000110" => datar <= "0010001110100110";datai <= "1000010100010010"; --210
+ when "1001000111" => datar <= "0010000101100001";datai <= "1000010001101111"; --213
+ when "1001001000" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "1001001001" => datar <= "0001110011001111";datai <= "1000001101001010"; --219
+ when "1001001010" => datar <= "0001101010000010";datai <= "1000001011000111"; --222
+ when "1001001011" => datar <= "0001100000110011";datai <= "1000001001010000"; --225
+ when "1001001100" => datar <= "0001010111100010";datai <= "1000000111100011"; --228
+ when "1001001101" => datar <= "0001001110001111";datai <= "1000000110000010"; --231
+ when "1001001110" => datar <= "0001000100111010";datai <= "1000000100101011"; --234
+ when "1001001111" => datar <= "0000111011100011";datai <= "1000000011011111"; --237
+ when "1001010000" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "1001010001" => datar <= "0000101000110011";datai <= "1000000001101001"; --243
+ when "1001010010" => datar <= "0000011111011001";datai <= "1000000000111111"; --246
+ when "1001010011" => datar <= "0000010101111111";datai <= "1000000000011111"; --249
+ when "1001010100" => datar <= "0000001100100100";datai <= "1000000000001011"; --252
+ when "1001010101" => datar <= "0000000011001001";datai <= "1000000000000010"; --255
+ when "1001010110" => datar <= "1111111001101110";datai <= "1000000000000011"; --258
+ when "1001010111" => datar <= "1111110000010011";datai <= "1000000000010000"; --261
+ when "1001011000" => datar <= "1111100110111000";datai <= "1000000000101000"; --264
+ when "1001011001" => datar <= "1111011101011110";datai <= "1000000001001100"; --267
+ when "1001011010" => datar <= "1111010100000101";datai <= "1000000001111010"; --270
+ when "1001011011" => datar <= "1111001010101100";datai <= "1000000010110011"; --273
+ when "1001011100" => datar <= "1111000001010101";datai <= "1000000011110111"; --276
+ when "1001011101" => datar <= "1110110111111111";datai <= "1000000101000111"; --279
+ when "1001011110" => datar <= "1110101110101011";datai <= "1000000110100001"; --282
+ when "1001011111" => datar <= "1110100101011000";datai <= "1000001000000110"; --285
+ when "1001100000" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "1001100001" => datar <= "1110010010111001";datai <= "1000001011110010"; --291
+ when "1001100010" => datar <= "1110001001101101";datai <= "1000001101111000"; --294
+ when "1001100011" => datar <= "1110000000100011";datai <= "1000010000001000"; --297
+ when "1001100100" => datar <= "1101110111011101";datai <= "1000010010100100"; --300
+ when "1001100101" => datar <= "1101101110011001";datai <= "1000010101001010"; --303
+ when "1001100110" => datar <= "1101100101011000";datai <= "1000010111111011"; --306
+ when "1001100111" => datar <= "1101011100011011";datai <= "1000011010110110"; --309
+ when "1001101000" => datar <= "1101010011100001";datai <= "1000011101111100"; --312
+ when "1001101001" => datar <= "1101001010101011";datai <= "1000100001001101"; --315
+ when "1001101010" => datar <= "1101000001111001";datai <= "1000100100101000"; --318
+ when "1001101011" => datar <= "1100111001001011";datai <= "1000101000001101"; --321
+ when "1001101100" => datar <= "1100110000100001";datai <= "1000101011111100"; --324
+ when "1001101101" => datar <= "1100100111111100";datai <= "1000101111110110"; --327
+ when "1001101110" => datar <= "1100011111011100";datai <= "1000110011111001"; --330
+ when "1001101111" => datar <= "1100010111000000";datai <= "1000111000000111"; --333
+ when "1001110000" => datar <= "1100001110101010";datai <= "1000111100011110"; --336
+ when "1001110001" => datar <= "1100000110011000";datai <= "1001000000111111"; --339
+ when "1001110010" => datar <= "1011111110001101";datai <= "1001000101101010"; --342
+ when "1001110011" => datar <= "1011110110000110";datai <= "1001001010011111"; --345
+ when "1001110100" => datar <= "1011101110000110";datai <= "1001001111011101"; --348
+ when "1001110101" => datar <= "1011100110001011";datai <= "1001010100100100"; --351
+ when "1001110110" => datar <= "1011011110010111";datai <= "1001011001110101"; --354
+ when "1001110111" => datar <= "1011010110101000";datai <= "1001011111001110"; --357
+ when "1001111000" => datar <= "1011001111000001";datai <= "1001100100110001"; --360
+ when "1001111001" => datar <= "1011000111100000";datai <= "1001101010011101"; --363
+ when "1001111010" => datar <= "1011000000000101";datai <= "1001110000010010"; --366
+ when "1001111011" => datar <= "1010111000110010";datai <= "1001110110001111"; --369
+ when "1001111100" => datar <= "1010110001100101";datai <= "1001111100010101"; --372
+ when "1001111101" => datar <= "1010101010100000";datai <= "1010000010100011"; --375
+ when "1001111110" => datar <= "1010100011100011";datai <= "1010001000111001"; --378
+ when "1001111111" => datar <= "1010011100101101";datai <= "1010001111011000"; --381
+ when "1010000000" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "1010000001" => datar <= "1010001111011000";datai <= "1010011100101101"; --387
+ when "1010000010" => datar <= "1010001000111001";datai <= "1010100011100011"; --390
+ when "1010000011" => datar <= "1010000010100011";datai <= "1010101010100000"; --393
+ when "1010000100" => datar <= "1001111100010101";datai <= "1010110001100101"; --396
+ when "1010000101" => datar <= "1001110110001111";datai <= "1010111000110010"; --399
+ when "1010000110" => datar <= "1001110000010010";datai <= "1011000000000101"; --402
+ when "1010000111" => datar <= "1001101010011101";datai <= "1011000111100000"; --405
+ when "1010001000" => datar <= "1001100100110001";datai <= "1011001111000001"; --408
+ when "1010001001" => datar <= "1001011111001110";datai <= "1011010110101000"; --411
+ when "1010001010" => datar <= "1001011001110101";datai <= "1011011110010111"; --414
+ when "1010001011" => datar <= "1001010100100100";datai <= "1011100110001011"; --417
+ when "1010001100" => datar <= "1001001111011101";datai <= "1011101110000110"; --420
+ when "1010001101" => datar <= "1001001010011111";datai <= "1011110110000110"; --423
+ when "1010001110" => datar <= "1001000101101010";datai <= "1011111110001101"; --426
+ when "1010001111" => datar <= "1001000000111111";datai <= "1100000110011000"; --429
+ when "1010010000" => datar <= "1000111100011110";datai <= "1100001110101010"; --432
+ when "1010010001" => datar <= "1000111000000111";datai <= "1100010111000000"; --435
+ when "1010010010" => datar <= "1000110011111001";datai <= "1100011111011100"; --438
+ when "1010010011" => datar <= "1000101111110110";datai <= "1100100111111100"; --441
+ when "1010010100" => datar <= "1000101011111100";datai <= "1100110000100001"; --444
+ when "1010010101" => datar <= "1000101000001101";datai <= "1100111001001011"; --447
+ when "1010010110" => datar <= "1000100100101000";datai <= "1101000001111001"; --450
+ when "1010010111" => datar <= "1000100001001101";datai <= "1101001010101011"; --453
+ when "1010011000" => datar <= "1000011101111100";datai <= "1101010011100001"; --456
+ when "1010011001" => datar <= "1000011010110110";datai <= "1101011100011011"; --459
+ when "1010011010" => datar <= "1000010111111011";datai <= "1101100101011000"; --462
+ when "1010011011" => datar <= "1000010101001010";datai <= "1101101110011001"; --465
+ when "1010011100" => datar <= "1000010010100100";datai <= "1101110111011101"; --468
+ when "1010011101" => datar <= "1000010000001000";datai <= "1110000000100011"; --471
+ when "1010011110" => datar <= "1000001101111000";datai <= "1110001001101101"; --474
+ when "1010011111" => datar <= "1000001011110010";datai <= "1110010010111001"; --477
+ when "1010100000" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "1010100001" => datar <= "1000001000000110";datai <= "1110100101011000"; --483
+ when "1010100010" => datar <= "1000000110100001";datai <= "1110101110101011"; --486
+ when "1010100011" => datar <= "1000000101000111";datai <= "1110110111111111"; --489
+ when "1010100100" => datar <= "1000000011110111";datai <= "1111000001010101"; --492
+ when "1010100101" => datar <= "1000000010110011";datai <= "1111001010101100"; --495
+ when "1010100110" => datar <= "1000000001111010";datai <= "1111010100000101"; --498
+ when "1010100111" => datar <= "1000000001001100";datai <= "1111011101011110"; --501
+ when "1010101000" => datar <= "1000000000101000";datai <= "1111100110111000"; --504
+ when "1010101001" => datar <= "1000000000010000";datai <= "1111110000010011"; --507
+ when "1010101010" => datar <= "1000000000000011";datai <= "1111111001101110"; --510
+ when "1010101011" => datar <= "1000000000000010";datai <= "0000000011001001"; --513
+ when "1010101100" => datar <= "1000000000001011";datai <= "0000001100100100"; --516
+ when "1010101101" => datar <= "1000000000011111";datai <= "0000010101111111"; --519
+ when "1010101110" => datar <= "1000000000111111";datai <= "0000011111011001"; --522
+ when "1010101111" => datar <= "1000000001101001";datai <= "0000101000110011"; --525
+ when "1010110000" => datar <= "1000000010011111";datai <= "0000110010001100"; --528
+ when "1010110001" => datar <= "1000000011011111";datai <= "0000111011100011"; --531
+ when "1010110010" => datar <= "1000000100101011";datai <= "0001000100111010"; --534
+ when "1010110011" => datar <= "1000000110000010";datai <= "0001001110001111"; --537
+ when "1010110100" => datar <= "1000000111100011";datai <= "0001010111100010"; --540
+ when "1010110101" => datar <= "1000001001010000";datai <= "0001100000110011"; --543
+ when "1010110110" => datar <= "1000001011000111";datai <= "0001101010000010"; --546
+ when "1010110111" => datar <= "1000001101001010";datai <= "0001110011001111"; --549
+ when "1010111000" => datar <= "1000001111010111";datai <= "0001111100011010"; --552
+ when "1010111001" => datar <= "1000010001101111";datai <= "0010000101100001"; --555
+ when "1010111010" => datar <= "1000010100010010";datai <= "0010001110100110"; --558
+ when "1010111011" => datar <= "1000010110111111";datai <= "0010010111101000"; --561
+ when "1010111100" => datar <= "1000011001110111";datai <= "0010100000100110"; --564
+ when "1010111101" => datar <= "1000011100111001";datai <= "0010101001100001"; --567
+ when "1010111110" => datar <= "1000100000000110";datai <= "0010110010011001"; --570
+ when "1010111111" => datar <= "1000100011011110";datai <= "0010111011001100"; --573
+ when "1011000000" => datar <= "1000100110111111";datai <= "0011000011111011"; --576
+ when "1011000001" => datar <= "1000101010101011";datai <= "0011001100100110"; --579
+ when "1011000010" => datar <= "1000101110100001";datai <= "0011010101001101"; --582
+ when "1011000011" => datar <= "1000110010100010";datai <= "0011011101101111"; --585
+ when "1011000100" => datar <= "1000110110101100";datai <= "0011100110001100"; --588
+ when "1011000101" => datar <= "1000111011000000";datai <= "0011101110100101"; --591
+ when "1011000110" => datar <= "1000111111011110";datai <= "0011110110111000"; --594
+ when "1011000111" => datar <= "1001000100000101";datai <= "0011111111000101"; --597
+ when "1011001000" => datar <= "1001001000110111";datai <= "0100000111001110"; --600
+ when "1011001001" => datar <= "1001001101110010";datai <= "0100001111010000"; --603
+ when "1011001010" => datar <= "1001010010110110";datai <= "0100010111001101"; --606
+ when "1011001011" => datar <= "1001011000000011";datai <= "0100011111000011"; --609
+ when "1011001100" => datar <= "1001011101011010";datai <= "0100100110110100"; --612
+ when "1011001101" => datar <= "1001100010111010";datai <= "0100101110011101"; --615
+ when "1011001110" => datar <= "1001101000100011";datai <= "0100110110000001"; --618
+ when "1011001111" => datar <= "1001101110010100";datai <= "0100111101011101"; --621
+ when "1011010000" => datar <= "1001110100001111";datai <= "0101000100110011"; --624
+ when "1011010001" => datar <= "1001111010010010";datai <= "0101001100000010"; --627
+ when "1011010010" => datar <= "1010000000011101";datai <= "0101010011001001"; --630
+ when "1011010011" => datar <= "1010000110110001";datai <= "0101011010001010"; --633
+ when "1011010100" => datar <= "1010001101001101";datai <= "0101100001000010"; --636
+ when "1011010101" => datar <= "1010010011110001";datai <= "0101100111110011"; --639
+ when "1011010110" => datar <= "1010011010011100";datai <= "0101101110011100"; --642
+ when "1011010111" => datar <= "1010100001010000";datai <= "0101110100111110"; --645
+ when "1011011000" => datar <= "1010101000001011";datai <= "0101111011010111"; --648
+ when "1011011001" => datar <= "1010101111001110";datai <= "0110000001101000"; --651
+ when "1011011010" => datar <= "1010110110011000";datai <= "0110000111110000"; --654
+ when "1011011011" => datar <= "1010111101101001";datai <= "0110001101110000"; --657
+ when "1011011100" => datar <= "1011000101000001";datai <= "0110010011101000"; --660
+ when "1011011101" => datar <= "1011001100100000";datai <= "0110011001010110"; --663
+ when "1011011110" => datar <= "1011010100000101";datai <= "0110011110111100"; --666
+ when "1011011111" => datar <= "1011011011110001";datai <= "0110100100011001"; --669
+ when "1011100000" => datar <= "1011100011100100";datai <= "0110101001101101"; --672
+ when "1011100001" => datar <= "1011101011011100";datai <= "0110101110110111"; --675
+ when "1011100010" => datar <= "1011110011011011";datai <= "0110110011111000"; --678
+ when "1011100011" => datar <= "1011111011011111";datai <= "0110111000110000"; --681
+ when "1011100100" => datar <= "1100000011101001";datai <= "0110111101011110"; --684
+ when "1011100101" => datar <= "1100001011111001";datai <= "0111000010000011"; --687
+ when "1011100110" => datar <= "1100010100001110";datai <= "0111000110011101"; --690
+ when "1011100111" => datar <= "1100011100100111";datai <= "0111001010101110"; --693
+ when "1011101000" => datar <= "1100100101000110";datai <= "0111001110110101"; --696
+ when "1011101001" => datar <= "1100101101101010";datai <= "0111010010110010"; --699
+ when "1011101010" => datar <= "1100110110010010";datai <= "0111010110100101"; --702
+ when "1011101011" => datar <= "1100111110111111";datai <= "0111011010001101"; --705
+ when "1011101100" => datar <= "1101000111101111";datai <= "0111011101101011"; --708
+ when "1011101101" => datar <= "1101010000100100";datai <= "0111100000111111"; --711
+ when "1011101110" => datar <= "1101011001011101";datai <= "0111100100001001"; --714
+ when "1011101111" => datar <= "1101100010011001";datai <= "0111100111001000"; --717
+ when "1011110000" => datar <= "1101101011011000";datai <= "0111101001111100"; --720
+ when "1011110001" => datar <= "1101110100011011";datai <= "0111101100100110"; --723
+ when "1011110010" => datar <= "1101111101100001";datai <= "0111101111000101"; --726
+ when "1011110011" => datar <= "1110000110101001";datai <= "0111110001011001"; --729
+ when "1011110100" => datar <= "1110001111110101";datai <= "0111110011100011"; --732
+ when "1011110101" => datar <= "1110011001000010";datai <= "0111110101100010"; --735
+ when "1011110110" => datar <= "1110100010010010";datai <= "0111110111010101"; --738
+ when "1011110111" => datar <= "1110101011100100";datai <= "0111111000111110"; --741
+ when "1011111000" => datar <= "1110110100111000";datai <= "0111111010011100"; --744
+ when "1011111001" => datar <= "1110111110001110";datai <= "0111111011101111"; --747
+ when "1011111010" => datar <= "1111000111100100";datai <= "0111111100110111"; --750
+ when "1011111011" => datar <= "1111010000111100";datai <= "0111111101110100"; --753
+ when "1011111100" => datar <= "1111011010010110";datai <= "0111111110100110"; --756
+ when "1011111101" => datar <= "1111100011101111";datai <= "0111111111001101"; --759
+ when "1011111110" => datar <= "1111101101001010";datai <= "0111111111101001"; --762
+ when "1011111111" => datar <= "1111110110100101";datai <= "0111111111111001"; --765
+ when "1100000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100000111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100001111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100010111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100011111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100100111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100101111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1100111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101000111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101001111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101010111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101011111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101100111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101101111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110000111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110001111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110010111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110011111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110100111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110101111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111000111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111001111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111010111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111011111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111100111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111101111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when others => for i in data_width-1 downto 0 loop
+ datar(i)<='0';datai(i)<='0';end loop;
+ end case;
+
+ end if;
+
+end process;
+END behavior;
vhdl/WISHBONE_FFT/rom1.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/adder.vhd
===================================================================
--- vhdl/WISHBONE_FFT/adder.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/adder.vhd (revision 5)
@@ -0,0 +1,24 @@
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity adder is
+ generic (
+ inst_width : INTEGER := 32
+ );
+ port (
+ inst_A : in std_logic_vector(inst_width-1 downto 0);
+ inst_B : in std_logic_vector(inst_width-1 downto 0 );
+ SUM : out std_logic_vector(inst_width downto 0)
+
+ );
+ end adder;
+
+architecture oper of adder is
+ signal a_signed, b_signed, sum_signed: SIGNED(inst_width downto 0);
+begin
+ a_signed <= SIGNED(inst_A(inst_width-1) & inst_A);
+ b_signed <= SIGNED(inst_B(inst_width-1) & inst_B);
+ sum_signed <= a_signed + b_signed;
+ SUM <= std_logic_vector(sum_signed);
+end oper;
vhdl/WISHBONE_FFT/adder.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/rom2.vhd
===================================================================
--- vhdl/WISHBONE_FFT/rom2.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/rom2.vhd (revision 5)
@@ -0,0 +1,293 @@
+-- Rom file for twiddle factors
+-- ../../../rtl/vhdl/WISHBONE_FFT/rom2.vhd contains 256 points of 16 width
+-- for a 1024 point fft.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY rom2 IS
+ GENERIC(
+ data_width : integer :=16;
+ address_width : integer :=8
+ );
+ PORT(
+ clk :in std_logic;
+ address :in std_logic_vector (7 downto 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0) ;
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end rom2;
+ARCHITECTURE behavior OF rom2 IS
+
+ BEGIN
+
+process (address,clk)
+begin
+ if(rising_edge(clk)) then
+ case address is
+ when "00000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "00000001" => datar <= "0111111111011000";datai <= "1111100110111000"; --8
+ when "00000010" => datar <= "0111111101100001";datai <= "1111001101110100"; --16
+ when "00000011" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "00000100" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "00000101" => datar <= "0111110000101001";datai <= "1110000011100110"; --40
+ when "00000110" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "00000111" => datar <= "0111100010000100";datai <= "1101010011100001"; --56
+ when "00001000" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "00001001" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "00001010" => datar <= "0111000011100010";datai <= "1100001110101010"; --80
+ when "00001011" => datar <= "0110110111001001";datai <= "1011111000110010"; --88
+ when "00001100" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "00001101" => datar <= "0110011011001111";datai <= "1011001111000001"; --104
+ when "00001110" => datar <= "0110001011110001";datai <= "1010111011001101"; --112
+ when "00001111" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "00010000" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "00010001" => datar <= "0101010111110101";datai <= "1010000100101001"; --136
+ when "00010010" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "00010011" => datar <= "0100110000111111";datai <= "1001100100110001"; --152
+ when "00010100" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "00010101" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "00010110" => datar <= "0011110001010110";datai <= "1000111100011110"; --176
+ when "00010111" => datar <= "0011011010111010";datai <= "1000110001001011"; --184
+ when "00011000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "00011001" => datar <= "0010101100011111";datai <= "1000011101111100"; --200
+ when "00011010" => datar <= "0010010100101000";datai <= "1000010110000100"; --208
+ when "00011011" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "00011100" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "00011101" => datar <= "0001001011001000";datai <= "1000000101100100"; --232
+ when "00011110" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "00011111" => datar <= "0000011001001000";datai <= "1000000000101000"; --248
+ when "00100000" => datar <= "0000000000000000";datai <= "1000000000000001"; --256
+ when "00100001" => datar <= "1111100110111000";datai <= "1000000000101000"; --264
+ when "00100010" => datar <= "1111001101110100";datai <= "1000000010011111"; --272
+ when "00100011" => datar <= "1110110100111000";datai <= "1000000101100100"; --280
+ when "00100100" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "00100101" => datar <= "1110000011100110";datai <= "1000001111010111"; --296
+ when "00100110" => datar <= "1101101011011000";datai <= "1000010110000100"; --304
+ when "00100111" => datar <= "1101010011100001";datai <= "1000011101111100"; --312
+ when "00101000" => datar <= "1100111100000101";datai <= "1000100110111111"; --320
+ when "00101001" => datar <= "1100100101000110";datai <= "1000110001001011"; --328
+ when "00101010" => datar <= "1100001110101010";datai <= "1000111100011110"; --336
+ when "00101011" => datar <= "1011111000110010";datai <= "1001001000110111"; --344
+ when "00101100" => datar <= "1011100011100100";datai <= "1001010110010011"; --352
+ when "00101101" => datar <= "1011001111000001";datai <= "1001100100110001"; --360
+ when "00101110" => datar <= "1010111011001101";datai <= "1001110100001111"; --368
+ when "00101111" => datar <= "1010101000001011";datai <= "1010000100101001"; --376
+ when "00110000" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "00110001" => datar <= "1010000100101001";datai <= "1010101000001011"; --392
+ when "00110010" => datar <= "1001110100001111";datai <= "1010111011001101"; --400
+ when "00110011" => datar <= "1001100100110001";datai <= "1011001111000001"; --408
+ when "00110100" => datar <= "1001010110010011";datai <= "1011100011100100"; --416
+ when "00110101" => datar <= "1001001000110111";datai <= "1011111000110010"; --424
+ when "00110110" => datar <= "1000111100011110";datai <= "1100001110101010"; --432
+ when "00110111" => datar <= "1000110001001011";datai <= "1100100101000110"; --440
+ when "00111000" => datar <= "1000100110111111";datai <= "1100111100000101"; --448
+ when "00111001" => datar <= "1000011101111100";datai <= "1101010011100001"; --456
+ when "00111010" => datar <= "1000010110000100";datai <= "1101101011011000"; --464
+ when "00111011" => datar <= "1000001111010111";datai <= "1110000011100110"; --472
+ when "00111100" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "00111101" => datar <= "1000000101100100";datai <= "1110110100111000"; --488
+ when "00111110" => datar <= "1000000010011111";datai <= "1111001101110100"; --496
+ when "00111111" => datar <= "1000000000101000";datai <= "1111100110111000"; --504
+ when "01000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "01000001" => datar <= "0111111111110101";datai <= "1111110011011100"; --4
+ when "01000010" => datar <= "0111111111011000";datai <= "1111100110111000"; --8
+ when "01000011" => datar <= "0111111110100110";datai <= "1111011010010110"; --12
+ when "01000100" => datar <= "0111111101100001";datai <= "1111001101110100"; --16
+ when "01000101" => datar <= "0111111100001001";datai <= "1111000001010101"; --20
+ when "01000110" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "01000111" => datar <= "0111111000011101";datai <= "1110101000011110"; --28
+ when "01001000" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "01001001" => datar <= "0111110011100011";datai <= "1110001111110101"; --36
+ when "01001010" => datar <= "0111110000101001";datai <= "1110000011100110"; --40
+ when "01001011" => datar <= "0111101101011100";datai <= "1101110111011101"; --44
+ when "01001100" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "01001101" => datar <= "0111100110001001";datai <= "1101011111011010"; --52
+ when "01001110" => datar <= "0111100010000100";datai <= "1101010011100001"; --56
+ when "01001111" => datar <= "0111011101101011";datai <= "1101000111101111"; --60
+ when "01010000" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "01010001" => datar <= "0111010100000100";datai <= "1100110000100001"; --68
+ when "01010010" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "01010011" => datar <= "0111001001010100";datai <= "1100011001110100"; --76
+ when "01010100" => datar <= "0111000011100010";datai <= "1100001110101010"; --80
+ when "01010101" => datar <= "0110111101011110";datai <= "1100000011101001"; --84
+ when "01010110" => datar <= "0110110111001001";datai <= "1011111000110010"; --88
+ when "01010111" => datar <= "0110110000100011";datai <= "1011101110000110"; --92
+ when "01011000" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "01011001" => datar <= "0110100010100110";datai <= "1011011001001100"; --100
+ when "01011010" => datar <= "0110011011001111";datai <= "1011001111000001"; --104
+ when "01011011" => datar <= "0110010011101000";datai <= "1011000101000001"; --108
+ when "01011100" => datar <= "0110001011110001";datai <= "1010111011001101"; --112
+ when "01011101" => datar <= "0110000011101011";datai <= "1010110001100101"; --116
+ when "01011110" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "01011111" => datar <= "0101110010110011";datai <= "1010011110111110"; --124
+ when "01100000" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "01100001" => datar <= "0101100001000010";datai <= "1010001101001101"; --132
+ when "01100010" => datar <= "0101010111110101";datai <= "1010000100101001"; --136
+ when "01100011" => datar <= "0101001110011011";datai <= "1001111100010101"; --140
+ when "01100100" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "01100101" => datar <= "0100111010111111";datai <= "1001101100011000"; --148
+ when "01100110" => datar <= "0100110000111111";datai <= "1001100100110001"; --152
+ when "01100111" => datar <= "0100100110110100";datai <= "1001011101011010"; --156
+ when "01101000" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "01101001" => datar <= "0100010001111010";datai <= "1001001111011101"; --164
+ when "01101010" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "01101011" => datar <= "0011111100010111";datai <= "1001000010100010"; --172
+ when "01101100" => datar <= "0011110001010110";datai <= "1000111100011110"; --176
+ when "01101101" => datar <= "0011100110001100";datai <= "1000110110101100"; --180
+ when "01101110" => datar <= "0011011010111010";datai <= "1000110001001011"; --184
+ when "01101111" => datar <= "0011001111011111";datai <= "1000101011111100"; --188
+ when "01110000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "01110001" => datar <= "0010111000010001";datai <= "1000100010010101"; --196
+ when "01110010" => datar <= "0010101100011111";datai <= "1000011101111100"; --200
+ when "01110011" => datar <= "0010100000100110";datai <= "1000011001110111"; --204
+ when "01110100" => datar <= "0010010100101000";datai <= "1000010110000100"; --208
+ when "01110101" => datar <= "0010001000100011";datai <= "1000010010100100"; --212
+ when "01110110" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "01110111" => datar <= "0001110000001011";datai <= "1000001100011101"; --220
+ when "01111000" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "01111001" => datar <= "0001010111100010";datai <= "1000000111100011"; --228
+ when "01111010" => datar <= "0001001011001000";datai <= "1000000101100100"; --232
+ when "01111011" => datar <= "0000111110101011";datai <= "1000000011110111"; --236
+ when "01111100" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "01111101" => datar <= "0000100101101010";datai <= "1000000001011010"; --244
+ when "01111110" => datar <= "0000011001001000";datai <= "1000000000101000"; --248
+ when "01111111" => datar <= "0000001100100100";datai <= "1000000000001011"; --252
+ when "10000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "10000001" => datar <= "0111111110100110";datai <= "1111011010010110"; --12
+ when "10000010" => datar <= "0111111010011100";datai <= "1110110100111000"; --24
+ when "10000011" => datar <= "0111110011100011";datai <= "1110001111110101"; --36
+ when "10000100" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "10000101" => datar <= "0111011101101011";datai <= "1101000111101111"; --60
+ when "10000110" => datar <= "0111001110110101";datai <= "1100100101000110"; --72
+ when "10000111" => datar <= "0110111101011110";datai <= "1100000011101001"; --84
+ when "10001000" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "10001001" => datar <= "0110010011101000";datai <= "1011000101000001"; --108
+ when "10001010" => datar <= "0101111011010111";datai <= "1010101000001011"; --120
+ when "10001011" => datar <= "0101100001000010";datai <= "1010001101001101"; --132
+ when "10001100" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "10001101" => datar <= "0100100110110100";datai <= "1001011101011010"; --156
+ when "10001110" => datar <= "0100000111001110";datai <= "1001001000110111"; --168
+ when "10001111" => datar <= "0011100110001100";datai <= "1000110110101100"; --180
+ when "10010000" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "10010001" => datar <= "0010100000100110";datai <= "1000011001110111"; --204
+ when "10010010" => datar <= "0001111100011010";datai <= "1000001111010111"; --216
+ when "10010011" => datar <= "0001010111100010";datai <= "1000000111100011"; --228
+ when "10010100" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "10010101" => datar <= "0000001100100100";datai <= "1000000000001011"; --252
+ when "10010110" => datar <= "1111100110111000";datai <= "1000000000101000"; --264
+ when "10010111" => datar <= "1111000001010101";datai <= "1000000011110111"; --276
+ when "10011000" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "10011001" => datar <= "1101110111011101";datai <= "1000010010100100"; --300
+ when "10011010" => datar <= "1101010011100001";datai <= "1000011101111100"; --312
+ when "10011011" => datar <= "1100110000100001";datai <= "1000101011111100"; --324
+ when "10011100" => datar <= "1100001110101010";datai <= "1000111100011110"; --336
+ when "10011101" => datar <= "1011101110000110";datai <= "1001001111011101"; --348
+ when "10011110" => datar <= "1011001111000001";datai <= "1001100100110001"; --360
+ when "10011111" => datar <= "1010110001100101";datai <= "1001111100010101"; --372
+ when "10100000" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "10100001" => datar <= "1001111100010101";datai <= "1010110001100101"; --396
+ when "10100010" => datar <= "1001100100110001";datai <= "1011001111000001"; --408
+ when "10100011" => datar <= "1001001111011101";datai <= "1011101110000110"; --420
+ when "10100100" => datar <= "1000111100011110";datai <= "1100001110101010"; --432
+ when "10100101" => datar <= "1000101011111100";datai <= "1100110000100001"; --444
+ when "10100110" => datar <= "1000011101111100";datai <= "1101010011100001"; --456
+ when "10100111" => datar <= "1000010010100100";datai <= "1101110111011101"; --468
+ when "10101000" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "10101001" => datar <= "1000000011110111";datai <= "1111000001010101"; --492
+ when "10101010" => datar <= "1000000000101000";datai <= "1111100110111000"; --504
+ when "10101011" => datar <= "1000000000001011";datai <= "0000001100100100"; --516
+ when "10101100" => datar <= "1000000010011111";datai <= "0000110010001100"; --528
+ when "10101101" => datar <= "1000000111100011";datai <= "0001010111100010"; --540
+ when "10101110" => datar <= "1000001111010111";datai <= "0001111100011010"; --552
+ when "10101111" => datar <= "1000011001110111";datai <= "0010100000100110"; --564
+ when "10110000" => datar <= "1000100110111111";datai <= "0011000011111011"; --576
+ when "10110001" => datar <= "1000110110101100";datai <= "0011100110001100"; --588
+ when "10110010" => datar <= "1001001000110111";datai <= "0100000111001110"; --600
+ when "10110011" => datar <= "1001011101011010";datai <= "0100100110110100"; --612
+ when "10110100" => datar <= "1001110100001111";datai <= "0101000100110011"; --624
+ when "10110101" => datar <= "1010001101001101";datai <= "0101100001000010"; --636
+ when "10110110" => datar <= "1010101000001011";datai <= "0101111011010111"; --648
+ when "10110111" => datar <= "1011000101000001";datai <= "0110010011101000"; --660
+ when "10111000" => datar <= "1011100011100100";datai <= "0110101001101101"; --672
+ when "10111001" => datar <= "1100000011101001";datai <= "0110111101011110"; --684
+ when "10111010" => datar <= "1100100101000110";datai <= "0111001110110101"; --696
+ when "10111011" => datar <= "1101000111101111";datai <= "0111011101101011"; --708
+ when "10111100" => datar <= "1101101011011000";datai <= "0111101001111100"; --720
+ when "10111101" => datar <= "1110001111110101";datai <= "0111110011100011"; --732
+ when "10111110" => datar <= "1110110100111000";datai <= "0111111010011100"; --744
+ when "10111111" => datar <= "1111011010010110";datai <= "0111111110100110"; --756
+ when "11000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11000111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11001111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11010111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11011111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11100111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11101111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "11111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when others => for i in data_width-1 downto 0 loop
+ datar(i)<='0';datai(i)<='0';end loop;
+ end case;
+
+ end if;
+
+end process;
+END behavior;
vhdl/WISHBONE_FFT/rom2.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/.vhd
===================================================================
--- vhdl/WISHBONE_FFT/.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/.vhd (revision 5)
@@ -0,0 +1,55 @@
+
+-- hds header_start
+--1 stage shift register, data_width bits wide.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY shiftreg1 IS
+ GENERIC(
+ data_width : integer := 25
+ );
+ PORT(
+ clock : IN std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+
+-- Declarations
+
+END shiftreg1 ;
+
+-- hds interface_end
+ARCHITECTURE behavior OF shiftreg1 IS
+--signal reg00 : std_logic_vector(data_width-1 downto 0);
+BEGIN
+process(Clock,resetn)
+begin
+if (resetn='0') then
+-- for i in data_width-1 downto 0 loop
+-- r eg00(i)<='0';
+ read_data <= (others => '0');
+-- end loop;
+ elsif (Clock'event and Clock='1') then
+
+ if (enable='1') then
+
+ if(clear ='1') then
+-- reg00<=write_data;
+-- read _data<=reg00;
+ read_data <= (others => '0');
+
+ else
+ read_data <= write_data;
+
+
+ end if;
+ end if;
+ end if;
+end process;
+END behavior;
Index: vhdl/WISHBONE_FFT/rom3.vhd
===================================================================
--- vhdl/WISHBONE_FFT/rom3.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/rom3.vhd (revision 5)
@@ -0,0 +1,101 @@
+-- Rom file for twiddle factors
+-- ../../../rtl/vhdl/WISHBONE_FFT/rom3.vhd contains 64 points of 16 width
+-- for a 1024 point fft.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY rom3 IS
+ GENERIC(
+ data_width : integer :=16;
+ address_width : integer :=6
+ );
+ PORT(
+ clk :in std_logic;
+ address :in std_logic_vector (5 downto 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0) ;
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end rom3;
+ARCHITECTURE behavior OF rom3 IS
+
+ BEGIN
+
+process (address,clk)
+begin
+ if(rising_edge(clk)) then
+ case address is
+ when "000000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "000001" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "000010" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "000011" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "000100" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "000101" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "000110" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "000111" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "001000" => datar <= "0000000000000000";datai <= "1000000000000001"; --256
+ when "001001" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "001010" => datar <= "1100111100000101";datai <= "1000100110111111"; --320
+ when "001011" => datar <= "1011100011100100";datai <= "1001010110010011"; --352
+ when "001100" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "001101" => datar <= "1001010110010011";datai <= "1011100011100100"; --416
+ when "001110" => datar <= "1000100110111111";datai <= "1100111100000101"; --448
+ when "001111" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "010000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "010001" => datar <= "0111111101100001";datai <= "1111001101110100"; --16
+ when "010010" => datar <= "0111110110001001";datai <= "1110011100000111"; --32
+ when "010011" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "010100" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "010101" => datar <= "0111000011100010";datai <= "1100001110101010"; --80
+ when "010110" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "010111" => datar <= "0110001011110001";datai <= "1010111011001101"; --112
+ when "011000" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "011001" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "011010" => datar <= "0100011100011100";datai <= "1001010110010011"; --160
+ when "011011" => datar <= "0011110001010110";datai <= "1000111100011110"; --176
+ when "011100" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "011101" => datar <= "0010010100101000";datai <= "1000010110000100"; --208
+ when "011110" => datar <= "0001100011111001";datai <= "1000001001110111"; --224
+ when "011111" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "100000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "100001" => datar <= "0111101001111100";datai <= "1101101011011000"; --48
+ when "100010" => datar <= "0110101001101101";datai <= "1011100011100100"; --96
+ when "100011" => datar <= "0101000100110011";datai <= "1001110100001111"; --144
+ when "100100" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "100101" => datar <= "0000110010001100";datai <= "1000000010011111"; --240
+ when "100110" => datar <= "1110011100000111";datai <= "1000001001110111"; --288
+ when "100111" => datar <= "1100001110101010";datai <= "1000111100011110"; --336
+ when "101000" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "101001" => datar <= "1000111100011110";datai <= "1100001110101010"; --432
+ when "101010" => datar <= "1000001001110111";datai <= "1110011100000111"; --480
+ when "101011" => datar <= "1000000010011111";datai <= "0000110010001100"; --528
+ when "101100" => datar <= "1000100110111111";datai <= "0011000011111011"; --576
+ when "101101" => datar <= "1001110100001111";datai <= "0101000100110011"; --624
+ when "101110" => datar <= "1011100011100100";datai <= "0110101001101101"; --672
+ when "101111" => datar <= "1101101011011000";datai <= "0111101001111100"; --720
+ when "110000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "110111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111001" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111010" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111011" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "111111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when others => for i in data_width-1 downto 0 loop
+ datar(i)<='0';datai(i)<='0';end loop;
+ end case;
+
+ end if;
+
+end process;
+END behavior;
vhdl/WISHBONE_FFT/rom3.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/fft_pkg.vhd
===================================================================
--- vhdl/WISHBONE_FFT/fft_pkg.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/fft_pkg.vhd (revision 5)
@@ -0,0 +1,20 @@
+
+library IEEE;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+package fft_pkg is
+ type ioarray is array (integer range <>) of std_logic_vector(255 downto 0);
+ function log2(A: integer) return integer;
+end;
+
+package body fft_pkg is
+ function log2(A: integer) return integer is
+ begin
+ for I in 1 to 30 loop -- Works for up to 32 bit integers
+ if (2**I > A) then return(I-1);
+ end if;
+ end loop;
+ return(30);
+ end;
+end;
vhdl/WISHBONE_FFT/fft_pkg.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/rom4.vhd
===================================================================
--- vhdl/WISHBONE_FFT/rom4.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/rom4.vhd (revision 5)
@@ -0,0 +1,53 @@
+-- Rom file for twiddle factors
+-- ../../../rtl/vhdl/WISHBONE_FFT/rom4.vhd contains 16 points of 16 width
+-- for a 1024 point fft.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY rom4 IS
+ GENERIC(
+ data_width : integer :=16;
+ address_width : integer :=4
+ );
+ PORT(
+ clk :in std_logic;
+ address :in std_logic_vector (3 downto 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0) ;
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end rom4;
+ARCHITECTURE behavior OF rom4 IS
+
+ BEGIN
+
+process (address,clk)
+begin
+ if(rising_edge(clk)) then
+ case address is
+ when "0000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "0001" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "0010" => datar <= "0000000000000000";datai <= "1000000000000001"; --256
+ when "0011" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "0100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "0101" => datar <= "0111011001000001";datai <= "1100111100000101"; --64
+ when "0110" => datar <= "0101101010000010";datai <= "1010010101111110"; --128
+ when "0111" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "1000" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1001" => datar <= "0011000011111011";datai <= "1000100110111111"; --192
+ when "1010" => datar <= "1010010101111110";datai <= "1010010101111110"; --384
+ when "1011" => datar <= "1000100110111111";datai <= "0011000011111011"; --576
+ when "1100" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1101" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1110" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when "1111" => datar <= "0111111111111111";datai <= "0000000000000000"; --0
+ when others => for i in data_width-1 downto 0 loop
+ datar(i)<='0';datai(i)<='0';end loop;
+ end case;
+
+ end if;
+
+end process;
+END behavior;
vhdl/WISHBONE_FFT/rom4.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/BF2I.vhd
===================================================================
--- vhdl/WISHBONE_FFT/BF2I.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/BF2I.vhd (revision 5)
@@ -0,0 +1,167 @@
+
+--Butterfly stage type 1
+--7/17/02
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity BF2I is
+
+generic (
+ data_width : INTEGER :=13;
+ add_g : INTEGER :=1
+ );
+
+port (
+ fromreg_r :in std_logic_vector(data_width-1 downto 0);
+ fromreg_i :in std_logic_vector(data_width-1 downto 0);
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width-1 downto 0);
+ toreg_i :out std_logic_vector(data_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+
+end BF2I;
+
+architecture behavior of BF2I is
+signal prvs_ext_r : std_logic_vector(data_width-1 downto 0);
+signal prvs_ext_i : std_logic_vector(data_width-1 downto 0);
+signal add1_out : std_logic_vector(data_width downto 0);
+signal add2_out : std_logic_vector(data_width downto 0);
+signal sub1_out : std_logic_vector(data_width downto 0);
+signal sub2_out : std_logic_vector(data_width downto 0);
+
+component adder
+ generic (
+ inst_width:integer
+ );
+ port(
+ inst_A : in std_logic_vector(data_width-1 downto 0);
+ inst_B : in std_logic_vector(data_width-1 downto 0);
+ SUM : out std_logic_vector(data_width downto 0)
+ );
+end component;
+
+component subtract
+ generic (
+ inst_width:integer
+ );
+ port(
+ inst_A : in std_logic_vector(data_width-1 downto 0);
+ inst_B : in std_logic_vector(data_width-1 downto 0);
+ DIFF : out std_logic_vector(data_width downto 0)
+ );
+end component;
+
+component mux2_mmw
+ generic (data_width:integer);
+ port(
+ s : in std_logic;
+ in0: in std_logic_vector(data_width-1 downto 0);
+ in1: in std_logic_vector(data_width downto 0);
+ data: out std_logic_vector(data_width-1 downto 0)
+ );
+end component;
+
+begin
+
+ add1 : adder
+ generic map (
+inst_width=>data_width
+ )
+ port map (
+ inst_A=>prvs_ext_r,
+ inst_B=>fromreg_r,
+ SUM=>add1_out
+ );
+
+ add2 : adder
+ generic map (
+ inst_width=>data_width
+)
+ port map (
+ inst_A=>prvs_ext_i,
+ inst_B=>fromreg_i,
+ SUM=>add2_out
+ );
+
+ sub1 : subtract
+ generic map (
+ inst_width=>data_width
+ )
+ port map (
+ inst_A=>fromreg_r,
+ inst_B=>prvs_ext_r,
+ DIFF=>sub1_out
+ );
+
+ sub2 : subtract
+ generic map (
+ inst_width=>data_width
+ )
+ port map (
+ inst_A=>fromreg_i,
+ inst_B=>prvs_ext_i,
+ DIFF=>sub2_out
+ );
+
+ mux_1 : mux2_mmw
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ s=>s,
+ in0=>fromreg_r,
+ in1=>add1_out,
+ data=>tonext_r
+ );
+
+ mux_2 : mux2_mmw
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ s=>s,
+ in0=>fromreg_i,
+ in1=>add2_out,
+ data=>tonext_i
+ );
+
+ mux_3 : mux2_mmw
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ s=>s,
+ in0=>prvs_ext_r,
+ in1=>sub1_out,
+ data=>toreg_r
+ );
+
+ mux_4 : mux2_mmw
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ s=>s,
+ in0=>prvs_ext_i,
+ in1=>sub2_out,
+ data=>toreg_i);
+
+process(prvs_r, prvs_i)
+begin
+ if add_g=1 then
+ prvs_ext_r <= prvs_r(data_width-2) & prvs_r;
+ prvs_ext_i <= prvs_i(data_width-2) & prvs_i;
+ else
+ prvs_ext_r <= prvs_r;
+ prvs_ext_i <= prvs_i;
+ end if;
+end process;
+
+end;
+
vhdl/WISHBONE_FFT/BF2I.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/stage_II.vhd
===================================================================
--- vhdl/WISHBONE_FFT/stage_II.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/stage_II.vhd (revision 5)
@@ -0,0 +1,201 @@
+
+--Component for Stages using BF2II (second and every even stage)
+--Doesn 't handle last stage
+--Input is a stand ard logic vector of data_width-add_g
+--data_width - width of the internal busses
+-- Add growth variable - if 1, data_width gro add_g - ws by 1, if 0 then 0
+--mult_g - mult g rowth variable - can r ange from 0 to twiddle_width+1
+--twiddle_width - width of the twiddle factor input
+--shift_stages - number of shift register stages
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity stage_II is
+generic (
+ data_width : INTEGER :=14;
+ add_g : INTEGER := 1;
+ mult_g : INTEGER :=9;
+ twiddle_width : INTEGER :=10;
+ shift_stages : INTEGER := 16
+ );
+
+port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width -1-add_g downto 0);
+ t :in std_logic;
+ s :in std_logic;
+ clock : in std_logic;
+ enable : in std_logic;
+ resetn : in std_logic;
+ fromrom_r :in std_logic_vector(twiddle_width-1 downto 0);
+ fromrom_i :in std_logic_vector(twiddle_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width+mult_g-1 downto 0) ;
+ tonext_i :out std_logic_vector(data_width+mult_g-1 downto 0 )
+ );
+end stage_II;
+
+architecture structure of stage_II is
+signal toreg_r : std_logic_vector(data_width-1 downto 0);
+signal toreg_i : std_logic_vector(data_width-1 downto 0);
+signal fromreg_r : std_logic_vector(data_width-1 downto 0);
+signal fromreg_i : std_logic_vector(data_width-1 downto 0);
+signal tomult_r : std_logic_vector(data_width-1 downto 0);
+signal tomult_i : std_logic_vector(data_width-1 downto 0);
+
+signal tonext_r_aux : std_logic_vector(data_width+mult_g-1 downto 0);
+signal tonext_i_aux : std_logic_vector(data_width+mult_g-1 downto 0);
+
+component shiftregN
+ generic (
+ data_width : integer;
+ n : integer
+);
+ port (
+ clock : IN std_logic;
+ enable : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+component shiftreg1
+ generic (
+ data_width : integer
+);
+ port (
+ clock : IN std_logic;
+ enable: in std_logic;
+ clear: in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+
+component BF2II
+ generic (
+ data_width : INTEGER;
+ add_g: INTEGER
+ );
+ port (
+ fromreg_r :in std_logic_vector(data_width-1 downto 0);
+ fromreg_i :in std_logic_vector(data_width-1 downto 0);
+ prvs_r :in std_logic_vector(data_width-add_g-1 downto 0);
+ prvs_i :in std_logic_vector(data_width-add_g-1 downto 0);
+ t : in std_logic;
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width-1 downto 0);
+ toreg_i :out std_logic_vector(data_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+end component;
+
+component twiddle_mult
+ generic (
+ mult_width : INTEGER;
+ twiddle_width : INTEGER;
+ output_width : INTEGER
+);
+ port (
+ data_r :in std_logic_vector(mult_width-1 downto 0);
+ data_i :in std_logic_vector(mult_width-1 downto 0);
+ twdl_r :in std_logic_vector(twiddle_width-1 downto 0) ;
+ twdl_i :in std_logic_vector(twiddle_width-1 downto 0);
+ out_r :out std_logic_vector(output_width-1 downto 0);
+ out_i :out std_logic_vector(output_width-1 downto 0)
+ );
+end component;
+
+begin
+regr : shiftregN
+ generic map (
+ data_width=>data_width, n=>shift_stages
+)
+ port map (
+ clock=>clock,
+ enable=>enable,
+ read_data=>fromreg_r,
+ write_data=>toreg_r,
+ resetn=>resetn
+ );
+
+regi : shiftregN
+ generic map (
+ data_width=>data_width,
+ n=>shift_stages
+ )
+ port map (
+ clock=>clock,
+ enable=>enable,
+ read_data=>fromreg_i,
+ write_data=>toreg_i,
+ resetn=>resetn
+ );
+
+btrfly : BF2II
+ generic map (
+ data_width=>data_width,
+ add_g=>add_g
+ )
+ port map (
+ fromreg_r=>fromreg_r,
+ fromreg_i=>fromreg_i,
+ prvs_r=>prvs_r, prvs_i=>prvs_i,
+ t=>t,
+ s=>s,
+ toreg_r=>toreg_r,
+ toreg_i=>toreg_i,
+ tonext_r=>tomult_r,
+ tonext_i =>tomult_i
+ );
+
+twiddle : twiddle_mult
+ generic map (
+ mult_width=>data_width,
+ twiddle_width=>twiddle_width,
+ output_width=> data_width+mult_g
+ )
+ port map (
+ data_r=>tomult_r,
+ data_i=>tomult_i,
+ twdl_r=>fromrom_r,
+ twdl_i=>fromrom_i,
+ out_r=>tonext_r_aux,
+ out_i=>tonext_i_aux
+ );
+
+
+regsegr : shiftreg1
+ generic map (
+ data_width=>data_width+mult_g
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_r,
+ write_data=>tonext_r_aux,
+ resetn=>resetn
+ );
+
+regsegi : shiftreg1
+ generic map (
+ data_width=>data_width+mult_g
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_i,
+ write_data=>tonext_i_aux,
+ resetn=>resetn
+ );
+
+
+end;
vhdl/WISHBONE_FFT/stage_II.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/multiplier.vhd
===================================================================
--- vhdl/WISHBONE_FFT/multiplier.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/multiplier.vhd (revision 5)
@@ -0,0 +1,25 @@
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity multiplier is
+ generic (
+ inst_width1 : INTEGER := 16;
+ inst_width2 : INTEGER := 16
+ );
+ port (
+ inst_A : in std_logic_vector(inst_width1-1 downto 0);
+ inst_B : in std_logic_vector(inst_width2-1 downto 0);
+ PRODUCT_inst : out std_logic_vector(inst_width1 + inst_width2 - 1 downto 0)
+
+ );
+ end multiplier;
+
+architecture oper of multiplier is
+ signal mult_sig : SIGNED(inst_width1+inst_width2-1 downto 0) ;
+
+begin
+ mult_sig <= SIGNED(inst_A) * SIGNED(inst_B);
+ PRODUCT_inst <= std_logic_vector(mult_sig);
+end oper;
vhdl/WISHBONE_FFT/multiplier.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/subtract.vhd
===================================================================
--- vhdl/WISHBONE_FFT/subtract.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/subtract.vhd (revision 5)
@@ -0,0 +1,27 @@
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity subtract is
+ generic (
+ inst_width : INTEGER := 32
+ );
+ port (
+ inst_A : in std_logic_vector(inst_width-1 downto 0);
+ inst_B : in std_logic_vector(inst_width-1 downto 0);
+ DIFF : out std_logic_vector(inst_width downto 0)
+
+ );
+ end subtract;
+
+architecture oper of subtract is
+ signal a_signed, b_signed, diff_signed: SIGNED(inst_width downto 0);
+
+begin
+ a_signed <= SIGNED(inst_A(inst_width-1) & inst_A);
+ b_signed <= SIGNED(inst_B(inst_width-1) & inst_B);
+ diff_signed <= a_signed - b_signed;
+ DIFF <= std_logic_vector(diff_signed);
+end oper;
+
vhdl/WISHBONE_FFT/subtract.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/shiftregN.vhd
===================================================================
--- vhdl/WISHBONE_FFT/shiftregN.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/shiftregN.vhd (revision 5)
@@ -0,0 +1,72 @@
+-- hds header_start
+-- age shift registe -n st r, data_width bits wide.
+
+LIBRARY ieee ;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY shiftregN IS
+ GENERIC(
+ data_width : integer := 25;
+ n : integer := 254
+ );
+ PORT(
+ clock : IN std_logic;
+ enable : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+
+-- Declarations
+
+END shiftregN ;
+
+-- hds interface_end
+ARCHITECTURE behavior OF shiftregN IS
+
+type regArray is array (0 to n) of std_logic_vector(data_width-1 downto 0);
+
+signal registerFile : regArray;
+
+component shiftreg1 IS
+ GENERIC(
+ data_width : integer := 25
+ );
+ PORT(
+ clock : IN std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+
+-- Declarations
+
+END component;
+BEGIN
+
+registerFile(0)<=write_data;
+read_data<=registerFile(n);
+
+registers: for i in 0 to n-1 generate
+
+regi: shiftreg1 generic map(
+data_width=>data_width
+
+)
+port map(
+clock=>clock,
+ enable=>enable,
+ clear=>'0',
+ read_data=>registerFile(i+1),
+ write_data=>registerFile(i),
+ resetn=>resetn
+
+);
+
+end generate;
+
+END behavior;
vhdl/WISHBONE_FFT/shiftregN.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/interface_slave_fft.vhd
===================================================================
--- vhdl/WISHBONE_FFT/interface_slave_fft.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/interface_slave_fft.vhd (revision 5)
@@ -0,0 +1,191 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use ieee.math_real.all;
+--use work.fft_pkg.all;
+
+entity interface_slave_fft is
+generic(
+N: integer:=1024;
+data_wordwidth: integer:=32;
+adress_wordwidth: integer:=32;
+reg_control:integer:=0;
+reg_data:integer:=4;
+reg_status:integer:=8;
+reg_memory:integer:=12
+
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( adress_wordwidth-1 downto 0 );
+ ADR_FFT: in std_logic_vector( integer(ceil(log2(real(N))))-1 downto 0 );
+ DAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to SLAVE
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ FFT_finish_in: in std_logic;--from SLAVE
+ FFT_enable: out std_logic;--to SLAVE
+ enable_in: in std_logic;--from SLAVE
+ clear_out: out std_logic;--to SLAVE
+ clk: in std_logic
+ );
+end entity;
+
+architecture RTL of interface_slave_fft is
+
+component ramsita IS
+ PORT
+ (
+ address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
+ clock : IN STD_LOGIC := '1';
+ data : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
+ wren : IN STD_LOGIC ;
+ q : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
+ );
+END component;
+
+component RAM_Memory is
+generic(
+
+Add_WordWidth: integer;
+Data_WordWidth: integer
+);
+port(
+
+
+ DATi: in std_logic_vector( Data_WordWidth-1 downto 0 );
+ DATo: out std_logic_vector( Data_WordWidth-1 downto 0 );
+ ADR_WB: in std_logic_vector( Add_WordWidth-1 downto 0 );
+ ADR_FFT: in std_logic_vector( Add_WordWidth-1 downto 0 );
+ W_R: in std_logic;
+ clk: in std_logic
+
+ );
+end component;
+
+signal OUT_AUX,OUT_AUX1, ZERO: std_logic_vector( Data_wordwidth-1 downto 0 );
+signal ADD_aux:std_logic_vector( integer(ceil(log2(real((N+3)*4))))-1 downto 0 );
+
+signal ack_r, ack_w: std_logic;
+
+begin
+
+ OUT_AUX<=DAT_I;
+ ZERO<=std_logic_vector(to_unsigned(0,Data_wordwidth));
+
+
+
+ ACK_O<=ack_r or ack_w;
+
+ --Reconocimiento de escritura sin estado de espera
+ ack_w<= '1' when (STB_I='1' and WE_I='1') else '0';
+
+
+
+ --Reconocimiento de lectura con 1 estado de espera, caso RAM sincrona
+ process(clk)
+
+ begin
+ if(rising_edge(clk)) then
+ if(STB_I='1' and WE_I='0') then
+
+ ack_r<='1';
+ else
+ ack_r<='0';
+
+ end if;
+ end if;
+
+ end process;
+
+
+ --Se elimina offset para direcciones de lectura de memoria RAM
+ ADD_aux<=std_logic_vector(unsigned(ADR_I(integer(ceil(log2(real((N+3)*4))))-1 downto 0))-(reg_memory));
+
+ RAM: RAM_Memory
+generic map(
+
+Add_WordWidth=>integer(ceil(log2(real(N)))),
+Data_WordWidth=>Data_WordWidth
+)
+port map(
+
+
+ DATi=>sDAT_I,
+ DATo=>OUT_AUX1,
+ --Divide entre cuatro, direcciones alineadas cada 4 bytes
+ ADR_WB=>ADD_aux(integer(ceil(log2(real((N)))))+1 downto 2),
+ ADR_FFT=>ADR_FFT(integer(ceil(log2(real(N))))-1 downto 0),
+ W_R=>enable_in,
+ clk=>clk
+ );
+
+
+ --Decodificador de escritura
+ process(ADR_I,STB_I,WE_I,ZERO,OUT_AUX,OUT_AUX1,FFT_finish_in)
+ begin
+
+
+ if (WE_I='1' and STB_I='1') then--ESCRIBIR EN FFT
+ case ADR_I(integer(ceil(log2(real((N+3)*4))))-1 downto 0) is
+
+ when std_logic_vector(to_unsigned(Reg_control,integer(ceil(log2(real((N+3)*4)))))) =>
+ clear_out<='1';
+ FFT_enable<='1';
+ sDAT_O<=ZERO;
+ when std_logic_vector(to_unsigned(Reg_data,integer(ceil(log2(real((N+3)*4))))))=>
+ sDAT_O<=OUT_AUX;
+ FFT_enable<='1';
+ clear_out<='0';
+
+ when OTHERS => sDAT_O<=ZERO;
+ clear_out<='0';
+ FFT_enable<='0';
+ end case;
+
+ else
+ sDAT_O<=ZERO;
+ clear_out<='0';
+ FFT_enable<='0';
+ end if;
+
+
+
+ end process;
+
+ --Decodificador de lectura
+ process(ADR_I,STB_I,WE_I,ZERO,OUT_AUX,OUT_AUX1,FFT_finish_in)
+ begin
+
+
+
+ if (WE_I='0' and STB_I='1') then
+
+
+
+ if ADR_I(integer(ceil(log2(real((N+3)*4))))-1 downto 0) = std_logic_vector(to_unsigned(Reg_status,integer(ceil(log2(real((N+3)*4)))))) then
+
+ DAT_O(0)<=FFT_finish_in;
+ DAT_O(Data_wordwidth-1 downto 1)<=ZERO(Data_wordwidth-1 downto 1);
+ else
+ DAT_O<=OUT_AUX1;
+
+ end if;
+
+ else
+ DAT_O<=ZERO;
+ end if;
+
+end process;
+
+
+
+end architecture;
+
+
+
vhdl/WISHBONE_FFT/interface_slave_fft.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/BF2II.vhd
===================================================================
--- vhdl/WISHBONE_FFT/BF2II.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/BF2II.vhd (revision 5)
@@ -0,0 +1,135 @@
+--Butterfly stage type 2
+--7/17/0 2
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity BF2II is
+
+generic ( data_width : INTEGER :=13;
+ add_g: INTEGER :=1
+ );
+
+port ( fromreg_r :in std_logic_vector(data_width-1 downto
+0 );
+ fromreg_i :in std_logic_vector(data_width-1 downto
+0) ;
+ prvs_r :in std_logic_vector(data_width-1-add_g downto
+0) ;
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ t : in std_logic;
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width -1 downto 0);
+
+ toreg_i :out std_logic_vector(data_width -1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+
+end BF2II;
+
+architecture behavior of BF2II is
+signal prvs_ext_r : std_logic_vector(data_width-1 downto 0);
+signal prvs_ext_i : std_logic_vector(data_width-1 downto 0);
+signal add1_out : std_logic_vector(data_width downto 0);
+signal add2_out : std_logic_vector(data_width downto 0);
+signal sub1_out : std_logic_vector(data_width downto 0);
+signal sub2_out : std_logic_vector(data_width downto 0);
+signal swapadd : std_logic_vector(data_width downto 0);
+signal swapsub : std_logic_vector(data_width downto 0);
+
+component adder
+ generic (inst_width:integer);
+ port(
+ inst_A : in std_logic_vector( data_width-1 downto 0);
+ inst_B : in std_logic_vector( data_width-1 downto 0);
+ SUM : out std_logic_vector(data_width downto 0)
+ );
+end component;
+
+component subtract
+ generic (inst_width:integer);
+ port(
+ inst_A : in std_logic_vector(data_width-1 downto 0);
+ inst_B : in std_logic_vector(data_width-1 downto 0);
+ DIFF : out std_logic_vector(data_width downto 0)
+ );
+end component;
+
+component mux2_mmw
+ generic (data_width:integer);
+ port(
+ s : in std_logic;
+ in0: in std_logic_vector(data_width-1 downto 0);
+ in1: in std_logic_vector(data_width downto 0);
+ data: out std_logic_vector(data_width-1 downto 0)
+ );
+end component;
+
+begin
+
+ add1 : adder
+ generic map (inst_width=>data_width)
+ port map (inst_A=>prvs_ext_r, inst_B=>fromreg_r, SUM=>add1_out);
+
+ add2 : adder
+ generic map (inst_width=>data_width)
+ port map (inst_A=>prvs_ext_i, inst_B=>fromreg_i, SUM=>add2_out);
+
+ sub1 : subtract
+ generic map (inst_width=>data_width)
+ port map (inst_A=>fromreg_r, inst_B=>prvs_ext_r, DIFF=>sub1_out);
+
+ sub2 : subtract
+ generic map (inst_width=>data_width)
+ port map (inst_A=>fromreg_i, inst_B=>prvs_ext_i, DIFF=>sub2_out);
+
+ mux_1 : mux2_mmw
+ generic map (data_width=>data_width)
+ port map (s=>s, in0=>fromreg_r, in1=>add1_out, data=>tonext_r);
+
+ mux_2 : mux2_mmw
+ generic map (data_width=>data_width)
+ port map (s=>s, in0=>fromreg_i, in1=>swapadd, data=>tonext_i);
+
+ mux_3 : mux2_mmw
+ generic map (data_width=>data_width)
+ port map (s=>s, in0=>prvs_ext_r, in1=>sub1_out, data=>toreg_r);
+
+ mux_4 : mux2_mmw
+ generic map (data_width=>data_width)
+ port map (s=>s, in0=>prvs_ext_i, in1=>swapsub, data=>toreg_i);
+process(prvs_r,prvs_i,s,t)
+begin
+ if add_g=1 then
+ if (t='0' and s='1') then
+ prvs_ext_r <= prvs_i(data_width-2) & prvs_i;
+ prvs_ext_i <= prvs_r(data_width-2) & prvs_r;
+ else
+ prvs_ext_r <= prvs_r(data_width-2) & prvs_r;
+ prvs_ext_i <= prvs_i(data_width-2) & prvs_i;
+ end if;
+ else
+ if (t='0' and s='1') then
+ prvs_ext_r <= prvs_i;
+ prvs_ext_i <= prvs_r;
+ else
+ prvs_ext_r <= prvs_r;
+ prvs_ext_i <= prvs_i;
+ end if;
+ end if;
+end process;
+
+process(add2_out, sub2_out, s, t)
+begin
+ if (t='0' and s='1') then
+ swapadd<=sub2_out;
+ swapsub<=add2_out;
+ else
+ swapadd<=add2_out;
+ swapsub<=sub2_out;
+ end if;
+end process;
+end;
vhdl/WISHBONE_FFT/BF2II.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/shiftreg1.vhd
===================================================================
--- vhdl/WISHBONE_FFT/shiftreg1.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/shiftreg1.vhd (revision 5)
@@ -0,0 +1,55 @@
+
+-- hds header_start
+--1 stage shift register, data_width bits wide.
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+USE ieee.std_logic_arith.ALL;
+
+
+ENTITY shiftreg1 IS
+ GENERIC(
+ data_width : integer := 25
+ );
+ PORT(
+ clock : IN std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+
+-- Declarations
+
+END shiftreg1 ;
+
+-- hds interface_end
+ARCHITECTURE behavior OF shiftreg1 IS
+--signal reg00 : std_logic_vector(data_width-1 downto 0);
+BEGIN
+process(Clock,resetn)
+begin
+if (resetn='0') then
+-- for i in data_width-1 downto 0 loop
+-- r eg00(i)<='0';
+ read_data <= (others => '0');
+-- end loop;
+ elsif (Clock'event and Clock='1') then
+
+ if (enable='1') then
+
+ if(clear ='1') then
+-- reg00<=write_data;
+-- read _data<=reg00;
+ read_data <= (others => '0');
+
+ else
+ read_data <= write_data;
+
+
+ end if;
+ end if;
+ end if;
+end process;
+END behavior;
vhdl/WISHBONE_FFT/shiftreg1.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/fft_core_pipeline1.vhd
===================================================================
--- vhdl/WISHBONE_FFT/fft_core_pipeline1.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/fft_core_pipeline1.vhd (revision 5)
@@ -0,0 +1,547 @@
+-- N point FFT
+-- Uses R2^2SDF algorithm
+--
+-- Generics used:
+-- N - number of points taken - powers of 2 only, ranging f 8 to 1024 points.
+-- input_ width - bit width of the input vector
+-- twiddle width - width of the twiddle factors stored in the ROM
+-- add_g - Adder growth - Adders grow 0 or 1 bits each time they are used
+-- Exculdes adders in the complex multiplier (that is handled by mult_g)
+-- mult_g - multiplier growth - 0 to twiddle_width+ 1 - Growth during the complex
+-- multiplier stages
+--
+-- Width of output vector is as follows (num_stages=log2(N):
+-- N width
+-- 8,16 input_width + (num_stages * add_g) + mult_g
+-- 32,64 input_width + (num_ stages * add_g) + 2*mult_g
+-- 128,256 input_width + (num_stage s * add_g) + 3*mult_g
+-- 512,1024 input_width + (num_stages * add_g) + 4*mult_g
+--
+-- Due to the way this system was made parameterizable, there are many signals
+-- that will remain unconnected. This is normal.
+--
+-- Default generics are for a simple 64 point FFT
+
+-- Each stage with complex multiplier introduces a 1/2 gain
+
+--Changes made by Alex-Parrado to the original version of Adam Robert Miller
+
+ --Pipeline registers and clock enables, have been added. Clock frequency above of 100 MHz for all FFT sizes
+
+ --Synchronous ROMs for proper RAM block inferring. MATLAB scripts have been modified.
+
+
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.ALL;
+
+USE ieee.numeric_std.ALL;
+--USE ieee.std_logic_arith.ALL;
+use ieee.math_real.all;
+use work.fft_pkg .all;
+
+entity fft_core_pipeline1 is
+ generic (
+ input_width : integer :=16;
+ twiddle_width : integer :=16;
+ N : integer :=1024;
+ add_g : integer:=0;--1; --Either 0 or 1 only.
+ mult_g : integer:=0--9 --Can be any number from 0 to twiddle_width+1
+ );
+ port ( clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ enable_out: out std_logic;
+ frame_ready: out std_logic;
+ index : out std_logic_vector(integer(ceil(log2(real((N)))))-1 downto 0);
+ xin_r : in std_logic_vector(input_width-1 downto 0);
+ xin_i : in std_logic_vector(input_width-1 downto 0);
+ Xout_r : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0);
+ Xout_i : out std_logic_vector (input_width+((integer(ceil(log2(real((N)))))-1)/2)*mult_g+integer(ceil(log2(real((N)))))*add_g-1 downto 0)
+ );
+end fft_core_pipeline1;
+
+architecture structure of fft_core_pipeline1 is
+--Signal declarations
+constant num_stages: integer :=integer(ceil(log2(real((N)))));
+signal control: std_logic_vector(num_stages-1 downto 0);
+signal bit_reverse_index: std_logic_vector(num_stages-1 downto 0);
+type stage_array is array (1 to num_stages-1) of
+ std_logic_vector(input_width+(num_stages*add_g)+(((num_stages-1)/2)*mult_g)-1 downto 0);
+signal stoscon_r: stage_array;
+signal stoscon_i: stage_array;
+type rom_array is array (1 to (num_stages-1)/2) of std_logic_vector(twiddle_width-1 downto 0);
+signal rtoscon_r: rom_array;
+signal rtoscon_i: rom_array;
+
+type enables_array is array (0 to num_stages+1) of std_logic_vector(0 downto 0);
+signal enables: enables_array;
+
+
+type counter_registers_array is array (0 to num_stages+1) of std_logic_vector(num_stages-1 downto 0);
+signal counter_registers: counter_registers_array;
+
+--
+
+signal xin_r_reg : std_logic_vector(input_width-1 downto 0);
+signal xin_i_reg : std_logic_vector(input_width-1 downto 0);
+
+signal t_ff: std_logic_vector(0 downto 0);
+signal en_t_ff:std_logic_vector(0 downto 0);
+signal clear_t_ff:std_logic;
+
+
+--component declarations
+component counterhle
+ generic (width : integer);
+
+ port ( clock : in std_logic;
+ resetn : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ countout : out std_logic_vector(width-1 downto 0)
+ );
+end component;
+
+component rom1
+ generic (
+ data_width : integer;
+ address_width : integer);
+ port (
+ clk: in std_logic;
+ address: IN std_logic_vector (address_width-1 DOWNTO 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end component;
+
+component rom2
+ generic (
+ data_width : integer;
+ address_width : integer);
+ port (
+ clk: in std_logic;
+ address : IN std_logic_vector (address_width-1 DOWNTO 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end component;
+
+component rom3
+ generic (
+ data_width : integer;
+ address_width : integer);
+ port (
+ clk: in std_logic;
+ address : IN std_logic_vector (address_width-1 DOWNTO 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end component;
+
+component rom4
+ generic (
+ data_width : integer;
+ address_width : integer);
+ port (
+ clk: in std_logic;
+ address : IN std_logic_vector (address_width-1 DOWNTO 0);
+ datar : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ datai : OUT std_logic_vector (data_width-1 DOWNTO 0)
+ );
+end component;
+
+component stage_I
+ generic (
+ data_width : INTEGER;
+ add_g : INTEGER;
+ shift_stages : INTEGER);
+ port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ s :in std_logic;
+ clock : in std_logic;
+ enable: in std_logic;
+ resetn : in std_logic;
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0));
+end component;
+
+component stage_II
+ generic (
+ data_width : INTEGER;
+ add_g : INTEGER;
+ mult_g : INTEGER;
+ twiddle_width : INTEGER;
+ shift_stages : INTEGER
+ );
+ port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0) ;
+ t :in std_logic;
+ s :in std_logic;
+ clock : in std_logic;
+ enable: in std_logic;
+ resetn : in std_logic;
+ fromrom_r :in std_logic_vector (twiddle_width-1 downto 0) ;
+ fromrom_i :in std_logic_vector(twiddle_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width+mult_g-1 downto 0);
+ tonext_i :out std_logic_vector(data_width+mult_g-1 downto 0));
+end component;
+
+component stage_I_last
+ generic (
+ data_width : INTEGER;
+ add_g : INTEGER
+ );
+ port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ s :in std_logic; clock : in std_logic; resetn : in std_logic;
+ enable: in std_logic;
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0));
+end component;
+
+component stage_II_last
+ generic (
+ data_width : INTEGER;
+ add_g : INTEGER
+ );
+ port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ t :in std_logic;
+ s :in std_logic;
+ clock : in std_logic;
+ enable: in std_logic;
+ resetn : in std_logic;
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0));
+end component;
+
+component shiftreg1
+ generic (
+ data_width : integer
+);
+ port (
+ clock : IN std_logic;
+ enable: in std_logic;
+ clear: in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+begin
+
+controller : component counterhle
+ generic map (
+ width=>num_stages
+)
+ port map (
+ clock=>clock,
+ resetn=>resetn,
+ clear => clear,
+ enable=>enable,
+ countout=>control
+ );
+
+
+-- Counter, pipeline registers
+counter_registers(0)<=control;
+forcounterregs: for i in 0 to num_stages generate
+counterregi: shiftreg1
+generic map(
+ data_width=>num_stages
+)
+ port map (
+ clock=>clock,
+ enable=>'1',
+ clear => clear,
+ read_data=>counter_registers(i+1),
+ write_data=>counter_registers(i),
+ resetn=>resetn
+ );
+
+end generate;
+
+
+--Enable, pipeline registers
+enables(0)(0)<=enable;
+forenablesregs: for i in 0 to num_stages generate
+enableregi: shiftreg1
+generic map(
+ data_width=>1
+)
+ port map (
+ clock=>clock,
+ enable=>'1',
+ clear => clear,
+ read_data=>enables(i+1),
+ write_data=>enables(i),
+ resetn=>resetn
+ );
+
+end generate;
+
+
+
+--Input registers
+reginputr: shiftreg1
+generic map(
+ data_width=>input_width
+)
+ port map (
+ clock=>clock,
+ enable=>'1',
+ clear => '0',
+ read_data=>xin_r_reg,
+ write_data=>xin_r,
+ resetn=>resetn
+ );
+
+reginputi: shiftreg1
+generic map(
+ data_width=>input_width
+)
+ port map (
+ clock=>clock,
+ enable=>'1',
+ clear => '0',
+ read_data=>xin_i_reg,
+ write_data=>xin_i,
+ resetn=>resetn
+ );
+
+
+stages : for i in 1 to num_stages generate
+-- constan ity : in r :=i rem 2; t par tege
+-- constant shift_stages : integer := 2**(num_stages - i);
+-- consta nt rom_loc : integer :=i/2;
+-- constant data_width : integer :=input_width + (i*add_g) + (((i-1)/2)*mult_g);
+-- constant s: integer : =(num_stages-i);
+-- constant t : integer :=(num_stages-i+1);
+ initial_stage: if i=1 generate
+ initial_stage_I : component stage_I
+ generic map (
+ data_width=>input_width + (i*add_g)+(((i-1)/2)*mult_g),
+ add_g=>add_g,
+ shift_stages=>2**(num_stages - i))
+ port map (
+ prvs_r=>xin_r_reg,prvs_i=>xin_i_reg,s=>counter_registers(i)((num_stages-i)),
+ clock=>clock,
+ enable=>enables(i)(0),
+ resetn=>resetn,
+ tonext_r=>stoscon_r(i)(input_width+(i*add_g) + (( (i-1)/2)*mult_g)-1 downto 0),
+ tonext_i=>stoscon_i(i)(input_width+ (i*add_g) + (( (i-1)/2)*mult_g)-1 downto 0));
+ end generate initial_stage;
+
+ even_stages: if ((i rem 2)=0) and (i/=num_stages) generate
+ inner_stage_II : component stage_II
+ generic map (
+ data_width=>input_width + (i*add_g) + (((i-1)/2)*mult_g),
+ add_g=>add_g,mult_g=>mult_g,
+ twiddle_width=>twiddle_width,
+ shift_stages=>2**(num_stages - i)
+ )
+ port map (
+ prvs_r=>stoscon_r(i-1)(input_width + (i*add_g) + (((i -1)/2)*mult_g)-1-add_g downto 0),
+ prvs_i=>stoscon_i(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ t=>counter_registers(i)((num_stages-i+1)),
+ s=>counter_registers(i)((num_stages-i)),clock=>clock,resetn=>resetn,
+ enable=>enables(i)(0),
+ fromrom_r=>rtoscon_r(i/2),fromrom_i=>rtoscon_i(i/2),
+ tonext_r=>stoscon_r(i)(input_width + (i*add_g) + (((i-1)/2)*mult_g)+mult_g-1 downto 0),
+ tonext_i=>stoscon_i(i)(input_width + (i*add_g) + (((i-1)/2)*mult_g)+mult_g-1 downto 0)
+ );
+
+ first_rom: if (i/2)=1 generate
+ rom_1 : component rom1
+
+ generic map (
+ data_width=>twiddle_width,
+ address_width=>(num_stages-i+1)+1
+ )
+ port map (
+ clk=>clock,
+ address=>counter_registers(i-1)((num_stages-i+1) downto 0 ),
+ datar=>rtoscon_r(i/2),datai=>rtoscon_i(i/2));
+ end generate first_rom;
+
+ second_rom: if (i/2)=2 generate
+ rom_2 : component rom2
+ generic map (
+ data_width=>twiddle_width,
+ address_width=>(num_stages-i+1)+1
+ )
+ port map (
+ clk=>clock,
+ address=>counter_registers(i-1)((num_stages-i+1 ) downto 0),
+ datar=>rtoscon_r(i/2),datai=>rtoscon_i(i/2)
+ );
+ end generate second_rom;
+
+ third_rom: if (i/2)=3 generate
+ rom_3 : component rom3
+ generic map (
+
+ data_width =>twiddle_width,
+ address_width=>(num_stages-i+1)+1
+ )
+ port map (
+ clk=>clock,
+ address=>counter_registers(i-1)((num_stages-i+1) downto 0),
+ datar=>rtoscon_r(i/2),datai=>rtoscon_i(i/2)
+ );
+ end generate third_rom;
+
+ fourth_rom: if (i/2)=4 generate
+ rom_4 : component rom4
+ generic map (
+ data_width=>twiddle_width,
+ address_width=>(num_stages-i+1)+1
+ )
+ port map (
+ clk=>clock,
+ address=>counter_registers(i-1)((num_stages-i+1) downto 0),
+ datar=>rtoscon_r(i/2),datai=>rtoscon_i(i/2)
+ );
+ end generate fourth_rom;
+
+ end generate even_stages;
+
+
+
+ odd_stages: if (((i rem 2)=1) and (i/=num_stages)) and (i/=1)
+ generate
+ inner_stage_I : component stage_I
+ generic map (
+ data_width=>input_width + (i*add_g) + (((i-1)/2)*mult_g),
+ add_g=>add_g,
+ shift_stages=>2**(num_stages - i)
+ )
+ port map (
+ prvs_r=>stoscon_r(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ prvs_i=>stoscon_i(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ s=>counter_registers(i)( (num_stages-i)),
+ enable=>enables(i)(0),
+ clock=>clock,
+ resetn=>resetn,
+ tonext_r=>stoscon_r(i)(input_width+ (i*add_g) + ( ((i -1)/2)*mult_g)-1 downto 0),
+ tonext_i=>stoscon_i(i)(input_width + (i*add_g) + ( ((i- 1)/2)*mult_g)-1 downto 0)
+ );
+ end generate odd_stages;
+
+ end_on_even: if (i=num_stages) and ((i rem 2)=0) generate
+ last_stage_II : component stage_II_last
+ generic map (
+ data_width=>input_width + (i*add_g) + (((i-1)/2)*mult_g),
+ add_g=>add_g
+ )
+ port map (
+ prvs_r=>stoscon_r(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ prvs_i=>stoscon_i(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ t=>counter_registers(i)((num_stages-i+1)),
+ s=>counter_registers(i)((num_stages-i)),clock=>clock ,
+ resetn=>resetn,
+ enable=>enables(i)(0),
+ tonext_r=>Xout_r,
+ tonext_i=>Xout_i
+ );
+ end generate end_on_even;
+
+ end_on_odd: if (i=num_stages) and ((i rem 2)=1) generate
+ last_stage_I : component stage_I_last
+ generic map (
+ data_width=>input_width + (i*add_g) + (((i-1)/2)*mult_g), add_g=>add_g
+ )
+ port map (
+ prvs_r=>stoscon_r(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ prvs_i=>stoscon_i(i-1)(input_width + (i*add_g) + (((i-1)/2)*mult_g)-1-add_g downto 0),
+ s=>counter_registers(i)( (num_stages-i)),
+ clock=>clock,
+ enable=>enables(i)(0),
+ resetn=>resetn,
+ tonext_r=>Xout_r,
+ tonext_i=>Xout_i
+ );
+
+
+ end generate end_on_odd;
+
+end generate stages;
+
+--Frequency bin with bit reversal
+bit_reverse_index<=std_logic_vector(unsigned(counter_registers(num_stages+1))+1);
+
+bit_reverse: for i in 0 to num_stages-1 generate
+ index(i)<=bit_reverse_index(num_stages-1-i);
+
+end generate;
+
+
+--T flip-flop for enable_out generation control
+
+tff: shiftreg1 generic map(
+ data_width=>1
+)
+ port map (
+ clock=>clock,
+ enable=>((en_t_ff(0) or clear_t_Ff) and enables(num_stages)(0)) or clear,
+ clear => clear or clear_t_ff,
+ read_data=>t_ff,
+ write_data=>en_t_ff,
+ resetn=>resetn
+ );
+
+
+
+en_t_ff(0)<= '1' when (unsigned(counter_registers(num_stages+1))=(N-1)) else '0';
+clear_t_ff <= '1' when (unsigned(counter_registers(num_stages+1))=(N-1) and t_ff(0)='1') else '0';
+
+--Enable out includes pipeline latency
+enable_out<=enables(num_stages+1)(0) when (t_ff="1") else '0' ;
+
+
+--Frame ready, falling edge detector
+
+process(resetn,clock)
+ variable detect : std_ulogic_vector (1 downto 0);
+ begin
+ if resetn ='0' then
+ detect := "00";
+
+ elsif rising_edge(clock) then
+
+ if (clear ='1') then
+
+ frame_ready<='0';
+
+ else
+
+ detect(1) := detect(0); -- record last value of sync in detect(1)
+ detect(0) := t_ff(0) ; --record current sync in detect(0)
+
+ if detect = "01" then -- rising_edge
+
+ frame_ready<='0';
+
+ elsif detect = "10" then --falling_edge
+
+frame_ready<='1';
+
+
+ end if;
+
+ end if;
+
+ end if;
+end process;
+
+
+
+
+end;
vhdl/WISHBONE_FFT/fft_core_pipeline1.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/twiddle_mult.vhd
===================================================================
--- vhdl/WISHBONE_FFT/twiddle_mult.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/twiddle_mult.vhd (revision 5)
@@ -0,0 +1,67 @@
+
+--Twiddle multiplier
+--7/17/02
+--Uses a both inputs same width complex multiplier
+--Won't sign extend output, but will truncate it down
+--(mult_width + twiddle_width >= output_width)
+--
+--Twiddle factors are limited to -1 < twdl < 1.
+--(twiddle factor can't be 0b1000000000)
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+
+entity twiddle_mult is
+
+generic (
+ mult_width : INTEGER := 7;
+ twiddle_width : INTEGER :=3;
+ output_width : INTEGER :=9
+ );
+
+port ( data_r :in std_logic_vector(mult_width-1 downto 0);
+ data_i :in std_logic_vector(mult_width-1 downto 0);
+ twdl_r :in std_logic_vector(twiddle_width-1 downto 0);
+ twdl_i :in std_logic_vector(twiddle_width-1 downto 0);
+ out_r :out std_logic_vector(output_width-1 downto 0);
+
+ out_i :out std_logic_vector(output_width-1 downto 0)
+ );
+
+end twiddle_mult;
+
+architecture behavior of twiddle_mult is
+signal mult_out_r : std_logic_vector(twiddle_width + mult_width downto 0);
+signal mult_out_i : std_logic_vector(twiddle_width + mult_width downto 0);
+
+component comp_mult
+ generic ( inst_width1:integer;
+ inst_width2:integer );
+ port ( Re1 : in std_logic_vector(inst_width1-1 downto 0);
+ Im1 : in std_logic_vector(inst_width1-1 downto 0);
+ Re2 : in std_logic_vector(inst_width2-1 downto 0);
+ Im2 : in std_logic_vector(inst_width2-1 downto 0);
+ Re : out std_logic_vector(inst_width1 + inst_width2
+downto 0);
+ Im : out std_logic_vector(inst_width1 + inst_width2
+downto 0)
+
+ ) ;
+
+end component;
+
+begin
+
+ U1 : comp_mult
+ generic map(
+ inst_width1 => mult_width, inst_width2 => twiddle_width)
+ port map (Re1=>data_r, Im1=>data_i, Re2=>twdl_r, Im2=>twdl_i,
+Re=>mult_out_r, Im=>mult_out_i);
+
+ process(mult_out_r,mult_out_i)
+ begin
+ out_r <= mult_out_r((twiddle_width+mult_width-1) downto (twiddle_width+mult_width-output_width));
+ out_i <= mult_out_i((twiddle_width+mult_width-1) downto (twiddle_width+mult_width-output_width));
+
+ end process;
+end;
vhdl/WISHBONE_FFT/twiddle_mult.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FFT/stage_I_last.vhd
===================================================================
--- vhdl/WISHBONE_FFT/stage_I_last.vhd (nonexistent)
+++ vhdl/WISHBONE_FFT/stage_I_last.vhd (revision 5)
@@ -0,0 +1,141 @@
+--Component for Stages using BF2I (if BF2I is the last stage)
+--Input is a standard logic vector of data_width-add_g
+--data_width - width of the internal busses
+--add_g - Add growth variable - if 1, data_width grows by 1, if 0 then 0
+--Only 1 shift stage
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+
+entity stage_I_last is
+generic (
+ data_width : INTEGER :=13;
+ add_g : INTEGER := 1
+ );
+port (
+ prvs_r :in std_logic_vector(data_width-1-add_g downto 0);
+ prvs_i :in std_logic_vector(data_width-1-add_g downto 0);
+ s :in std_logic;
+ clock : in std_logic;
+ enable : in std_logic;
+ resetn : in std_logic;
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector(data_width-1 downto 0)
+ );
+end stage_I_last;
+
+architecture structure of stage_I_last is
+signal toreg_r : std_logic_vector(data_width-1 downto 0);
+signal toreg_i : std_logic_vector(data_width-1 downto 0);
+signal fromreg_r : std_logic_vector(data_width-1 downto 0);
+signal fromreg_i: std_logic_vector(data_width -1 downto 0);
+
+signal tonext_r_aux : std_logic_vector(data_width-1 downto 0);
+signal tonext_i_aux : std_logic_vector(data_width-1 downto 0);
+
+component shiftreg1
+ generic (
+ data_width : integer
+);
+ port (
+ clock : IN std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ read_data : OUT std_logic_vector (data_width-1 DOWNTO 0);
+ write_data : IN std_logic_vector (data_width-1 DOWNTO 0);
+ resetn : IN std_logic
+ );
+end component;
+
+component BF2I
+ generic (
+ data_width : INTEGER;
+ add_g: INTEGER
+);
+ port (
+ fromreg_r :in std_logic_vector(data_width-1 downto 0);
+ fromreg_i :in std_logic_vector(data_width -1 downto 0);
+ prvs_r :in std_logic_vector(data_width-add_g-1 downto 0) ;
+ prvs_i :in std_logic_vector(data_width-add_g-1 downto 0) ;
+ s : in std_logic;
+ toreg_r :out std_logic_vector(data_width-1 downto 0);
+ toreg_i :out std_logic_vector(data_width-1 downto 0);
+ tonext_r :out std_logic_vector(data_width-1 downto 0);
+ tonext_i :out std_logic_vector( data_width-1 downto 0)
+ );
+end component;
+
+begin
+regr : shiftreg1
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ clock=>clock,
+ enable=>enable,
+ clear =>'0',
+ read_data=>fromreg_r,
+ write_data=>toreg_r,
+ resetn=>resetn
+ );
+regi : shiftreg1
+ generic map (
+ data_width=>data_width
+ )
+ port map (
+ clock=>clock,
+ enable=>enable,
+ clear =>'0',
+ read_data=>fromreg_i,
+ write_data=>toreg_i,
+ resetn=>resetn
+ );
+btrfly : BF2I
+ generic map (
+ data_width=>data_width,
+ add_g=>add_g
+ )
+ port map (
+ fromreg_r=>fromreg_r,
+ fromreg_i=>fromreg_i,
+ prvs_r=>prvs_r,
+ prvs_i=>prvs_i,
+ s=>s,
+ toreg_r=>toreg_r, toreg_i=>toreg_i,
+ tonext_r=>tonext_r_aux,
+ tonext_i=>tonext_i_aux
+);
+
+
+
+regsegr : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_r,
+ write_data=>tonext_r_aux,
+ resetn=>resetn
+ );
+
+regsegi : shiftreg1
+ generic map (
+ data_width=>data_width
+
+ )
+port map (
+ clock=>clock,
+ enable=>'1',
+ clear=>'0',
+ read_data=>tonext_i,
+ write_data=>tonext_i_aux,
+ resetn=>resetn
+ );
+
+
+end;
vhdl/WISHBONE_FFT/stage_I_last.vhd
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: vhdl/WISHBONE_FIR/.vhd
===================================================================
--- vhdl/WISHBONE_FIR/.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/.vhd (revision 5)
@@ -0,0 +1,23 @@
+library ieee;
+use ieee.math_real.all;
+
+package coeff_pkg is
+ constant Nb : integer := 16;
+ constant Nh : integer := 255;
+ constant Q : integer := 15;
+
+-- type coeff is array (Nh-1 downto 0) of integer range -(2**(Nb-1)) to (2**(Nb-1)-1);
+-- constant h0 : coeff := (
+-- -89,
+-- 971,
+-- 860,
+-- -8051,
+-- -985,
+-- 14393,
+-- -985,
+-- -8051,
+-- 860,
+-- 971,
+-- -89
+-- );
+end coeff_pkg;
Index: vhdl/WISHBONE_FIR/cell.vhd
===================================================================
--- vhdl/WISHBONE_FIR/cell.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/cell.vhd (revision 5)
@@ -0,0 +1,132 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+--The cell mult and sum
+entity cell is
+generic (WordWidth:integer:=24;--width signal of in/out
+ M:integer:=16;--width word of coefs
+ WordWidth_Q:integer:=4--width signal of Q
+ );
+
+port(
+
+signal_input :in std_logic_vector(WordWidth-1 downto 0);
+filter_coef: in std_logic_vector(M-1 downto 0);
+reg_input:in std_logic_vector(WordWidth-1 downto 0);
+signal_output:out std_logic_vector(WordWidth-1 downto 0);
+clk,reset,clear,enable:in std_logic;
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+
+);
+end entity;
+
+architecture RTL of cell is
+--The fullregister component
+component fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+end component;
+
+component Barrel_Shifter is
+
+generic (
+
+ WordWidth_in:integer;--width signal of in
+ WordWidth_out:integer;--width signal of out
+ WordWidth_Q:integer--width signal of Q
+);
+port(
+signal_input :in std_logic_vector(WordWidth_in-1 downto 0);
+signal_out :out std_logic_vector(WordWidth_out-1 downto 0);
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+);
+end component;
+
+component Barrel_Shifter_left is
+
+generic (
+
+ WordWidth_in:integer;--width signal of in
+ WordWidth_out:integer;--width signal of out
+ WordWidth_Q:integer--width signal of Q
+);
+port(
+signal_input :in std_logic_vector(WordWidth_in-1 downto 0);
+signal_out :out std_logic_vector(WordWidth_out-1 downto 0);
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+);
+end component;
+
+signal signal_output_aux: std_logic_vector(WordWidth-1 downto 0);
+signal sum_mult: std_logic_vector(M+WordWidth-1 downto 0);
+signal reg_input_aux,reg_output_aux:std_logic_vector(M+WordWidth-1 downto 0);
+--signal sext:std_logic_vector(WordWidth-Q downto 0);
+begin
+
+--reg_input_aux(Q-1 downto 0)<= (others =>'0');
+--sext<=(others=>reg_input(WordWidth-1));
+--reg_input_aux(2*wordwidth downto Q)<=sext & reg_input;
+
+Barrel_Shifter2:Barrel_Shifter_left
+
+generic map(
+
+ WordWidth_in=>WordWidth,
+ WordWidth_out=>WordWidth+M,
+ WordWidth_Q=>WordWidth_Q
+)
+port map(
+signal_input=>reg_input,
+signal_out=>reg_input_aux,
+Q=>Q
+);
+
+
+
+sum_mult<=std_logic_vector((signed(filter_coef)*signed(signal_input)) + signed(reg_input_aux));
+
+mycell:fullregister
+generic map(
+ N=>M+WordWidth
+)
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enable,
+ clear=>clear,
+ d=>sum_mult,
+ q=>reg_output_aux
+ );
+
+Barrel_Shifter1:Barrel_Shifter
+
+generic map(
+
+ WordWidth_in=>WordWidth+M,
+ WordWidth_out=>WordWidth,
+ WordWidth_Q=>WordWidth_Q
+)
+port map(
+signal_input=>reg_output_aux,
+signal_out=>signal_output_aux,
+Q=>Q
+);
+
+
+signal_output<=signal_output_aux;
+
+end architecture;
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/Barrel_Shifter_left.vhd
===================================================================
--- vhdl/WISHBONE_FIR/Barrel_Shifter_left.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/Barrel_Shifter_left.vhd (revision 5)
@@ -0,0 +1,33 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity Barrel_Shifter_left is
+
+generic (
+
+ WordWidth_in:integer:=20;--width signal of in
+ WordWidth_out:integer:=32;--width signal of out
+ WordWidth_Q:integer:=4--width signal of Q
+);
+port(
+signal_input :in std_logic_vector(WordWidth_in-1 downto 0);
+signal_out :out std_logic_vector(WordWidth_out-1 downto 0);
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+);
+end entity;
+
+architecture RTL of Barrel_Shifter_left is
+signal signal_aux: std_logic_vector(WordWidth_out-1 downto 0);
+signal signal_aux_input: std_logic_vector(WordWidth_out-1 downto 0);
+signal sext: std_logic_vector(WordWidth_out-WordWidth_in-1 downto 0);
+begin
+
+sext<= (others=>signal_input(WordWidth_in-1));
+signal_aux_input<= sext & signal_input;
+
+--signal_aux<=std_logic_vector(signed(signal_input)*to_signed(2**(to_integer(-signed(Q))),24));
+signal_aux<=to_stdlogicvector(to_bitvector(signal_aux_input) sll to_integer(unsigned(Q)));
+--signal_aux<=std_logic_vector(signed(signal_input) ror (to_integer(unsigned(Q))));
+signal_out<=signal_aux;
+end architecture;
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/FILTER_FIR.vhd
===================================================================
--- vhdl/WISHBONE_FIR/FILTER_FIR.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/FILTER_FIR.vhd (revision 5)
@@ -0,0 +1,77 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+--use work.coeff_pkg.all;
+
+entity FILTER_FIR is
+generic (WordWidth:integer;--width signal of in/out
+ N_coef:integer;--coefs
+ M:integer;--width word of coefs
+ WordWidth_Q:integer;--width signal of Q
+ bit_growth:integer:=8
+ );
+
+port(
+signal_input: in std_logic_vector(WordWidth-1 downto 0);
+signal_output:out std_logic_vector(WordWidth+bit_growth-1 downto 0);
+filter_coef: in std_logic_vector(M*N_coef-1 downto 0);
+enable,clear,reset,clk: in std_logic;
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+
+);
+end entity;
+
+architecture RTL of FILTER_FIR is
+
+--The cell mult and sum
+component cell is
+generic (WordWidth:integer;--width signal of in/out
+ M:integer;--width word of coefs
+ WordWidth_Q:integer--width signal of Q
+
+ );
+
+port(
+
+signal_input :in std_logic_vector(WordWidth-1 downto 0);
+filter_coef: in std_logic_vector(M-1 downto 0);
+reg_input:in std_logic_vector(WordWidth-1 downto 0);
+signal_output:out std_logic_vector(WordWidth-1 downto 0);
+clk,reset,clear,enable:in std_logic;
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+
+);
+end component;
+
+type array_aux is array(N_coef downto 0) of std_logic_vector(WordWidth+bit_growth-1 downto 0);
+signal cell_aux: array_aux;
+signal sext:std_logic_vector(bit_growth-1 downto 0);
+begin
+sext<=(others=>signal_input(WordWidth-1));
+myfilter:
+ for k in N_coef-1 downto 0 generate
+filter:cell
+ generic map(
+ WordWidth=>WordWidth+bit_growth,
+ M=>M,
+ WordWidth_Q=>WordWidth_Q
+
+ )
+
+ port map(
+ signal_input=>sext&signal_input,
+ signal_output=>cell_aux(k),
+ filter_coef=>filter_coef((k+1)*M-1 downto k*M),
+ reg_input=>cell_aux(k+1),
+ enable=>enable,
+ clk=>clk,
+ reset=>reset,
+ clear=>clear,
+ Q=>Q
+
+ );
+ signal_output<=cell_aux(0)(WordWidth+bit_growth-1 downto 0);
+ end generate;
+
+end architecture;
Index: vhdl/WISHBONE_FIR/fullregister.vhd
===================================================================
--- vhdl/WISHBONE_FIR/fullregister.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/fullregister.vhd (revision 5)
@@ -0,0 +1,54 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+
+end entity;
+
+architecture rtl of fullregister is
+begin
+
+ process (clk,reset_n,d,clear,enable)
+
+ begin
+ if reset_n = '0' then
+ q <= (others=>'0');
+ elsif (rising_edge(clk)) then
+
+ if enable = '1' then
+ if clear='1' then
+
+ q <= (others=>'0');
+
+ else
+
+ q<=d;
+
+ end if;
+
+
+ end if;
+
+ end if;
+
+
+ end process;
+
+end rtl;
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/FIR_WB.vhd
===================================================================
--- vhdl/WISHBONE_FIR/FIR_WB.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/FIR_WB.vhd (revision 5)
@@ -0,0 +1,154 @@
+library ieee;
+library work;
+--use work.coeff_pkg.all;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+entity FIR_WB is
+generic (Filter_Width:integer:=16;--Filter width signals of in/out
+ WB_Width:integer:=32;--WishBone width signal of in/out
+ N_coef:integer:=50;--coefs
+ M:integer:=16;--width word of coefs
+ WordWidth_Q:integer:=4;--width signal of Q
+ bit_growth:integer:=8;
+ adress_wordwidth:integer:=32 ;
+ Adr_bas:integer:=8;
+ reg_control:integer:=4;
+ reg_data:integer:=8;
+ reg_status:integer:=12;
+ reg_Q:integer:=16;
+ reg_coef:integer:=20
+
+ );
+
+port(
+DAT_I: in std_logic_vector(WB_Width-1 downto 0);
+DAT_O:out std_logic_vector(WB_Width-1 downto 0);
+ADR_I :in std_logic_vector(adress_wordwidth-1 downto 0);
+STB_I,RST_I,CLK_I,WE_I,clear: in std_logic;
+ACK_O: out std_logic
+);
+end entity;
+
+
+architecture RTL of FIR_WB is
+
+component FILTER_FIR is
+generic (WordWidth:integer;--width signal of in/out
+ N_coef:integer;--coefs
+ M:integer;--width word of coefs
+ WordWidth_Q:integer;--width signal of Q
+ bit_growth:integer
+
+
+ );
+
+port(
+signal_input: in std_logic_vector(WordWidth-1 downto 0);
+signal_output:out std_logic_vector(WordWidth+bit_growth-1 downto 0);
+filter_coef: in std_logic_vector(M*N_coef-1 downto 0);
+enable,clear,reset,clk: in std_logic;
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+
+);
+end component;
+
+component interface_slave_fir is
+generic(
+
+data_wordwidth: integer;
+adress_wordwidth: integer;
+Adr_bas:integer;
+reg_control:integer;
+reg_data:integer;
+reg_status:integer;
+reg_Q:integer;
+reg_coef:integer;
+N_coef:integer;
+M:integer;
+WordWidth_Q:integer
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( adress_wordwidth-1 downto 0 );
+ DAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to SLAVE
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ Start: out std_logic;--to SLAVE
+ h0: out std_logic_vector( (N_coef*M)-1 downto 0 );
+ Q: out std_logic_vector( WordWidth_Q-1 downto 0 );
+ clear,reset,clk: in std_logic
+ );
+end component;
+
+signal h0_aux:std_logic_vector(M*N_coef-1 downto 0);
+signal fir_data_in:std_logic_vector(WB_Width-1 downto 0);
+signal fir_data_out:std_logic_vector(Filter_Width+bit_growth-1 downto 0);
+signal Q_aux:std_logic_vector(WordWidth_Q-1 downto 0);
+signal Start_aux, WE_O_aux:std_logic;
+signal sext:std_logic_vector(bit_growth-1 downto 0);
+begin
+
+sext<=(others=>fir_data_out(Filter_Width+bit_growth-1));
+
+myFilter:FILTER_FIR
+generic map(
+ WordWidth=>Filter_Width,
+ N_coef=>N_coef,
+ M=>M,
+ WordWidth_Q=>WordWidth_Q,
+ bit_growth=>bit_growth
+)
+ port map (
+ signal_input=>fir_data_in(Filter_Width-1 downto 0),
+ signal_output=>fir_data_out,
+ filter_coef=>h0_aux,
+ enable=>Start_aux,
+ clear=>clear,
+ reset=>RST_I,
+ clk=>CLK_I,
+ Q=>Q_aux
+ );
+
+wb_interface:interface_slave_fir
+generic map(
+
+data_wordwidth=>WB_Width,
+adress_wordwidth=>adress_wordwidth,
+Adr_bas=>Adr_bas,
+reg_control=>reg_control,
+reg_data=>reg_data,
+reg_status=>reg_status,
+reg_Q=>reg_Q,
+reg_coef=>reg_coef,
+N_coef=>N_coef,
+M=>M,
+WordWidth_Q=>WordWidth_Q
+
+)
+port map(
+
+
+ ACK_O=>ACK_O,
+ ADR_I=>ADR_I,
+ DAT_I=>DAT_I,
+ sDAT_I=>sext&fir_data_out,
+ DAT_O=>DAT_O,
+ sDAT_O=>fir_data_in,
+ STB_I=>STB_I,
+ WE_I=>WE_I,
+ Start=>Start_aux,
+ h0=>h0_aux,
+ Q=>Q_aux,
+ clear=>clear,
+ reset=>RST_I,
+ clk=>CLK_I
+ );
+
+end architecture;
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/interface_slave_fir.vhd
===================================================================
--- vhdl/WISHBONE_FIR/interface_slave_fir.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/interface_slave_fir.vhd (revision 5)
@@ -0,0 +1,193 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity interface_slave_fir is
+generic(
+
+data_wordwidth: integer;
+adress_wordwidth: integer;
+Adr_bas:integer;
+reg_control:integer;
+reg_data:integer;
+reg_status:integer;
+reg_Q:integer;
+reg_coef:integer;
+
+N_coef:integer;
+
+M:integer;
+WordWidth_Q:integer--width signal of Q
+
+);
+port(
+
+
+ ACK_O: out std_logic;--to MASTER
+ ADR_I: in std_logic_vector( adress_wordwidth-1 downto 0 );
+ DAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from MASTER
+ sDAT_I: in std_logic_vector( data_wordwidth-1 downto 0 );--from SLAVE
+ DAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to MASTER
+ sDAT_O: out std_logic_vector( data_wordwidth-1 downto 0 );--to SLAVE
+ STB_I: in std_logic;--from MASTER
+ WE_I: in std_logic;--from MASTER
+ Start: out std_logic;--to SLAVE
+ h0: out std_logic_vector( (N_coef*M)-1 downto 0 );--to SLAVE
+ Q :out std_logic_vector(WordWidth_Q-1 downto 0);
+ clear,reset,clk: in std_logic
+
+ );
+end entity;
+
+architecture RTL of interface_slave_fir is
+
+--The fullregister component
+component fullregister is
+
+ generic
+ (
+ N: integer
+ );
+
+ port
+ (
+ clk : in std_logic;
+ reset_n : in std_logic;
+ enable : in std_logic;
+ clear : in std_logic;
+ d : in std_logic_vector(N-1 downto 0);
+ q : out std_logic_vector(N-1 downto 0)
+
+ );
+end component;
+
+signal OUT_AUX,rSTATUS_O, ZERO: std_logic_vector( data_wordwidth-1 downto 0 );
+signal ZERO1: std_logic_vector( WordWidth_Q-1 downto 0 );
+
+type array_aux is array(N_coef downto 0) of std_logic_vector(M-1 downto 0);
+signal h0_aux:array_aux;
+
+type array_aux1 is array(N_coef downto 0) of std_logic;
+signal enables:array_aux1;
+
+begin
+ ZERO<=std_logic_vector(to_unsigned(0,data_wordwidth));
+ ZERO1<=std_logic_vector(to_unsigned(0,WordWidth_Q));
+ OUT_AUX<=DAT_I;
+ ACK_O<=STB_I;
+
+
+ DAT_O<=sDAT_I;
+
+ coefficients:
+ for k in N_coef-1 downto 0 generate
+
+ enables(k)<='1' when (STB_I='1' and WE_I='1' and ADR_I(9 downto 0)=std_logic_vector(to_unsigned((4*k)+reg_coef,10))) else
+ '0';
+
+ coefs:fullregister
+ generic map(
+ N=>M
+ )
+ port map (
+ clk=>clk,
+ reset_n=>reset,
+ enable=>enables(k),
+ clear=>clear,
+ d=>OUT_AUX(M-1 downto 0),
+ q=>h0_aux(k)
+ );
+ h0((k+1)*M-1 downto k*M)<=std_logic_vector(signed(h0_aux(k)));
+
+ end generate;
+
+
+
+ process(ADR_I,STB_I,WE_I,ZERO,ZERO1,OUT_AUX,sDAT_I,rSTATUS_O)
+ begin
+
+ --if ((ADR_I(adress_wordwidth-1 downto adress_wordwidth-4))=std_logic_vector(to_unsigned(Adr_bas,4))) then
+ if (WE_I='1' and STB_I='1') then
+ case ADR_I(9 downto 0) is
+
+ when std_logic_vector(to_unsigned(reg_control,10)) => start<='1';
+ --sDAT_O<=ZERO;
+ --DAT_O<=ZERO;
+ rSTATUS_O<=ZERO;
+ --Q<=ZERO1;
+
+
+ when std_logic_vector(to_unsigned(Reg_status,10)) => rSTATUS_O<=std_logic_vector(unsigned(OUT_AUX));
+ --sDAT_O<=ZERO;
+ -- DAT_O<=ZERO;
+ start<='0';
+ --Q<=ZERO1;
+
+
+ when OTHERS => --DAT_O<=ZERO;
+ --sDAT_O<=ZERO;
+ start<='0';
+ rSTATUS_O<=ZERO;
+ --Q<=ZERO1;
+ end case;
+-- elsif (WE_I='0' and STB_I='1') then
+-- case ADR_I(4 downto 0) is
+-- when std_logic_vector(to_unsigned(reg_data,5)) => DAT_O<=sDAT_I;
+-- --sDAT_O<=ZERO;
+-- start<='0';
+-- rSTATUS_O<=ZERO;
+-- ---Q<=ZERO1;
+--
+-- when std_logic_vector(to_unsigned(Reg_status,5)) => DAT_O<=rSTATUS_O;
+-- --sDAT_O<=ZERO;
+-- start<='0';
+-- rSTATUS_O<=ZERO;
+-- --Q<=ZERO1;
+-- when OTHERS => DAT_O<=ZERO;
+-- --sDAT_O<=ZERO;
+-- start<='0';
+-- rSTATUS_O<=ZERO;
+-- --Q<=ZERO1;
+-- end case;
+
+ --end if;
+ else
+ -- DAT_O<=ZERO;
+ --sDAT_O<=ZERO;
+ start<='0';
+ rSTATUS_O<=ZERO;
+ --Q<=ZERO1;
+ end if;
+
+ end process;
+
+ process(ADR_I,STB_I,WE_I,ZERO,ZERO1,OUT_AUX,sDAT_I,rSTATUS_O)
+ begin
+ if rising_edge(clk) then
+
+ if (WE_I='1' and STB_I='1') then
+ if ADR_I(9 downto 0)=std_logic_vector(to_unsigned(reg_data,10)) then
+
+
+ sDAT_O<=OUT_AUX;
+ end if;
+ if ADR_I(9 downto 0)=std_logic_vector(to_unsigned(reg_Q,10)) then
+
+
+ --Q<=OUT_AUX(data_wordwidth-1 downto data_wordwidth-WordWidth_Q);
+ Q<=OUT_AUX(WordWidth_Q-1 downto 0);
+ end if;
+
+
+
+
+
+ end if;
+ end if;
+
+
+ end process;
+end architecture;
+
+
+
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/.vhd.bak
===================================================================
--- vhdl/WISHBONE_FIR/.vhd.bak (nonexistent)
+++ vhdl/WISHBONE_FIR/.vhd.bak (revision 5)
@@ -0,0 +1,23 @@
+library ieee;
+use ieee.math_real.all;
+
+package coeff_pkg is
+ constant Nb : integer := 16;
+ constant Nh : integer := 11;
+ constant Q : integer := 15;
+
+ type coeff is array (Nh-1 downto 0) of integer range -(2**(Nb-1)) to (2**(Nb-1)-1);
+ constant h0 : coeff := (
+ -89,
+ 971,
+ 860,
+ -8051,
+ -985,
+ 14393,
+ -985,
+ -8051,
+ 860,
+ 971,
+ -89
+ );
+end coeff_pkg;
Index: vhdl/WISHBONE_FIR/.bak
===================================================================
--- vhdl/WISHBONE_FIR/.bak (nonexistent)
+++ vhdl/WISHBONE_FIR/.bak (revision 5)
@@ -0,0 +1,25 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity slave is
+generic(
+
+data_wordwidth: integer;
+adress_wordwidth integer;
+
+);
+port(
+
+ ACK_O : out std_logic;
+ ADR_I : in std_logic_vector( adress_wordwidth downto 0 );
+ CLK_I : in std_logic;
+ DAT_I : in std_logic_vector( data_wordwidth downto 0 );
+ DAT_O : out std_logic_vector( data_wordwidth downto 0 );
+ STB_I : in std_logic;
+ WE_I : in std_logic
+
+ );
+
+
+
\ No newline at end of file
Index: vhdl/WISHBONE_FIR/Barrel_Shifter.vhd
===================================================================
--- vhdl/WISHBONE_FIR/Barrel_Shifter.vhd (nonexistent)
+++ vhdl/WISHBONE_FIR/Barrel_Shifter.vhd (revision 5)
@@ -0,0 +1,28 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity Barrel_Shifter is
+
+generic (
+
+ WordWidth_in:integer:=32;--width signal of in
+ WordWidth_out:integer:=20;--width signal of out
+ WordWidth_Q:integer:=4--width signal of Q
+);
+port(
+signal_input :in std_logic_vector(WordWidth_in-1 downto 0);
+signal_out :out std_logic_vector(WordWidth_out-1 downto 0);
+Q :in std_logic_vector(WordWidth_Q-1 downto 0)
+);
+end entity;
+
+architecture RTL of Barrel_Shifter is
+signal signal_aux: std_logic_vector(WordWidth_in-1 downto 0);
+begin
+
+--signal_aux<=std_logic_vector(signed(signal_input)*to_signed(2**(to_integer(-signed(Q))),24));
+signal_aux<=to_stdlogicvector(to_bitvector(signal_input) sra to_integer(unsigned(Q)));
+--signal_aux<=std_logic_vector(signed(signal_input) ror (to_integer(unsigned(Q))));
+signal_out<=signal_aux(WordWidth_out-1 downto 0);
+end architecture;
\ No newline at end of file