Sử dụng cả hai cạnh của đồng hồ


10

Tôi đang lập trình một Altera Cyclone IV bằng Verilog và Quartus II. Trong thiết kế của tôi, tôi muốn sử dụng cả hai cạnh của đồng hồ để tôi có thể phân chia đồng hồ theo một yếu tố kỳ lạ với chu kỳ nhiệm vụ 50%. Đây là một đoạn mã của tôi:

  always @(posedge low_jitter_clock_i or negedge low_jitter_clock_i or posedge reset_i) begin
    if(reset_i) begin
      fixed_clock <= 1'b0;
      divider_dummy <= 'b0;
    end else begin
      fixed_clock <= fixed_clock_next;
      divider_dummy <= divider_dummy_next;
    end
  end

Bây giờ khi tôi biên dịch cái này, Quartus II đưa ra lỗi sau:

Verilog HDL Luôn xây dựng lỗi tại adc_clocking.v (83): điều khiển sự kiện không thể kiểm tra cả hai cạnh dương và âm của biến "low_jitter_clock_i"

Làm cách nào tôi có thể sử dụng cả cạnh tích cực và tiêu cực của một chiếc đồng hồ nhất định trong thiết kế của mình?

Câu trả lời:


7

Khi bạn gán cho một thanh ghi trong một khối luôn có độ nhạy cạnh, bạn đang xác định một flip-flop. Các GPU không có flip-flop có thể kích hoạt trên cả hai cạnh của đồng hồ.

Để làm những gì bạn muốn, bạn sẽ cần phải có hai khối luôn riêng biệt, một khối cho mỗi cạnh của đồng hồ, và sau đó tìm ra cách kết hợp đầu ra của hai khối mà không tạo ra sự cố.

Ví dụ: một khối luôn có thể chứa bộ chia lập trình của bạn. Thiết kế nó sao cho chu kỳ nhiệm vụ đầu ra nhỏ hơn 50% khi được cung cấp một số lẻ. Sử dụng khối luôn luôn thứ hai (trên cạnh đồng hồ khác) để trì hoãn đầu ra của khối thứ nhất bằng 1/2 đồng hồ, sau đó HOẶC hai đầu ra cùng nhau. Vô hiệu hóa đầu ra của khối thứ hai cho các giá trị chia đều.


Lý do tôi muốn sử dụng cả hai cạnh tích cực và tiêu cực của đồng hồ là để có chu kỳ làm việc là 50%.
Randomblue

Vâng, tôi hiểu điều đó. Câu trả lời của tôi trực tiếp giải quyết rằng. Tôi giả sử bạn đã biết cách lấy chu kỳ thuế 50% khi giá trị chia là chẵn. Điều gì không rõ ràng?
Dave Tweed

Không có flip-flop hai cạnh? Không có lý do cố hữu cho việc này. Nó chỉ ra rằng không ai làm cho họ (hoặc ít nhất là không ai mà chúng ta biết). Như Martin chỉ ra, có một CPLD rằng hỗ trợ dual-cạnh flip-flops: xilinx.com/products/silicon-devices/cpld/coolrunner-ii/...
Philippe

3

Nếu điều này là cho logic bên trong, có lẽ bạn phải viết gần hơn với các flipflops có sẵn. Ngoại trừ Coolrunner-II Tôi không biết bất kỳ logic lập trình nào với các thanh ghi hai cạnh vốn có.

Do đó, bạn sẽ phải tạo hai alwayskhối, một khối cho phủ định và một cho khối và kết hợp đầu ra của chúng với một số logic tổ hợp.

Hoặc sử dụng PLL để nhân đôi đồng hồ và sau đó bạn có thể sử dụng logic một lưỡi thông thường.



1

Như Dave Tweed lưu ý, trừ khi một GPU bao gồm phần cứng flip flop có thể hoạt động trên cả hai cạnh của đồng hồ, sẽ cần phải viết logic của riêng bạn để thực hiện hành vi mong muốn bằng cách sử dụng flip-edge đơn thông thường. Mặc dù có một số cách khác nhau mà người ta có thể thực hiện một mạch hoạt động giống như một flip flop hai cạnh, các mạch như vậy thường thêm một số hạn chế về thời gian khác với các liên kết với flip flop.

Ví dụ, một cách tiếp cận đơn giản là có một mô-đun kết hợp hai xors 2 đầu vào và một cặp flip "T" (trong đó trạng thái của đầu vào khi có xung đồng hồ cho biết liệu cạnh đồng hồ đó có nên chuyển đổi đầu ra hay không), một được kích hoạt bởi một cạnh tăng và một được kích hoạt bởi một cạnh rơi xuống. Đầu ra của mô-đun sẽ là xor của đầu ra của flip flops và đầu vào cho cả hai flip flop sẽ là xor của đầu ra của mô-đun và đầu vào của nó.

Một mạch được thiết kế theo kiểu này sẽ hoạt động cơ bản giống như một flip flop hai cạnh, mặc dù với thời gian thiết lập và lan truyền lâu hơn, nhưng với một ràng buộc thời gian bổ sung. Một flip-flop bình thường không có trên đường phản hồi sẽ không phiền nếu phần bắt đầu của cạnh đồng hồ có một loạt các xung thô với điều kiện đồng hồ ổn định ở mức hợp lệ và với điều kiện là giới hạn thời gian thiết lập, được đo từ trước xung runt đầu tiên và các ràng buộc về thời gian giữ và thời gian hoạt động của đồng hồ, được đo từ thời điểm xung đồng hồ hoạt động ổn định, được đáp ứng. Hành vi của đầu ra flip flop sẽ không được xác định trong thời gian đồng hồ không ổn định, nhưng sẽ được xác định sau khi đồng hồ ổn định. Mô-đun đôi xor-double-flop sẽ thêm ràng buộc thời gian bổ sung rằng bất kỳ cạnh đồng hồ nào thay đổi đầu ra phải là khoảng cách an toàn với bất kỳ cạnh đồng hồ nào khác có thể làm như vậy. Không đáp ứng được ràng buộc đó, ví dụ như có ba cạnh đồng hồ liên tiếp rất gần trong khi đầu vào không khớp với đầu ra, có thể khiến đầu ra ở trạng thái không xác định hoặc có thể di chuyển (lưu ý rằng các tình huống liên quan đến số cạnh chẵn không phải là vấn đề đáng lo ngại , vì các kịch bản như vậy sẽ không liên quan gì đến các xung runt, trường hợp ba cạnh (hoặc các trường hợp số lẻ khác lớn hơn một) là một mối quan tâm bởi vì sẽ có một xung hợp lệ theo các xung runt.

Một thiết kế mạch thay thế sẽ có hai flip flop như trên, nhưng đưa đầu ra của chúng vào một bộ ghép kênh. Mạch này sẽ không bị ném vào trạng thái xấu bởi các xung thô và các ràng buộc xung nhịp của nó sẽ giống như các chốt bên dưới, nhưng sẽ có nhược điểm là đầu ra cao và nên duy trì (hoặc thấp và vẫn ở mức thấp ) vì vậy có thể trục trặc nhanh chóng trên một cạnh đồng hồ. Trong một số mạch không quan trọng, nhưng ở những mạch khác, nó sẽ như vậy.

Có lẽ các công cụ tổng hợp logic có thể tự động thực hiện flip flop hai cạnh bằng cách phân tích những hạn chế thời gian nào được chỉ định là quan trọng, nhưng làm như vậy sẽ hơi khó khăn. Nó cũng sẽ làm tăng nguy cơ rằng một thay đổi nhỏ đối với thiết kế có thể gây ra thay đổi lớn trong việc thực hiện và do đó mang lại sự thay đổi đáng kể và bất ngờ trong hành vi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.