📄 sdrm.v
字号:
/******************************************************************************** File Name: sdrm.v* Version: 1.14* Date: Sept 9, 1999* Description: Top level module* Dependencies: sdrm_t, sys_int** Company: Xilinx*** Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY * WHATSOEVER AND XILINX SPECIFICALLY DISCLAIMS ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR* A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT.** Copyright (c) 1998 Xilinx, Inc.* All rights reserved*******************************************************************************/`include "../src/define.v"`timescale 1ns / 100psmodule sdrm (/*AUTOARG*/ // Outputs sd_add, sd_ras, sd_cas, sd_we, sd_ba, Clk_SDp, sd_cke, sd_cs1, sd_cs2, sd_dqm, // Inouts sd_data, AD, // Inputs Reset, Clkp, Clk_FBp, we_rn, data_addr_n ); inout [(`DATA_MSB):0] sd_data, AD; output [10:0] sd_add; output sd_ras, sd_cas, sd_we, sd_ba, Clk_SDp; output sd_cke, sd_cs1, sd_cs2; output [3:0] sd_dqm; input Reset, Clkp, Clk_FBp, we_rn, data_addr_n; wire [(`DATA_MSB):0] sd_data; wire [10:0] sd_add_op; wire [(`DATA_MSB):0] sd_data_i, AD, AD_i; wire [(`DATA_MSB):0] sd_data_reg; wire sd_cke_o, sd_cs1_o, sd_cs2_o, sd_ba_op, ready_o; wire [3:0] sd_dqm_o; wire Reset, Reset_i; reg [31:0] sd_data_o; reg [(`DATA_MSB):0] sd_data_t, sd_data_R, AD_o; reg [10:0] sd_add_o; reg sd_ba_o, sd_cas_o, sd_ras_o, sd_we_o; reg [3:0] sd_doe_n; wire [3:0] sd_doe_np; wire Clkp, Clk_FBp, Clk_SDp; wire Clk_FB, Clk_i, Clk_j, Clk0A, Clk0B, Clk0C; wire Locked2, Locked1, Locked_i, Locked_j, logic1, logic0, Clk; wire sd_ras_op, sd_cas_op, sd_we_op, write_st; wire AD_tri; wire [(`ADDR_MSB):0] Add_reg; reg [(`ADDR_MSB):0] AD_reg; wire [1:0] rcd_c_max, cas_lat_max; wire [2:0] burst_max, Act_st; wire [3:0] ki_max; wire [15:0] ref_max; reg data_addr_n_reg, we_rn_reg; wire data_addr_n, data_addr_n_i, we_rn, we_rn_i; wire kid, auto_ref_in, auto_ref_out; /*********************************************************\ * Instantiation of sub modules. * * sdrm_t = Top level for the SDRAM controller * * sys_int = System interface module * * * \*********************************************************/ sdrm_t sdrm_t (.Locked1(Locked1), .Locked2(Locked2), .Clk_i(Clk_i), .sd_ras_o(sd_ras_op), .sd_cas_o(sd_cas_op), .sd_we_o(sd_we_op), .sd_add_o(sd_add_op), .sd_ba_o(sd_ba_op), .sd_doe_n(sd_doe_np), .ready_o(ready_o), .Locked_i(Locked_i), .Locked_j(Locked_j), .Add_reg(Add_reg[21:2]), .rcd_c_max(rcd_c_max), .kid(kid), .auto_ref_in(auto_ref_in), .auto_ref_out(auto_ref_out), .cas_lat_max(cas_lat_max), .burst_max(burst_max), .Act_st(Act_st),.Clk_j(Clk_j), .write_st(write_st), .ki_max(ki_max), .ref_max(ref_max), .rcd_end(rcd_end), .AD_tri(AD_tri)); sys_int sys_int (.Locked(Locked_i), .Clk_i(Clk_i), .data_addr_n_reg(data_addr_n_reg), .data_addr_n_i(data_addr_n_i), .we_rn_i(we_rn_i), .we_rn_reg(we_rn_reg), .AD_reg(AD_reg), .Act_st(Act_st), .write_st(write_st), .Add_reg(Add_reg), .sd_data_reg(sd_data_reg), .rcd_c_max(rcd_c_max), .cas_lat_max(cas_lat_max), .burst_max(burst_max), .ki_max(ki_max), .ref_max(ref_max)); /*****************************************************************\ * Delay Lock Loops and Global clock buffers instantiation * * * \****************************************************************/ wire unused1, unused2, unused3; //clock input to FPGA (Clkp), must go through IBUFG before entering DLL IBUFG ibufg0 (.I(Clkp), .O(Clk)); //clock feedback from SDRAM for clock mirror (Clk_FBp), // must go through IBUFG IBUFG ibufg1 (.I(Clk_FBp), .O(Clk_FB)); //dll0 is clock mirror, provide SDRAM clock(Clk_SDp) CLKDLL dll0(.CLKIN(Clk), .CLKFB(Clk_FB), .RST(Reset_i), .CLK0(unused1), .CLK90(), .CLK180(), .CLK270(), .CLK2X(Clk0A), .CLKDV(unused2), .LOCKED(Locked1)); //Clk_SDp is routed directly from dll0 to output buffer OBUF_F_16 obuf0 (.I(Clk0A), .O(Clk_SDp)); //ddl1 provides internal clock to FPGA //these clocks drive global clock buffer (BUFG) to get minimum skew CLKDLL dll1(.CLKIN(Clk), .CLKFB(Clk_i), .RST(Reset_i), .CLK0(Clk0C), .CLK90(), .CLK180(), .CLK270(), .CLK2X(Clk0B), .CLKDV(unused3), .LOCKED(Locked2)); // Clk_j is the same as input clock (Clk_SDp) // Clk_i is is multiplied by 2x BUFG bufg0 (.O(Clk_i), .I(Clk0B)); BUFG bufg1 (.O(Clk_j), .I(Clk0C)); /*****************************************************************\ * IO pads Flip-flops and tri-state logic * * * \****************************************************************/ assign logic0 = 1'b0; assign logic1 = 1'b1; assign sd_cke_o = logic1; assign sd_cs1_o = logic0; assign sd_cs2_o = logic0; assign sd_dqm_o[3:0] = {4{logic0}}; assign auto_ref_in = auto_ref_out; always @(posedge Clk_i or negedge Locked_i) if (~Locked_i) begin sd_data_o <= 32'hffffffff; sd_data_t[31:0] <= 32'hffffffff; sd_data_R <= 32'h00000000; AD_o <= 32'h00000000; AD_reg <= 32'h00000000; data_addr_n_reg <= 1; we_rn_reg <= 0; end else begin sd_data_o <= #3 sd_data_reg; //tristate signal is duplicated into 4 signals, each having 8 loads //this helps reduce delay on sd_data_t sd_data_t[31:24] <= #3 {8{sd_doe_n[3]}}; sd_data_t[23:16] <= #3 {8{sd_doe_n[2]}}; sd_data_t[15:8] <= #3 {8{sd_doe_n[1]}}; sd_data_t[7:0] <= #3 {8{sd_doe_n[0]}}; sd_data_R <= sd_data_i; AD_o <= sd_data_R; AD_reg <= AD_i; data_addr_n_reg <= data_addr_n_i; we_rn_reg <= we_rn_i; end always @(posedge Clk_i or negedge Locked_i) if (~Locked_i) begin sd_add_o[10:0] <= 11'h000; sd_ba_o <= 1'b0; sd_ras_o <= 1'b1; sd_cas_o <= 1'b1; sd_we_o <= 1'b1; sd_doe_n <= 4'hf; end else begin sd_add_o[10:0] <= #3 sd_add_op[10:0]; sd_ba_o <= #3 sd_ba_op; sd_ras_o <= #3 sd_ras_op; sd_cas_o <= #3 sd_cas_op; sd_we_o <= #3 sd_we_op; sd_doe_n <= #3 sd_doe_np; end /*****************************************************************\ * IO pads instantiation * * * \****************************************************************/ IOBUF_F_12 iod0 (.I(sd_data_o[0]), .IO(sd_data[0]), .O(sd_data_i[0]), .T(sd_data_t[0])); IOBUF_F_12 iod1 (.I(sd_data_o[1]), .IO(sd_data[1]), .O(sd_data_i[1]), .T(sd_data_t[1])); IOBUF_F_12 iod2 (.I(sd_data_o[2]), .IO(sd_data[2]), .O(sd_data_i[2]), .T(sd_data_t[2])); IOBUF_F_12 iod3 (.I(sd_data_o[3]), .IO(sd_data[3]), .O(sd_data_i[3]), .T(sd_data_t[3])); IOBUF_F_12 iod4 (.I(sd_data_o[4]), .IO(sd_data[4]), .O(sd_data_i[4]), .T(sd_data_t[4])); IOBUF_F_12 iod5 (.I(sd_data_o[5]), .IO(sd_data[5]), .O(sd_data_i[5]), .T(sd_data_t[5])); IOBUF_F_12 iod6 (.I(sd_data_o[6]), .IO(sd_data[6]), .O(sd_data_i[6]), .T(sd_data_t[6])); IOBUF_F_12 iod7 (.I(sd_data_o[7]), .IO(sd_data[7]), .O(sd_data_i[7]), .T(sd_data_t[7])); IOBUF_F_12 iod8 (.I(sd_data_o[8]), .IO(sd_data[8]), .O(sd_data_i[8]), .T(sd_data_t[8])); IOBUF_F_12 iod9 (.I(sd_data_o[9]), .IO(sd_data[9]), .O(sd_data_i[9]), .T(sd_data_t[9])); IOBUF_F_12 iod10 (.I(sd_data_o[10]), .IO(sd_data[10]), .O(sd_data_i[10]), .T(sd_data_t[10])); IOBUF_F_12 iod11 (.I(sd_data_o[11]), .IO(sd_data[11]), .O(sd_data_i[11]), .T(sd_data_t[11])); IOBUF_F_12 iod12 (.I(sd_data_o[12]), .IO(sd_data[12]), .O(sd_data_i[12]), .T(sd_data_t[12])); IOBUF_F_12 iod13 (.I(sd_data_o[13]), .IO(sd_data[13]), .O(sd_data_i[13]), .T(sd_data_t[13])); IOBUF_F_12 iod14 (.I(sd_data_o[14]), .IO(sd_data[14]), .O(sd_data_i[14]), .T(sd_data_t[14])); IOBUF_F_12 iod15 (.I(sd_data_o[15]), .IO(sd_data[15]), .O(sd_data_i[15]), .T(sd_data_t[15])); IOBUF_F_12 iod16 (.I(sd_data_o[16]), .IO(sd_data[16]), .O(sd_data_i[16]), .T(sd_data_t[16])); IOBUF_F_12 iod17 (.I(sd_data_o[17]), .IO(sd_data[17]), .O(sd_data_i[17]), .T(sd_data_t[17])); IOBUF_F_12 iod18 (.I(sd_data_o[18]), .IO(sd_data[18]), .O(sd_data_i[18]), .T(sd_data_t[18])); IOBUF_F_12 iod19 (.I(sd_data_o[19]), .IO(sd_data[19]), .O(sd_data_i[19]), .T(sd_data_t[19])); IOBUF_F_12 iod20 (.I(sd_data_o[20]), .IO(sd_data[20]), .O(sd_data_i[20]), .T(sd_data_t[20])); IOBUF_F_12 iod21 (.I(sd_data_o[21]), .IO(sd_data[21]), .O(sd_data_i[21]), .T(sd_data_t[21])); IOBUF_F_12 iod22 (.I(sd_data_o[22]), .IO(sd_data[22]), .O(sd_data_i[22]), .T(sd_data_t[22])); IOBUF_F_12 iod23 (.I(sd_data_o[23]), .IO(sd_data[23]), .O(sd_data_i[23]), .T(sd_data_t[23])); IOBUF_F_12 iod24 (.I(sd_data_o[24]), .IO(sd_data[24]), .O(sd_data_i[24]), .T(sd_data_t[24])); IOBUF_F_12 iod25 (.I(sd_data_o[25]), .IO(sd_data[25]), .O(sd_data_i[25]), .T(sd_data_t[25])); IOBUF_F_12 iod26 (.I(sd_data_o[26]), .IO(sd_data[26]), .O(sd_data_i[26]), .T(sd_data_t[26])); IOBUF_F_12 iod27 (.I(sd_data_o[27]), .IO(sd_data[27]), .O(sd_data_i[27]), .T(sd_data_t[27])); IOBUF_F_12 iod28 (.I(sd_data_o[28]), .IO(sd_data[28]), .O(sd_data_i[28]), .T(sd_data_t[28])); IOBUF_F_12 iod29 (.I(sd_data_o[29]), .IO(sd_data[29]), .O(sd_data_i[29]), .T(sd_data_t[29])); IOBUF_F_12 iod30 (.I(sd_data_o[30]), .IO(sd_data[30]), .O(sd_data_i[30]), .T(sd_data_t[30])); IOBUF_F_12 iod31 (.I(sd_data_o[31]), .IO(sd_data[31]), .O(sd_data_i[31]), .T(sd_data_t[31])); OBUF_F_12 sda0 (.O(sd_add[0]), .I(sd_add_o[0])); OBUF_F_12 sda1 (.O(sd_add[1]), .I(sd_add_o[1])); OBUF_F_12 sda2 (.O(sd_add[2]), .I(sd_add_o[2])); OBUF_F_12 sda3 (.O(sd_add[3]), .I(sd_add_o[3])); OBUF_F_12 sda4 (.O(sd_add[4]), .I(sd_add_o[4])); OBUF_F_12 sda5 (.O(sd_add[5]), .I(sd_add_o[5])); OBUF_F_12 sda6 (.O(sd_add[6]), .I(sd_add_o[6])); OBUF_F_12 sda7 (.O(sd_add[7]), .I(sd_add_o[7])); OBUF_F_12 sda8 (.O(sd_add[8]), .I(sd_add_o[8])); OBUF_F_12 sda9 (.O(sd_add[9]), .I(sd_add_o[9])); OBUF_F_12 sda10 (.O(sd_add[10]), .I(sd_add_o[10])); OBUF_F_12 sdb (.O(sd_ba), .I(sd_ba_o)); OBUF_F_12 sdr (.O(sd_ras), .I(sd_ras_o)); OBUF_F_12 sdc (.O(sd_cas), .I(sd_cas_o)); OBUF_F_12 sdw (.O(sd_we), .I(sd_we_o)); OBUF_F_12 sdcke (.O(sd_cke), .I(sd_cke_o)); OBUF_F_12 sdcs1 (.O(sd_cs1), .I(sd_cs1_o)); OBUF_F_12 sdcs2 (.O(sd_cs2), .I(sd_cs2_o)); OBUF_F_12 dqm0 (.O(sd_dqm[0]), .I(sd_dqm_o[0])); OBUF_F_12 dqm1 (.O(sd_dqm[1]), .I(sd_dqm_o[1])); OBUF_F_12 dqm2 (.O(sd_dqm[2]), .I(sd_dqm_o[2])); OBUF_F_12 dqm3 (.O(sd_dqm[3]), .I(sd_dqm_o[3])); /*****************************************************************\ * Processor Interface IO pads * * * \****************************************************************/ IBUF rst_b (.O(Reset_i), .I(Reset)); IBUF ads_b (.O(data_addr_n_i), .I(data_addr_n)); IBUF wern_b (.O(we_rn_i), .I(we_rn)); IOBUF_F_12 ad0 (.I(AD_o[0]), .O(AD_i[0]), .IO(AD[0]), .T(AD_tri)); IOBUF_F_12 ad1 (.I(AD_o[1]), .O(AD_i[1]), .IO(AD[1]), .T(AD_tri)); IOBUF_F_12 ad2 (.I(AD_o[2]), .O(AD_i[2]), .IO(AD[2]), .T(AD_tri)); IOBUF_F_12 ad3 (.I(AD_o[3]), .O(AD_i[3]), .IO(AD[3]), .T(AD_tri)); IOBUF_F_12 ad4 (.I(AD_o[4]), .O(AD_i[4]), .IO(AD[4]), .T(AD_tri)); IOBUF_F_12 ad5 (.I(AD_o[5]), .O(AD_i[5]), .IO(AD[5]), .T(AD_tri)); IOBUF_F_12 ad6 (.I(AD_o[6]), .O(AD_i[6]), .IO(AD[6]), .T(AD_tri)); IOBUF_F_12 ad7 (.I(AD_o[7]), .O(AD_i[7]), .IO(AD[7]), .T(AD_tri)); IOBUF_F_12 ad8 (.I(AD_o[8]), .O(AD_i[8]), .IO(AD[8]), .T(AD_tri)); IOBUF_F_12 ad9 (.I(AD_o[9]), .O(AD_i[9]), .IO(AD[9]), .T(AD_tri)); IOBUF_F_12 ad10 (.I(AD_o[10]), .O(AD_i[10]), .IO(AD[10]), .T(AD_tri)); IOBUF_F_12 ad11 (.I(AD_o[11]), .O(AD_i[11]), .IO(AD[11]), .T(AD_tri)); IOBUF_F_12 ad12 (.I(AD_o[12]), .O(AD_i[12]), .IO(AD[12]), .T(AD_tri)); IOBUF_F_12 ad13 (.I(AD_o[13]), .O(AD_i[13]), .IO(AD[13]), .T(AD_tri)); IOBUF_F_12 ad14 (.I(AD_o[14]), .O(AD_i[14]), .IO(AD[14]), .T(AD_tri)); IOBUF_F_12 ad15 (.I(AD_o[15]), .O(AD_i[15]), .IO(AD[15]), .T(AD_tri)); IOBUF_F_12 ad16 (.I(AD_o[16]), .O(AD_i[16]), .IO(AD[16]), .T(AD_tri)); IOBUF_F_12 ad17 (.I(AD_o[17]), .O(AD_i[17]), .IO(AD[17]), .T(AD_tri)); IOBUF_F_12 ad18 (.I(AD_o[18]), .O(AD_i[18]), .IO(AD[18]), .T(AD_tri)); IOBUF_F_12 ad19 (.I(AD_o[19]), .O(AD_i[19]), .IO(AD[19]), .T(AD_tri)); IOBUF_F_12 ad20 (.I(AD_o[20]), .O(AD_i[20]), .IO(AD[20]), .T(AD_tri)); IOBUF_F_12 ad21 (.I(AD_o[21]), .O(AD_i[21]), .IO(AD[21]), .T(AD_tri)); IOBUF_F_12 ad22 (.I(AD_o[22]), .O(AD_i[22]), .IO(AD[22]), .T(AD_tri)); IOBUF_F_12 ad23 (.I(AD_o[23]), .O(AD_i[23]), .IO(AD[23]), .T(AD_tri)); IOBUF_F_12 ad24 (.I(AD_o[24]), .O(AD_i[24]), .IO(AD[24]), .T(AD_tri)); IOBUF_F_12 ad25 (.I(AD_o[25]), .O(AD_i[25]), .IO(AD[25]), .T(AD_tri)); IOBUF_F_12 ad26 (.I(AD_o[26]), .O(AD_i[26]), .IO(AD[26]), .T(AD_tri)); IOBUF_F_12 ad27 (.I(AD_o[27]), .O(AD_i[27]), .IO(AD[27]), .T(AD_tri)); IOBUF_F_12 ad28 (.I(AD_o[28]), .O(AD_i[28]), .IO(AD[28]), .T(AD_tri)); IOBUF_F_12 ad29 (.I(AD_o[29]), .O(AD_i[29]), .IO(AD[29]), .T(AD_tri)); IOBUF_F_12 ad30 (.I(AD_o[30]), .O(AD_i[30]), .IO(AD[30]), .T(AD_tri)); IOBUF_F_12 ad31 (.I(AD_o[31]), .O(AD_i[31]), .IO(AD[31]), .T(AD_tri)); endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -