SD-Host SD_CLK模块

hclk的分频电路,得到的分频时钟作为sd卡时钟。

SD 2.0规范中要求SD卡在identification阶段时钟频率不得超过400KHz,而在数据传输阶段时钟频率最高可达50MHz(高速传输模式),因此SD卡控制器输出的SD CLK频 必须是可控的。
在这里插入图片描述
在这里插入图片描述

由于系统AHB的时钟频率通常远高于SD卡工作的时钟频率, 因此可将AHB时钟分频的来实现对SDCLK频率的控制。 除控制SDCLK频率外,该模块还可以在适当的时候将SD CLK输出锁定为低电平,并在恰当的时候解除锁定。

如在发送数据时如果CPU向FIFO 中填充数据的速度不够快将导致FIFO被读空,若继续输出SDCLK时钟脉冲将导 致SD卡采到错误的数据,此时SDCLK控制模块会将SDCLK输出锁定在低电平使传输暂停,直到CPU向FIFO中填入新数据后再输出SD CLK时钟

在这里插入图片描述
信号描述:

SignalsI/OWidthfromtoDeclaration
hclkinput1AHB bus时钟信号
hrst_ninput1AHB bus复位信号
in_clk_dividerinput[7:0]sd_if分频关系
in_sd_clk_enableinput1sd_if分频使能
hw_stop_clkinput1sd_if硬件停时钟使能,一个blcok操作后
out_sd_clk_dftoutput1频率输出(dft模式下输出)
fifo_sd_clkoutput1sd domain clock
in_TestModeinput1测试模式(dft模式)

代码实现:

module sd_clk(
    hclk,
    hrst_n,
    in_clk_divider,
    in_sd_clk_enable,
    hw_stop_clk,
    
    out_sd_clk_dft,
    fifo_sd_clk,

    in_TestMode
);
input       in_TestMode;
input       hclk;
input       hrst_n;
input [7:0] in_clk_divider;
input       in_sd_clk_enable;
input       hw_stop_clk;
output      fifo_sd_clk;
output      out_sd_clk_dft;

reg         out_sd_clk;
reg [7:0]   div_counter;
wire        divider_0_val;
wire        out_sd_clk_tp;
wire        clk_ena_stop;

assign  divider_0_val = (in_clk_divider == 8'b0 );
assign  clk_ena_stop = (!in_sd_clk_enable || hw_stop_clk);

always@(posedge hclk or negedge hrst_n) begin
    if(!hrst_n)
        out_sd_clk <= 8'b0;
    else if (clk_ena_stop)
        out_sd_clk <= out_sd_clk;
    else if (divider_0_val)
        out_sd_clk <= hclk;
    else if (div_counter == in_clk_divider-1)
        out_sd_clk <= ~out_sd_clk;
end

always@(posedge hclk or negedge hrst_n) begin
    if(!hrst_n)
        div_counter <= 8'b0;
    else if ( clk_ena_stop || div_0_val)
        div_counter <= 8'b0;
    else begin
        if(div_counter == in_clk_divider-1)
            div_counter <= 8'b0;
        else
            div_counter <= div_counter + 1;
    end
end

assign fifo_sd_clk = divider_0_val? hclk : out_sd_clk;
assign out_sd_clk_dft = (!in_sd_clk_enable || hw_stop_clk) ? 
                            1'b0 : (in_TestMode) ? 
                            hclk : (in_clk_divider == 8'b0) ?
                            hclk : out_sd_clk;

endmodule
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值