zynq利用bram向sd卡写文件

最近做了zynq7020的bram进行sd卡读写文件的实验,vivado版本为2022.1,由于xilffs的配置问题检查错误了很久,在此进行一个简单的记录,希望对大家有一定的帮助。

1. 在vivado中按照教程配置好ip核以及参数输出含bitstraem的文件,用vitis创建空c工程

2. 初始化bram驱动

void bram_start(void)	//初始化BRAM驱动
{
	//bram初始化
	XBram bram_inst; //BRAM驱动实例
	XBram_Config *bram_cfg_ptr; //BRAM配置信息
	bram_cfg_ptr = XBram_LookupConfig(XPAR_BRAM_0_DEVICE_ID);  //查找BRAM信息
	XBram_CfgInitialize(&bram_inst,bram_cfg_ptr,bram_cfg_ptr->CtrlBaseAddress);  //初始化
	XBram_SelfTest(&bram_inst, 0);  //自检
}

3. 新建一个数组,用来存需要写进sd卡的数据

//read data
u32 read_data_arr[65536];
int read_data;
for(i = 0; i < 65536; i ++)
{
	read_data = XBram_ReadReg(BaseAddress, bram_data_offset);
	bram_data_offset = bram_data_offset + 4;
	read_data_arr[i] = read_data;
}

4. 挂载sd卡,将数组数据写进sd卡指定路径,并读出数据进行验证

rc = f_mount(&fatfs, "0:/", 0);  //将文件系统挂载到驱动器"1:"上
	if (rc != FR_OK)
	  {
		xil_printf("mount failed!\r\n");
		return XST_FAILURE ;
	}

	file_write(&fil, FILE_PATHA, read_data_arr, 4096*4, FA_OPEN_APPEND|FA_WRITE);
	// 调用设置时间戳的函数,传递文件路径
	set_timestamp("0:/test_filename_a.dat"); // 由于使用zynq7020无timeset函数自定义时间戳函数

	file_read(&fil, FILE_PATHA, read_datatest_arr, FA_OPEN_ALWAYS|FA_READ);

	f_unmount("0:/");
	if (rc != FR_OK)
	{
		xil_printf("unmount failed!\r\n");
		return XST_FAILURE ;
	}

5. sd卡内部文件的读写操作代码实现

#define USER_FILE_READ_SIZE_MAX 65536
#define USER_FILE_WRITE_SIZE 65536

int file_read(FIL *fil, TCHAR* path, u32 *buf, u8 mode)
{
	FRESULT res ;
	unsigned int br;
	res = f_open(fil, path,  mode);
	if(res != FR_OK)
	{
		xil_printf("Open file failed!\r\n");
		return XST_FAILURE ;
	}

	res = f_read(fil, buf, USER_FILE_READ_SIZE_MAX, &br);
	if(res != FR_OK)
	{
		xil_printf("read file failed!\r\n");
		return XST_FAILURE;
	}

	f_close(fil);
	return XST_SUCCESS;
}

int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode)
{
	FRESULT res ;
	unsigned int br;
	res = f_open(fil, path, mode);
	if(res != FR_OK)
	{
		xil_printf("Create file failed!\r\n");
		return XST_FAILURE ;
	}
	res = f_write(fil, buf, len, &br) ;
	if(res != FR_OK)
	{
		xil_printf("Write file failed!\r\n");
		return XST_FAILURE ;
	}

	f_close(fil);
	return XST_SUCCESS;
}

6. 自定义时间戳函数

time_config current_time =  {  //可自定义
    		2024,
			1,
			18,
			12,
			23,
			45,
			3

    };

int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode);

void set_timestamp(char* path)
{
    FILINFO fno;
    // 获取当前时间
    fno.fdate = (WORD)(((current_time.Year - 1980) * 512U) | current_time.Month * 32U | current_time.Day);
    fno.ftime = (WORD)(current_time.Hour * 2048U | current_time.Min * 32 | current_time.Sec / 2U);

    f_utime(path, &fno);
}

7. 注意:该zynq7020芯片在实现sd卡的读写时,他vitis里面对于xilffs的设置应该如下才能实现读写操作(我按照教程给的实现不了读写操作,读进去无数据)

在Vivado环境下编实现8个8位寄存器的设计文件通常涉及到Xilinx System Generator (XSG)或者Verilog HDL语言。这里我将以System Generator为例,给出一个简单的步骤和部分伪代码描述: 1. **项目启动**: - 打开Vivado,创建一个新的HDL设计项目(例如,选择"New Project" -> "Zynq Microzed Platform"),然后选择System Generator作为设计工具。 2. **创建模块**: - 在System Generator里,点击"Create Block Diagram",创建一个新的块图(Block Diagram)。这将是你整个系统的核心。 3. **添加存储元件**: - 双击"Storage"选项,选择"RAM"或"BRAM",并设置大小为8 * 8 bits(每个寄存器8位,总共有8个)。将其命名为"Registers"或者相应的名称。 4. **编驱动程序**: - 右键点击寄存器,添加"Signal Bus Interface"来连接到外部输入信号。这可以让你通过外部接口读取和修改寄存器值。 5. **编逻辑**: - 添加"State Machine"或"Assignment Logic",根据需要编读和的操作。比如,你可以创建两个状态(如"Read"和"Write"),对应于寄存器的读取和入功能。 6. **封装为IP核**: - 在"Generate IP"菜单下,生成硬件描述语言(HDL)源代码。对于Verilog,你可能会得到一个.vhd文件。 7. **配置和实施**: - 在Vivado的Project Navigator中,右键单击刚生成的IP核,选择"Implement"和"Generate Bitstream"来完成设计实施和下载到目标板。 **伪代码示例**(仅用于理解,实际编码应使用System Generator提供的UI或代码模板): ```verilog module register_bank ( input wire [7:0] data_in, output reg [7:0] data_out, input wire clk, input wire enable ); RegFile registers(8'b0, clk, enable); // 存储单元 assign data_out = registers.read(data_in); // 读取数据 always @(posedge clk or posedge enable) begin if (enable) registers.write(data_in); // 入数据 end endmodule ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值