時鍾分頻方法---verilog代碼


時鍾分頻方法---verilog代碼

本文以SDI播出部分的工程為例,來說明一種時鍾分頻的寫法。SD-SDI工程中播出時鍾tx_usrclk148.5MHz,tx_video_a_y_in端的數據采樣與tx_ce(門控時鍾)有關。通過對tx_usrclk時鍾進行分頻,5clocks---6clocks---5clocks---6clocks,得到tx_ce信號。

 verilog代碼寫法如下:

 

reg [2:0]   tx_ce = 3'b111;
reg         tx_sd_ce = 1'b0;
reg  [10:0] tx_gen_sd_ce = 11'b00000100001;    // Generates 5/6/5/6 cadence SD-SDI TX clock enable
wire        tx_ce_mux;                         // Used to generate the tx_ce signals
//
// TX clock enable generator
//
// sd_ce runs at 27 MHz and is asserted at a 5/6/5/6 cadence
// tx_ce is always 1 for 3G-SDI and HD-SDI and equal to sd_ce for SD-SDI
//
// Create 3 identical but separate copies of the clock enable for loading purposes.
//
always @ (posedge tx_usrclk)
    if (tx_fabric_reset)              //復位信號來源於?
        tx_gen_sd_ce <= 11'b00000100001;
    else
        tx_gen_sd_ce <= {tx_gen_sd_ce[9:0], tx_gen_sd_ce[10]};   //此段代碼用於產生

always @ (posedge tx_usrclk)
    tx_sd_ce <= tx_gen_sd_ce[10];

assign tx_ce_mux = tx_mode == 2'b01 ? tx_gen_sd_ce[10] : 1'b1;

always @ (posedge tx_usrclk)
    tx_ce <= {3 {tx_ce_mux}};

 

重點關注tx_gen_sd_ce = 11'b00000100001信號,用來生成5/6/5/6序列。

always @ (posedge tx_usrclk)
    if (tx_fabric_reset)              //復位信號來源於?
        tx_gen_sd_ce <= 11'b00000100001;
    else
        tx_gen_sd_ce <= {tx_gen_sd_ce[9:0], tx_gen_sd_ce[10]};   //此段代碼用於產生
always @ (posedge tx_usrclk)
    tx_sd_ce <= tx_gen_sd_ce[10];

每當tx_usrclk上升沿到來時,tx_gen_sd_ce左移一位,最高位移到最低位。tx_sd_ce取tx_gen_sd_ce的最高位,需要注意的是:tx_gen_sd_ce 和tx_sd_ce是同時變化的,都由tx_usrclk上升沿控制。

當tx_gen_sd_ce = 10000100000時,tx_sd_ce為高電平,由此開始,當下一次tx_sd_ce為高電平時,tx_gen_sd_ce = 10000010000需要花費5clocks,當tx_sd_ce再次為高電平時,tx_gen_sd_ce = 10000100000需要花費6clocks,循環下去,由此就產生了5/6/5/6序列。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM