⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_host.v

📁 基于FPGA的SD控制器实现.目前实现读操作功能,可作参考.
💻 V
字号:
//Written by Vladimir Boykov//Last modification August, 2005module sd_host (clk, base_clock, reset, chipselect, address,                 maddress, byteenable, mwritedata, mwrite, waitrequest,                read, readdata, write, writedata, irq,                clk_to_SD, cmd_SD, data_SD);//Avalon Master Interface               output [31:0] maddress;output [31:0] mwritedata;output mwrite;output [3:0] byteenable;input waitrequest;                //Avalon Slave Interfaceinput clk;                 //System clockinput base_clock;          //Input 25 MHzinput reset;               //Global resetinput chipselect;          //ChipSelectinput [2:0] address;       //Address for access to internal registers, fifoinput read;                //Read request signaloutput [31:0] readdata;    //Data line for read transfer from SDinput write;               //Write request signalinput [31:0] writedata;    //Data line for write transfer to SDoutput irq;//SD Host Interfaceoutput clk_to_SD;          //Clock to SD Cardinout cmd_SD;              //Command/Response to/from SD Cardinout [3:0] data_SD;       //Data line to/from SD Card//Internal Wireswire internal_register_data; //Addres > 5'b00001wire RAMaddress_req, IRQ_disable_req;wire sd_controller_clock;    //Clock to SD controllerwire aclear_rb;              //Clear read bufferwire write_to_buf;           //Write from read_bufferwire [31:0]  from_sd_controller_data; //Output from SD controllerwire [31:0] manreg;          //Internal register of SD controller//Address selectorassign  RAMaddress_req =  ((address==3'b000) && chipselect && write)? 1 : 0;assign  IRQ_disable_req =  ((address==3'b001) && chipselect && write)? 1 : 0;assign internal_register_data = ((address != 3'b000) && (address != 3'b001) && chipselect)? 1 : 0;assign readdata = (internal_register_data && read)? manreg : 32'bz;assign clk_to_SD = ~base_clock;assign sd_controller_clock = base_clock;//Master's variablesreg [31:0] temp, startRAMaddress;reg [3:0] com;reg [7:0] num;reg wr;reg irq_enable;assign maddress = (startRAMaddress + {22'd0, num, 2'b00});assign byteenable = 4'b1111;assign mwrite = wr;assign mwritedata = temp;assign irq = irq_enable;always @ (posedge clk or posedge reset) begin   if (reset) begin      irq_enable <= 1'b0;   end else begin      if (num==8'd128) irq_enable <= 1'b1;      else if(IRQ_disable_req) irq_enable <= 1'b0;   endendalways @ (posedge clk or posedge reset) begin   if (reset) begin      startRAMaddress <= 32'd0;   end else begin      if (RAMaddress_req) startRAMaddress <= writedata;   endendalways @ (posedge clk or posedge reset or posedge aclear_rb) begin   if (reset || aclear_rb) begin      temp <= 32'd0;      num <= 8'd0;      wr <= 1'b0;      com <= 3'd7;   end else begin      case (com)         3'd0: begin            wr <= 1'b1;            com <= 3'd1;         end         3'd1: begin            if (!waitrequest) begin               wr <= 1'b0;               num <= num + 8'd1;               com <= 3'd2;            end         end         3'd2: begin            com <= 3'd3;         end         3'd3: begin            if (num == 8'd128) num <= 8'd0;            com <= 3'd4;         end         3'd4: begin            com <= 3'd5;         end         3'd5: begin            com <= 3'd6;         end         3'd6: begin            com <= 3'd7;         end         3'd7: begin               if (write_to_buf) begin               temp <= from_sd_controller_data;               com <= 3'd0;            end         end      endcase   endend                                              //SD card Controllersd_controller SD (                  .sys_clk(clk),                   .sd_clk(sd_controller_clock),                  .reset(reset),                  .cs(chipselect),                  .sd_cmd(cmd_SD),                  .address(address),                  .sd_data(data_SD),                  .data_input(writedata),                  .data_output(from_sd_controller_data),                  .write_to_buffer(write_to_buf),                   .write(write),                  .read(read),                  .int_reg(manreg),                  .clear (aclear_rb)                 );                             endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -