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
    Nguyên văn bởi tonyvandinh Xem bài viết
    Trễ 1 clock thì có ảnh hưởng gi?
    Okie anh,
    Đúng là trong trường hợp này trễ 1 clock không vấn đề gì
    Tiện thể xin phép anh tóm tắt hai ý em tham gia:
    [1] Clock gate dùng ở đây không phù hợp, cách 2 của anh hay hơn, vi em cũng toàn dùng cách này và silicon ra okie. Em đưa clock gate ra chỉ là muốn góp thêm một kỹ thuật hay dùng khi đụng tới clock thôi.
    [2] Em bảo lưu ý kiến không nên dùng logic AND vì chắc chắn có glitch.

    Thân mến.
    Last edited by hithere123; 25-04-2010, 23:03. Lý do: thêm chi tiết

    Leave a comment:


  • tonyvandinh
    replied
    Cám ơn sự hưởng ứng

    Để đúc kết đề tài này, tôi xin cám ơn sự hưởng ứng của các bạn, đặc biệt là bạn Jeff và hithere. Sự hưởng ứng của các bạn đã làm đề tài này thêm sôi nổi và đã nêu ra những khuyết điểm của thiết kế. Dù thiết kế hay cách mấy, vẫn có thể có khuyết điểm. Có khuyết điểm có thể khắc phục. Có cái chỉ là work around (khắc phục tạm?). Cho nên cần phải biết những giới hạn của thiết kế để dùng nó một cách thích hợp hơn.

    Tôi hy vọng các bạn sẽ tham gia những đề tài khác trong tương lai để mình cùng học hỏi thêm.

    Thân ái

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi hithere123 Xem bài viết
    Anh,
    Làm theo cách 2 thì đúng là sẽ không có glitch khi STA clean nhưng xung ra sẽ bị delay 1 clock. Anh xem lại thử.

    Thân.
    Trễ 1 clock thì có ảnh hưởng gi?

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Okie ...
    Cho riêng FPGA:
    1/ khuyến khích dùng DCM để tạo ra clock mới (worry free )
    2/ Khi dùng mạch đếm và logic tạo ra clock mới và khi muốn dùng clock mới này cho chân CLK của FF phải cẩn thận.
    Có rất nhiều cách để làm phân chia xung clock. Nếu có dư DCM để làm thì nên dùng DCM. Nói chung là phải tận dụng tất cả những gì đang có. Nhưng kô phải FPGA nào cũng có DCM và giá cả của FPGA có DCM với kô có DCM khác nhau (they dont come for free)


    Nguyên văn bởi jefflieu Xem bài viết
    Jeff có cách này, nhìn hơi nghiệp dư .. nhưng mà chạy cũng được
    if(rising_edge(clk)) then
    if(cnt=6) then cnt <= 0; else cnt<=cnt+1; end if;
    end if;
    khi muốn FF enable trong 6 clock trong 7 clock thì : ff_en <= '1' when cnt/=6 else '0';
    khi muốn FF enable 3 trong 7 clock ff_en <= '1' when (cnt=0 or cnt=2 or cnt=4) else '0';
    Nếu chỉ làm chia cho 7/3, thì làm cách hard code cũng được.

    Leave a comment:


  • hithere123
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    Không sao đâu, tôi dùng kỹ thuật này nhiều rồi. Nếu sợ thì dùng nó để đổi nhịp của clock (enable). Xem phần thứ 2 của bài tôi viết

    Code:
    reg [3:0] cnt;
    always @ (posedge clk or reset)
    if (reset) begin
    	cnt = 0;
    end else if (int_clk_out) begin
    	cnt = cnt + 1;
    end
    assign clock_out = cnt[0];
    Muốn chắc ăn thì nhân 2 - chia lẻ rồi chia 2 dùng code ở trên thì bảo đảm kô có glitch
    Anh,
    Làm theo cách 2 thì đúng là sẽ không có glitch khi STA clean nhưng xung ra sẽ bị delay 1 clock. Anh xem lại thử.

    Thân.

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    Thường thì FF có delay hơn inverter nhiều. Trong FPGA thì có thể phải cần cẩn thận hơn. Vì thế trên bài trên tôi nói là nên dùng xung ra cho enable thì tốt hơn.
    Okie ...
    Cho riêng FPGA:
    1/ khuyến khích dùng DCM để tạo ra clock mới (worry free )
    2/ Khi dùng mạch đếm và logic tạo ra clock mới và khi muốn dùng clock mới này cho chân CLK của FF phải cẩn thận.


    Jeff có cách này, nhìn hơi nghiệp dư .. nhưng mà chạy cũng được
    if(rising_edge(clk)) then
    if(cnt=6) then cnt <= 0; else cnt<=cnt+1; end if;
    end if;
    khi muốn FF enable trong 6 clock trong 7 clock thì : ff_en <= '1' when cnt/=6 else '0';
    khi muốn FF enable 3 trong 7 clock ff_en <= '1' when (cnt=0 or cnt=2 or cnt=4) else '0';

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi hithere123 Xem bài viết
    Anh,
    Int_clk_out được tạo ra từ kết quả của 5 rising edge clock khác nhau ( R[4:0] ) từ clock nguồn.
    và clock_out được tạo ra từ một mạch logic AND của int_clk_out và một đường clock nguồn.
    Mặc dù cả 6 clock này là giống nhau nhưng thực tế thì rất khó đảm bảo 6 clock này cái nào đến trước, cái nào đến sau.
    Anh xem lại thử.

    Thân mến.
    Không sao đâu, tôi dùng kỹ thuật này nhiều rồi. Nếu sợ thì dùng nó để đổi nhịp của clock (enable). Xem phần thứ 2 của bài tôi viết

    Code:
    reg [3:0] cnt;
    always @ (posedge clk or reset)
    if (reset) begin
    	cnt = 0;
    end else if (int_clk_out) begin
    	cnt = cnt + 1;
    end
    assign clock_out = cnt[0];
    Muốn chắc ăn thì nhân 2 - chia lẻ rồi chia 2 dùng code ở trên thì bảo đảm kô có glitch

    Leave a comment:


  • hithere123
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    int_clk_out kô thể đến sớm hơn clock được là tại vì nó được tạo ra bởi clock.
    Anh,
    Int_clk_out được tạo ra từ kết quả của 5 rising edge clock khác nhau ( R[4:0] ) từ clock nguồn.
    và clock_out được tạo ra từ một mạch logic AND của int_clk_out và một đường clock nguồn.
    Mặc dù cả 6 clock này là giống nhau nhưng thực tế thì rất khó đảm bảo 6 clock này cái nào đến trước, cái nào đến sau.
    Anh xem lại thử.

    Thân mến.

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi jefflieu Xem bài viết
    Woa ... Jeff ko recommend mạch chia clock này cho FPGA đâu ... Jeff nghĩ dùng DCM sẽ tốt hơn ...
    Làm sao bảo đảm được output của a Tony ko bi glitch nhỉ? Vì Jeff thấy thế này:

    - int_clk_out sẽ có 1 ít delay so với rising_edge của clk (T1)
    - (!clk) sẽ có 1 ít delay so với clk (T2)
    ---
    Nếu như T2>T1 thì sẽ bị glitch ngay.

    Ban đầu Jeff hiểu khác.

    Vấn đề bắt đầu phức tạp hơn so với việc dùng DCM rùi.
    Thường thì FF có delay hơn inverter nhiều. Trong FPGA thì có thể phải cần cẩn thận hơn. Vì thế trên bài trên tôi nói là nên dùng xung ra cho enable thì tốt hơn.

    Leave a comment:


  • jefflieu
    replied
    Trong FPGA thông thường tín hiệu dùng để làm clock gating sẽ sync với falling edge của clk và sẽ and với clk.
    Điều này bảo đảm khi tín hiệu này thay đổi thì clk = 0 rồi.

    Leave a comment:


  • jefflieu
    replied
    Woa ... Jeff ko recommend mạch chia clock này cho FPGA đâu ... Jeff nghĩ dùng DCM sẽ tốt hơn ...
    Làm sao bảo đảm được output của a Tony ko bi glitch nhỉ? Vì Jeff thấy thế này:

    - int_clk_out sẽ có 1 ít delay so với rising_edge của clk (T1)
    - (!clk) sẽ có 1 ít delay so với clk (T2)
    ---
    Nếu như T2>T1 thì sẽ bị glitch ngay.

    Ban đầu Jeff hiểu khác.

    Vấn đề bắt đầu phức tạp hơn so với việc dùng DCM rùi.

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi hithere123 Xem bài viết
    Anh lùi phase 180 để mask glitch.

    Nhưng nếu clock đến mạch int_clk_out sớm hơn clock đến mạch AND thì vẫn còn khả năng có glitch. Anh xem lại thử.

    Thân mến.
    int_clk_out kô thể đến sớm hơn clock được là tại vì nó được tạo ra bởi clock.

    Leave a comment:


  • hithere123
    replied
    Nguyên văn bởi tonyvandinh Xem bài viết
    AND với !clk thì sẽ không có glitch . Coi bài viết ở trên nhe
    Anh lùi phase 180 để mask glitch.

    Nhưng nếu clock đến mạch int_clk_out sớm hơn clock đến mạch AND thì vẫn còn khả năng có glitch. Anh xem lại thử.

    Thân mến.

    Leave a comment:


  • tonyvandinh
    replied
    Nguyên văn bởi hithere123 Xem bài viết
    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" .
    Thân mến.
    AND với !clk thì sẽ không có glitch . Coi bài viết ở trên nhe

    Leave a comment:


  • tonyvandinh
    replied
    Xử lý bằng ngôn ngữ Verilog

    Gần đây có một số bạn đã học về Verilog và cũng để làm sáng tỏ câu hỏi của Jeff, tôi sẽ dùng Verilog để xử lý cái chia lẻ của xung clock.

    Trong bài trước, tôi có đề ra đường vào và đường ra, cho nên sẽ bắt đầu từ đây

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

    Đường ra
    * Clock_out
    Trước hết là phải báo cáo module:

    Code:
    module FD (clock, reset, N, D, clock_out);
    Báo cáo đường vô/ra của mỗi tín hiệu:

    Code:
    input clock;
    input reset;
    input [3:0] N, D; // Tôi chọn 4 bits, nhưng các bạn có thể thay đổi tùy ý
    output clock_out;
    reg [4:0] R; // R phải lớn hơn N và D một bit
    reg int_clk_out; // Dùng tạm thời cho clock_out
    Điều lưu ý ở đây là N phải nhỏ hơn D.

    Tôi chọn async reset trong trường hợp này. Nếu muốn sync reset thì xóa reset ra khỏi sensitivity list.

    Code:
    always @ (posedge clk or reset)
    if (reset) begin
    	int_clk_out = 0;
    	R = 0;
    end else begin
    	R = R + N;
    	if (R > D) begin
    		R = R - D;
    		int_clk_out = 1;
    	end else
    		int_clk_out = 0;
    end
    Đưa ra clock_out và đóng module

    Code:
    assign clock_out = int_clk_out & (!clk);
    endmodule
    Nếu muốn tiếp tục chia xuống để tạo chu kỳ đẹp như đã bàn ở những bài trước, int_clk_out có thể dùng là "enable" và giữ clock nguồn cho xung clock

    Code:
    reg [3:0] cnt;
    always @ (posedge clk or reset)
    if (reset) begin
    	cnt = 0;
    end else if (int_clk_out) begin
    	cnt = cnt + 1;
    end
    assign clock_out = cnt[3];

    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