微架构设计思路
- ahb_slave_if中的寄存器可以在datasheet中进行描述
- sd_clk - 时钟产生模块的接口描述
- sd_data_fsm和sd_cmd_fsm - 状态机描述
- 发送时序需要遵守,并且在发送的时候需要产生CRC
- 接受时序需要遵守,并且要接收CRC,进行比较
- FiFo中有存储体存储数据,FiFo_ctrl模块进行fifo的控制
- DMA - AHB_master的设计
sd_clk设计
设计需求
- 具有分频电路,根据ahb_slave_if中寄存器的配置对hclk进行分频
- 硬件停止时钟
- 软件开关时钟
- 需要考虑在DFT模式下,时钟如何?
- 时钟分频,使用计数器进行时钟周期,实现分频;如果分频配置为0,表示使用原始时钟hclk进行输入
- 软硬件开关时钟,就是在使能信号的条件下,选择时钟的输入
- test mode下同样是在test_en的条件下,选择hclk,保证扫描链的时钟频率是一样的
sd_if模块功能
- ahb总线信号处理,进行地址和数据对齐
- 其中有一些寄存器,对寄存器及其中的地址域段进行读写操作
- 有两个时钟域,ahb时钟域和sd时钟域,进行时钟域的同步
sd_clk模块
- 允许软硬件干预时钟
- in_clk_divider - 分频大小,软件写寄存器配置的
- in_sd_clk_enable - 软件使能clk
- hw_stop_clk - 硬件使能(硬件在读的时候,进行数据搬移的时候,可以关闭时钟)
- out_sd_clk_dft - 输出clk
sd_clk模块:时钟输出描述
- 分频大小通过寄存器配置,如果分频寄存器为0,就输出原时钟
- sd_io - 是更通用的协议,可以连接Wifi设备或者GPS设备
sd_cmd_fsm
- 硬件检测sd card是否是busy
- 将一条命令(比如48bit)作为一个状态
- idle状态通过cpu trigger信号进入到wait send状态,此时通过硬件检查sd card是否处于busy状态,就是data总线的data[0]是否为1,转到wait resp状态,当cmd=0的时候,转到receive resp状态
sd_cmd_fsm模块:状态机控制图
- in_command_ready = 1表示cpu让硬件去发送cmd
- in_sd_dat[0] - 拉高之后,进位send状态
- wait response时间超过预设的值Ncr,给出timeout信号,进入state stop状态
- in_soft_reset - 软件复位,高电平有效
- in_response - 表示当前命令有没有resp
- in_longresponse - 回复长命令信号,R2类型的resp
- in_cmmmand_ready - 软件置位,硬件清0,启动状态机
- has_send_bit - 表示当前发送了多少位(48bit,6bit)
- in_sd_dat - 这里给了3bit,实际上只要0bit就可以了
- has_receive_bit - 表示当前已经接收的多少位(136bit,8bit)
- end_command - 命令结束信号
- end_command_and_response - 命令结束并且完成回复接收
- response_timeout - 响应超时信号,给到状态寄存器
sd_cmd_send_shift_register模块
- in_current_state - 处于特特定的状态才能发送数据
- has_send_bit - 用于判断当前的命令发送的是crc还是argument
- out_cmd_dir - 控制输出的方向,输入还是输出
- out_sd_cmd - 并行数据转换为串行数据,利用移位寄存器,每次输出最高位然后左移一位,
- 0-25MHz - 数据是在下降沿进行驱动的
- 50Hz - 数据驱动沿是上升沿
sd_cmd_recieve_shift_register模块
- in_serial_cmd - 接收sd card发送的cmd
- in_longrespone - 接收136bit resp
sd_data_fsm
posted @
2023-12-03 09:35
Icer_Newer
阅读(
40)
评论()
编辑
收藏
举报