// ハードTOP //marseeさんの module DDRtest(clk, reset, lcd_d, lcd_rs, lcd_rw, lcd_e, sf_ce0, rot_a, rot_b, rot_center, btn_east, btn_west, led, sd_a, sd_dq, sd_ba, sd_ras, sd_cas, sd_we, sd_udm, sd_ldm, sd_udqs, sd_ldqs, sd_cs, sd_cke, sd_ck_n, sd_ck_p, sd_ck_fb); //から改造 Mar.3.2008 Tak.Sugawara //Mar.5.2008 clk100をIFに引き出し追加 //Mar.6.2008 HOST IFをclk_outに変更 //Mar.7.2008 reset 不定バグFix `timescale 1ns / 1ps module ddr_controller( input async_reset,//非同期リセット //以下のHostから来る インターフェース 信号は、全て外部clk=Xtal 50MHz に同期している //HOSTへのOUTPUTは、100MHzPOSに同期 仮想 input clk_fm_host, input [31:0] input_address_fm_host,input_data_fm_host, input read_fm_host,write_fm_host, input [3:0] byte_enable_fm_host,//書き込みバイトEnable output reg [31:0] output_data_fm_controller, output reg fifo_full_fm_controller,//address full または Write Fifo Full output reg read_valid_fm_controller,initialize_end_fm_controller, output clk_out,//Mar.6.2008 //DDR インターフェース output [12:0] sd_a, inout [15:0] sd_dq, output[1:0] sd_ba, output sd_ras, sd_cas, sd_we, sd_udm, sd_ldm, inout sd_udqs, sd_ldqs, output sd_cs, sd_cke, sd_ck_n, sd_ck_p, input sd_ck_fb); `include "./ddr_cont_parameters.vh" wire clk50 ,clk100;//Mar.6.2008 wire logic0, logic1; wire dcm_locked; reg [INTERFACE_DATA_WIDTH-1 : 0] input_data; reg [INTERFACE_MASK_WIDTH-1 : 0] input_mask; reg read_write; reg [USER_INPUT_ADDRESS_WIDTH-1 : 0] input_address; reg reset; reg addr_fifo_wren; reg wrdata_fifo_wren; wire addr_fifo_full; wire wrdata_fifo_full; wire rddata_valid; wire initialize_end; wire [QUANTITY_OF_CLK_OUTPUT-1 : 0] ddr_clk; wire [QUANTITY_OF_CLK_OUTPUT-1 : 0] ddr_clkb; wire ddr_cke; wire [DDR_DQS_DM_WIDTH-1 : 0] ddr_dqs; wire [DDR_DATA_WIDTH-1 : 0] ddr_dq; wire ddr_csb; wire ddr_rasb; wire ddr_casb; wire ddr_web; wire [DDR_DQS_DM_WIDTH-1 : 0] ddr_dm; wire [1:0] ddr_ba; wire [DDR_ADDRESS_WIDTH-1 : 0] ddr_address; wire [15:0] DDR_write_data, DDR_read_data; wire read_ddr_cont; wire [INTERFACE_DATA_WIDTH-1 : 0] output_data; reg read_write_node, addr_fifo_wren_node, wrdata_fifo_wren_node; wire reset_ddr_cont; assign logic0 = 1'b0; assign logic1 = 1'b1; dcm100 dcm100_inst( .CLKIN_IN(clk_fm_host), .RST_IN(logic0), .CLKIN_IBUFG_OUT(), .CLK0_OUT(clk50), .CLK2X_OUT(clk100), .LOCKED_OUT(dcm_locked) ); assign reset_ddr_cont = reset | (~dcm_locked); ddr_sdram_cont ddr_sdram_cont_inst ( .clk_in(clk100), .clk_out(clk_out), .clk_fb(sd_ck_fb), .reset(reset_ddr_cont), .input_data(input_data), .input_mask(input_mask), .read_write(read_write), .output_data(output_data), .input_address(input_address), .addr_fifo_wren(addr_fifo_wren), .wrdata_fifo_wren(wrdata_fifo_wren), .addr_fifo_full(addr_fifo_full), .wrdata_fifo_full(wrdata_fifo_full), .rddata_valid(rddata_valid), .initialize_end(initialize_end), .ddr_clk(ddr_clk), .ddr_clkb(ddr_clkb), .ddr_cke(ddr_cke), .ddr_dqs({sd_udqs, sd_ldqs}), .ddr_dq(sd_dq), .ddr_csb(ddr_csb), .ddr_rasb(ddr_rasb), .ddr_casb(ddr_casb), .ddr_web(ddr_web), .ddr_dm(ddr_dm), .ddr_ba(ddr_ba), .ddr_address(ddr_address) ); //Host に返すラインは、全てclk100 ↑に同期させる always @(*) begin//Mar.6.2008 output_data_fm_controller = output_data; fifo_full_fm_controller =wrdata_fifo_full | addr_fifo_full; read_valid_fm_controller =rddata_valid; output_data_fm_controller =output_data; initialize_end_fm_controller =initialize_end; end //Hostから来るデータは、全てclk100 INPUT SCEW対策の↓に同期させる。Input Scewは、2.5nsまで大丈夫。 always @(negedge clk_out) begin input_mask <= ~byte_enable_fm_host; input_data <= input_data_fm_host; input_address<=input_address_fm_host; read_write <=!write_fm_host; end //Mar.8.2008 always @(*) begin reset=async_reset; end always @(*) begin //Mar.6.2008 negedge clk100,posedge async_reset) begin if (async_reset) begin addr_fifo_wren=0; end else if (!addr_fifo_wren && (write_fm_host || read_fm_host) ) begin addr_fifo_wren=1; end else begin addr_fifo_wren=0; end end //clk_outで同期させるので廃止 Host 50MHzに対しコントローラは、100MHzなので、50MHz1CLK が100MHzでは2CLKになってしまう。その補償回路 always @(*) begin //Mar.6.2008 negedge clk100,posedge async_reset) begin if (async_reset) begin wrdata_fifo_wren=0; end else if (!wrdata_fifo_wren && write_fm_host) begin wrdata_fifo_wren=1; end else begin wrdata_fifo_wren=0; end end assign sd_ck_n = ddr_clkb[0]; assign sd_ck_p = ddr_clk[0]; assign sd_cke = ddr_cke; assign sd_cs = ddr_csb; assign sd_a = ddr_address; assign sd_ras = ddr_rasb; assign sd_cas = ddr_casb; assign sd_we = ddr_web; assign sd_udm = ddr_dm[1]; assign sd_ldm = ddr_dm[0]; assign sd_ba = ddr_ba; endmodule