Thông báo

Collapse
No announcement yet.

Làm cách nào để nhân chia lẻ cho xung clock?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • hithere123
    replied
    Xin phép chỉnh lại thiết kế của anh Tony một chút

    Nguyên văn bởi tonyvandinh Xem bài viết
    R : số còn; N : Tử số (3); D : mẫu số (7)

    R = 0
    Đầu :
    R = R + N;
    Nếu R >= D thì R = R - D và xung clock ra = 1
    Nếu không, xung clock ra = 0
    Tiếp tục lại từ Đầu cho mỗi nhịp của xung clock.

    Đường vô
    * Clock
    * Reset
    * N
    * D

    Đường ra
    * Clock_out
    Nếu R >= D thì R = R - D và enable = 1
    Nếu không, enable = 0

    Thêm một mạch "clock gate" có đầu vào là clock, enable nối vào enable ở trên và đầu ra là clock ra.
    Tuy nhiên "clock gate" ở đây không đơn thuần là một mạch AND đơn giản mặc dù chức năng là mạch AND. Vì với mạch logic AND rất dễ tạo glitch ở xung ra và xung sẽ không "đẹp" .
    Ý tưởng là như mạch anh mô tả ở trên nhưng có lợi hơn một chút vì có thể điều khiển được "strong" của xung ra. Nhưng yêu cầu phải thiết kế thêm cell "clock gate" nếu trong standard cell không có.

    Thân mến.

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Jeff không hiểu "MUX FF" ... Đoán ý anh là clock của FF vẫn dùng clock ban đầu còn clock-mới thì nối vào Enable của FF.
    Nếu vậy thì không được vì giả sử clock-mới ở mức cao nhiều hơn 1 chu kì của clock cũ thì FF sẽ được bật (enabled) trong 2 chu kì và sẽ không đúng so với khi nối clock-mới vào chân clock của FF.
    Chỉ làm được khi thêm 1 khối logic edge-detect ?

    if(rising_edge(clk)) then
    if(new_clk='1' and new_clk_d='0') then
    ff_en <= '1'; else
    ff_en <= '0';
    end if
    end if
    MUX FF hay enable FF là 2 tên gọi của FF mà khi enable thì đường ra sẽ lấy giá trị của đường vô khi xung clock active. Nếu không enable thì đường ra sẽ giữ giá trị cũ.

    Code:
    process (clk)
    begin
      if (rising_edge(clk)) then
        if (enable)
          q <= d;
        end if
      end if
    end process
    Giả thử xung đầu là 100MHZ, chia làm 5 cho ra 20MHZ. Xung ra 20MHZ ở "1" cho mỗi 5 nhịp của xung 100MHZ. Giả thử như dùng xung 20MHZ cho bộ đếm. Bộ đếm sẽ thay đổi khi xung clock 20MHZ đổi bậc. Nếu dùng xung clock 20MHZ cho enable và xung clock 100MHZ cho clock, bộ đếm cũng vẫn chỉ thay đổi khi xung clock 20MHZ ở "1"

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    Không có ảnh hưởng gì hết. Chỉ khó hơn khi dùng STA (Static Timing Analysis) để xác định thời gian. Tốt hơn hết thì chỉ nên dùng xung ra này cho chân enable của MUX FF. Tác dụng giống như khi dùng làm xung clock cho FF. Trong trường hợp dùng cho enable của MUX FF, chân clock vẫn nối vô xung nguồn và khi dùng STA thì constraint như multi-cycle path.
    Jeff không hiểu "MUX FF" ... Đoán ý anh là clock của FF vẫn dùng clock ban đầu còn clock-mới thì nối vào Enable của FF.
    Nếu vậy thì không được vì giả sử clock-mới ở mức cao nhiều hơn 1 chu kì của clock cũ thì FF sẽ được bật (enabled) trong 2 chu kì và sẽ không đúng so với khi nối clock-mới vào chân clock của FF.
    Chỉ làm được khi thêm 1 khối logic edge-detect ?

    if(rising_edge(clk)) then
    if(new_clk='1' and new_clk_d='0') then
    ff_en <= '1'; else
    ff_en <= '0';
    end if
    end if

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Về mặt ASIC thì mình ko rành khi FF bị clock như vậy có ảnh hưởng gì không.
    Không có ảnh hưởng gì hết. Chỉ khó hơn khi dùng STA (Static Timing Analysis) để xác định thời gian. Tốt hơn hết thì chỉ nên dùng xung ra này cho chân enable của MUX FF. Tác dụng giống như khi dùng làm xung clock cho FF. Trong trường hợp dùng cho enable của MUX FF, chân clock vẫn nối vô xung nguồn và khi dùng STA thì constraint như multi-cycle path.

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi hithere123 Xem bài viết

    Thân mến.
    @Jeff: bạn nghĩ thế nào về khái niệm xung "đẹp". Giả sử mình chỉ quan tâm tới leakage và thiết kế hoạt động dựa trên sườn xung (edge) thì mình nghĩ là vẫn được vì khi tần số giảm thì leakage giảm (đạt yêu cầu) và STA vẫn đảm bảo vì STA đã đảm bảo cho tần số cao nhất rồi.
    Còn khi cần xung thật đẹp với duty cycle ~50% thì như anh Tony đã nói, phải nhân tần số xung lên sau đó chia lẻ để được xung lẻ có tần số cao sau đó chia chẵn (over flow như bạn nói) chắc chắn xung sẽ đẹp hơn (anh tony cũng đưa hình mô phỏng minh họa rồi) Tuy nhiên bạn lại tốn tài nguyên phần cứng để thực hiện việc nhân.

    Lúc đó mình nghĩ tới việc tạo ra 1 clock "hoàn mỹ" . Nên mình hiểu đẹp là duty cycle 50% với jitter nhỏ.
    Như anh Tony nói, cần xung đẹp thì tùy trường hợp, khi dùng double-data-rate sẽ bị ảnh hưởng. Một khi rõ việc mình cần làm thì không có sao.
    Còn Jitter lớn sẽ ảnh hưởng khi dùng clock này cho ADC chẳng hạn, các mẫu lấy được sẽ bị nhiễu, không tốt trong hệ thống communication. Một lần nữa một khi rõ việc mình cần làm thì không có sao hết àh.

    Về mặt ASIC thì mình ko rành khi FF bị clock như vậy có ảnh hưởng gì không.

    Leave a comment:


  • tonyvandinh
    replied
    Duty cycle

    Thật sự chu kỳ Xấu/Đẹp và ảnh hưởng của nó tùy theo là dùng như thế nào. Có hai trường hợp để suy đoán:

    1) Source synchronous timing (kô biết tiếng Việt gọi là gì). Trong trường hợp này thì khi gửi tin tức data và xung clock được gửi đi đôi với nhau. Nếu chỉ dùng một cạnh của xung clock thì duty cycle hay sự thay đổi đột ngột của xung clock không có ảnh hưởng gì đến sự chính xác của thu nhận tin tức. Nếu khối nhận dùng 2 cạnh của xung clock thì duty cycle sẽ có một vài ảnh hưởng về thời gian.

    2) Communication - Chỉ có data được modulate (xung clock ẩn trong data). Khối nhận phải dò trên biến động của data để lấy ra xung clock ẩn đó. Ví dụ chơi bắn súng trên những vật di động, bạn phải quan sát tốc độ và sự thay đổi của sự di động để đoán trước và bắn cho chính xác. Sự theo dõi, theo đuổi này trên data communication thường được hiện thực bằng Phase Lock Loop (PLL, thiết kế dùng phản hồi để giữ sự liên hệ qua những cạnh của data). Vì vậy sự thay đổi đột ngột của data vì xung clock thay đổi sẽ làm khó khăn cho PLL. PLL chi có hiệu nghiệm khi sự thay đổi từ từ. Giống như bắn súng, vật di động càng chậm càng dễ bắn trúng chừng đó. Khi độ thay đổi nhanh thì PLL chỉ có hiệu nghiệm nếu khoảng cách thay đổi ngắn.

    Leave a comment:


  • hithere123
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết

    0 + 3 = 3 (<7)
    3 + 3 = 6 (<7)
    6 + 3 = 9 (>7) - 7 = 2 (*)
    2 + 3 = 5 (<7)
    5 + 3 = 8 (>7) - 7 = 1 (*)
    1 + 3 = 4 (<7)
    4 + 3 = 7 (==7) - 7 = 0 (*)
    Bây giờ mới hiểu cái mặt cười của anh Tony ở bài viết #9. Trong dãy số em tính bị sai vì em nghĩ từ 000 --> 111 có tất cả là 8 xung nên tính 0,3,6,9-8=1,4, . . . đúng là làm digital mà vẫn cứ giữ cái mind analog thi đúng là . (một sai lầm cơ bản về số học)

    Chúc anh cuối tuần vui vẻ!

    Thân mến.
    @Jeff: bạn nghĩ thế nào về khái niệm xung "đẹp". Giả sử mình chỉ quan tâm tới leakage và thiết kế hoạt động dựa trên sườn xung (edge) thì mình nghĩ là vẫn được vì khi tần số giảm thì leakage giảm (đạt yêu cầu) và STA vẫn đảm bảo vì STA đã đảm bảo cho tần số cao nhất rồi.
    Còn khi cần xung thật đẹp với duty cycle ~50% thì như anh Tony đã nói, phải nhân tần số xung lên sau đó chia lẻ để được xung lẻ có tần số cao sau đó chia chẵn (over flow như bạn nói) chắc chắn xung sẽ đẹp hơn (anh tony cũng đưa hình mô phỏng minh họa rồi) Tuy nhiên bạn lại tốn tài nguyên phần cứng để thực hiện việc nhân.
    Last edited by hithere123; 24-04-2010, 16:03. Lý do: thêm chi tiết

    Leave a comment:


  • jefflieu
    replied
    Uh, cách làm này Jeff mới biết, trước giờ làm NCO thì max chỉ được fout=fin/2 ...
    Chỉ khác chút là NCO dùng modulo n = 2^b (b=số bít của bộ đếm) ... nên tự động bộ đếm overflow mà không cần làm gì ... làm kiểu a Tony thì là dùng modulo lẻ ...
    Nhưng chung quy thì xem ra fout<=0.5 fin mới đẹp được.... Tại sao vậy nhỉ?

    Leave a comment:


  • tonyvandinh
    replied
    Nhân, Chia căn bản

    Để tiếp tục trên vấn đề nhân/chia xung clock, tôi xin trở lại căn bản của nhân và chia.

    Giả sử như muốn nhân một số nào đó (a) với một số khác (b) thì có 2 cách:

    1) a + a + ... + a (làm b lần)
    2) b + b + ... + b (làm a lần)

    Xung clock có sự tuần tự cho nên nếu nhân với một số nào đó thì giống như số đó cộng liên tiếp cho mỗi nhịp của xung clock.

    Tương tự như nhân, nếu chia thì trừ đi. Có một ngoại lệ trong phần cứng là xung clock ra không thể nhanh hơn xung clock vào cho nên số chia phải lớn hơn 1 (hoăc là số nhân phải nhỏ hơn 1). Trong trường hợp chia cho 2.33333 (7/3) thì cũng giống như nhân 3 chia 7.

    Giả thử như bắt đầu số còn (R) là 0

    0 + 3 = 3 (<7)
    3 + 3 = 6 (<7)
    6 + 3 = 9 (>7) - 7 = 2 (*)
    2 + 3 = 5 (<7)
    5 + 3 = 8 (>7) - 7 = 1 (*)
    1 + 3 = 4 (<7)
    4 + 3 = 7 (==7) - 7 = 0 (*)

    trở lại từ đầu. Như vậy là cứ 7 xung clock đi vào thì sẽ co 3 xung clock đi ra cho nên pseudo code có thể viết như sau:

    R : số còn; N : Tử số (3); D : mẫu số (7)

    R = 0
    Đầu :
    R = R + N;
    Nếu R >= D thì R = R - D và xung clock ra = 1
    Nếu không, xung clock ra = 0
    Tiếp tục lại từ Đầu cho mỗi nhịp của xung clock.

    Đường vô
    * Clock
    * Reset
    * N
    * D

    Đường ra
    * Clock_out

    Các bạn viết thử nhe. Chúc thành công.

    Leave a comment:


  • hithere123
    replied
    Dành cho bạn nào muốn hiểu PLL được thiết kế như thế nào trong IC:

    +analog PLL: http://www.cppsim.com/PLL_Lectures/analog_pll.pdf
    +digital PLL: http://www.cppsim.com/PLL_Lectures/digital_pll.pdf

    Một trang web tham khảo hữu ích : http://www.cppsim.com/index.html
    Mình cũng đã giới thiệu ở luồng analog IC design (#24) tuy nhiên mình thấy chủ đề này thích hợp hơn. Hy vọng đây là thông tin có ích.

    Thân mến.

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Ko rõ anh Tony du`ng gì để tạo clock 7/6 (Fout=6/7 Fin) ... A post code lên được ko?
    Tôi dùng systemC để thiết kế. Trước đây tôi đã post nhiều code dùng systemC nhưng không thấy ai có ý kiến hoặc câu hỏi gì cả. Không biết có ích lợi gì không nếu cứ tiếp tục post lên. Hiện giờ systemC đang được phổ biến ở các nước tân tiến và mong ước của tôi là làm cách nào để tạo điều kiện học hỏi về vấn đề này cho các bạn ở VN. Tôi đã cố gắng làm đủ mọi cách nhưng không biết có được hưởng ứng hay không. Tôi hơi thất vọng về vấn đề thụ động này khác với những hy vọng mà tôi có về VN là tinh thần hiếu học.

    Jeff hoặc bạn nào có ý tưởng để nghiên cứu thì email cho tôi. Tôi sẽ email code để nghiên cứu. Hy vọng mọi người thông cảm cho.

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    Trong trường hợp 7/3 thì x2 là đủ nhưng trong trường hợp 7/6 thì x2 duty cycle vẫn còn xấu lắm.

    x2


    x16
    Ko rõ anh Tony du`ng gì để tạo clock 7/6 (Fout=6/7 Fin) ... A post code lên được ko?

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Àh, hiểu rồi ... hoàn toàn đồng ý ... chỉ cần x2 lên trước là giải quyết được vấn đề.
    Trong trường hợp 7/3 thì x2 là đủ nhưng trong trường hợp 7/6 thì x2 duty cycle vẫn còn xấu lắm.

    x2


    x16
    Attached Files

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    @Jeff, Ví dụ như tôi muốn chia xung clock 10MHZ xuống 2.33333 (7/3) thì xung ra sẽ là 4.28571429MHZ. Nhưng thay vì dùng 10MHZ cho xung vào, tôi sẽ dùng 16x10MHZ = 160MHZ. Khi chia cho 7/3 thì mỗi 7 xung vào ở 160MHZ, sẽ có 3 xung ra (ví dụ : 1001001) tương đương với 68.5714286MHZ rồi chia xuống 16. Xung ra ở 68MHZ có thể không đẹp (theo duty cycle) nhưng khi chia xuống 16 lần thì duty cycle sẽ đẹp hơn. Hy vọng hình dưới đây sẽ làm dễ hiểu hơn

    Àh, hiểu rồi ... hoàn toàn đồng ý ... chỉ cần x2 lên trước là giải quyết được vấn đề.

    Leave a comment:


  • danbeo85
    replied
    Hi Các bạn,

    Như đã nói ở trên, mạch dùng NCO hay bộ counter để tạo xung cần để ý thêm vấn đề về phase của clock ngõ ra. Do đó lấy ví dụ của tony clock ban đầu là 10MHz, clock cho bộ đếm là 160MHz và bộ đếm có thể tạo clock ngõ ra 70/3 MHz với một độ lệch phase ấn định (có thể là 90, 180, 45, ...) trong khoảng cho phép dựa vào phase (dựa vào cạnh xung) của clock 10MHz.

    .^_^.

    Leave a comment:

Về tác giả

Collapse

tonyvandinh A high tech engineer Tìm hiểu thêm về tonyvandinh

Bài viết mới nhất

Collapse

Đang tải...
X