【fpga基础学习篇】基于fpga通过sdio模式读取sd卡的bmp图像并通过HDMI定时显示出来

1.sdio 模式

1bit sdio :1个sdclk只读取1bit数据通过sddata0,同时sddata0~sddata3需要输出高电平

4bit sdio :这里需要发送ACMD6去选择总线模式,每一个时钟周期读取4bit数据,输出顺序是sddata3,sddata2,sddata1,sddata0。

上板效果看这里

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
FPGA读写SD卡Verilog设计逻辑Quartus工程源码文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module top_sd_rw( input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //SD卡接口 input sd_miso , //SD卡SPI串行输入数据信号 output sd_clk , //SD卡SPI时钟信号 output sd_cs , //SD卡SPI片选信号 output sd_mosi , //SD卡SPI串行输出数据信号 //LED output [3:0] led //LED灯 ); //wire define wire clk_ref ; wire clk_ref_180deg ; wire rst_n ; wire locked ; wire wr_start_en ; //开始写SD卡数据信号 wire [31:0] wr_sec_addr ; //写数据扇区地址 wire [15:0] wr_data ; //写数据 wire rd_start_en ; //开始写SD卡数据信号 wire [31:0] rd_sec_addr ; //读数据扇区地址 wire error_flag ; //SD卡读写错误的标志 wire wr_busy ; //写数据忙信号 wire wr_req ; //写数据请求信号 wire rd_busy ; //读忙信号 wire rd_val_en ; //数据读取有效使能信号 wire [15:0] rd_val_data ; //读数据 wire sd_init_done ; //SD卡初始化完成信号 //***************************************************** //** main code //***************************************************** assign rst_n = sys_rst_n & locked; //锁相环 pll_clk u_pll_clk( .areset (1'b0 ), .inclk0 (sys_clk ), .c0 (clk_ref ), .c1 (clk_ref_180deg), .locked (locked ) ); //产生SD卡测试数据 data_gen u_data_gen( .clk (clk_ref), .rst_n (rst_n), .sd_init_done (sd_init_done), .wr_busy (wr_busy), .wr_req (wr_req), .wr_start_en (wr_start_en), .wr_sec_addr (wr_sec_addr), .wr_data (wr_data), .rd_val_en (rd_val_en), .rd_val_da
FPGA读写SD卡读取BMP图片通过LCD显示例程实验 Verilog逻辑源码Quartus工程文件+文档说明,FPGA型号Cyclone4E系列中的EP4CE6F17C8,Quartus版本17.1。 1 实验简介 在前面的实验中我们练习了 SD 卡读写,VGA 视频显示等例程,本实验将 SD 卡里的 BMP 图 片读出,写入到外部存储器,再通过 VGA、LCD 等显示。 本实验如果通过液晶屏显示,需要有液晶屏模块。 2 实验原理 在前面的实验中我们在 VGA、LCD 上显示的是彩条,是 FPGA 内部产生的数据,本实验将彩 条替换为 SD 内的 BMP 图片数据,但是 SD 卡读取速度远远不能满足显示速度的要求,只能先写 入外部高速 RAM,再读出后给视频时序模块显示 module top( input clk, input rst_n, input key1, output [5:0] seg_sel, output [7:0] seg_data, output vga_out_hs, //vga horizontal synchronization output vga_out_vs, //vga vertical synchronization output[4:0] vga_out_r, //vga red output[5:0] vga_out_g, //vga green output[4:0] vga_out_b, //vga blue output sd_ncs, //SD card chip select (SPI mode) output sd_dclk, //SD card clock output sd_mosi, //SD card controller data output input sd_miso, //SD card controller data input output sdram_clk, //sdram clock output sdram_cke, //sdram clock enable output sdram_cs_n, //sdram chip select output sdram_we_n, //sdram write enable output sdram_cas_n, //sdram column address strobe output sdram_ras_n, //sdram row address strobe output[1:0] sdram_dqm, //sdram data enable output[1:0] sdram_ba, //sdram bank address output[12:0] sdram_addr, //sdram address inout[15:0] sdram_dq //sdram data ); parameter MEM_DATA_BITS = 16 ; //external memory user interface data width parameter ADDR_BITS = 24
在Linux中,可以使用SDIO驱动程序通过SDIO接口读取和写入SDIO设备中的寄存器。 首先,需要在Linux内核中启用SDIO子系统和SDIO驱动程序。然后,可以使用Linux提供的SDIO驱动程序接口函数来进行寄存器的读写操作。下面是一个简单的示例代码: ``` #include <linux/mmc/sdio.h> struct sdio_func *func; // 定义一个SDIO设备结构体 // 初始化SDIO设备 int sdio_init(void) { int ret; // 根据SDIO设备的厂商ID、设备ID和函数ID等信息,获取SDIO设备的结构体 func = sdio_get_func(0, 1); if (!func) { printk(KERN_ERR "Failed to get SDIO function\n"); return -ENODEV; } // 使能SDIO设备的总线控制器 ret = sdio_enable_func(func); if (ret) { printk(KERN_ERR "Failed to enable SDIO function\n"); return ret; } return 0; } // 读取SDIO设备的寄存器 int sdio_read_reg(u8 func_num, u32 addr, u8 *buf, u32 len) { int ret; // 设置SDIO命令 struct sdio_command cmd = { .opcode = SD_IO_RW_DIRECT, // 读写寄存器的命令码 .arg = (func_num << 28) | (addr << 9) | 0x01, // 设置命令的参数,包括函数号、寄存器地址和寄存器长度 .flags = SDIO_CMD_READ, // 读取数据 .resp_type = SDIO_RESPONSE_SHORT, // 短响应 .busy_timeout = 1000, // 超时时间 }; // 发送SDIO命令 ret = sdio_send_command(func, &cmd); if (ret) { printk(KERN_ERR "Failed to send SDIO command\n"); return ret; } // 读取SDIO数据 ret = sdio_readsb(func, buf, len); if (ret) { printk(KERN_ERR "Failed to read SDIO data\n"); return ret; } return 0; } ``` 这个示例代码中,`sdio_init()`函数用于初始化SDIO设备,`sdio_read_reg()`函数用于读取SDIO设备的寄存器。在`sdio_read_reg()`函数中,首先设置SDIO命令,然后通过`sdio_send_command()`函数发送SDIO命令,最后通过`sdio_readsb()`函数读取SDIO数据。在实际的应用中,还需要根据SDIO设备的协议和寄存器地址等信息进行相应的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值