SD_CLK部分

module sd_clk (
   input  wire         hclk,
   input  wire         hrst_n,
   input  wire  [7:0]  in_clk_divider,
   input  wire         in_sd_clk_enable,
   input  wire         hw_stop_clk,

   output wire         out_sd_clk_dft,
   output wire         fifo_sd_clk,

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

//----------------------------------------------------------------
// Beginning of main code
//----------------------------------------------------------------
//Overview of the SDCLK generator operation
//The following key signals are used in the rx fifo:-
//hclk is the clk of AHB
//in_clk_divider is the divider if hclk
//in_sd_clk_enable is the output enable SDCLK
//out_sd_clk is the SDCLK for sd card

//----------------------------------------------------------------
//Divide HCLK frequency
//----------------------------------------------------------------

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

always @ (posedge hclk or negedge hrst_n)
begin
   if (hrst_n == 0)
      out_sd_clk <= 1'b0;
   else if (clk_ena_stop || divider_0_val)
      out_sd_clk <= 1'b0;
   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 == 0)
      div_counter <= 8'b0;
   else if (clk_ena_stop || divider_0_val)
      div_counter <= 8'b0;
   else 
      begin
         if (div_counter == in_clk_divider - 1)
            div_counter <= 8'h0;
         else
            div_counter <= div_counter + 1;
      end
end

//MUX2D2BWP7T U_mux_sd_clk (.Z(fifo_sd_clk), .I0(out_sd_clk), .I1(hclk), .S(divider_0_val));
//MUX2D2BWP7T U_sd_clk_tp (.Z(out_sd_clk_tp), .I0(fifo_sd_clk), .I1(1'b0), .S(clk_ena_stop));
//MUX2D2BWP7T U_sd_clk_out (.Z(out_sd_clk_dft), .I0(out_sd_clk_tp), .I1(hclk), .S(in_TestMode));

MX2X2 U_mux_sd_clk (.Y(fifo_sd_clk), .A(out_sd_clk), .B(hclk), .S0(divider_0_val));
//MX2X2 U_sd_clk_tp (.Y(out_sd_clk_tp), .A(fifo_sd_clk), .B(1'b0), .S0(clk_ena_stop));
TLATNTSCAX4 U_cg_sd_clk (.ECK(out_sd_clk_dft), .SE(1'b0), .E(!clk_ena_stop), .CK(fifo_sd_clk));
MX2X2 U_sd_clk_out (.Y(out_sd_clk_dft), .A(out_sd_clk_tp), .B(hclk), .S0(in_TestMode));

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

endmodule

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值