Phương pháp chung để thực hiện câu lệnh if-other trong phần cứng (sử dụng cổng, mux-demux, flip flops), v.v.


7

Tôi hiện đang làm việc để chuyển đổi một ngôn ngữ cấp cao thành một mạch tương đương .. Tôi có thể chuyển đổi các biểu thức đơn giản như a + b, ab hoặc kết hợp chúng bằng các cổng. Nhưng tôi muốn biết liệu có một phương pháp chung để thực hiện câu lệnh if-other sử dụng các thành phần điện tử như cổng, mux, ff. Một câu trả lời đơn giản sẽ là sử dụng mux-demux. Nhưng điều đó sẽ không giải quyết được vấn đề sau đây (ví dụ)

if(posedge(clock)):

q<=d

Cấu trúc cho điều đó sẽ là cạnh tích cực kích hoạt flip flop. Vì vậy, có cách nào chung để thực hiện câu lệnh if-other không?

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!

Câu trả lời:


8

Đối với logic tổ hợp, if/ elseđược triển khai dưới dạng bộ ghép kênh 2: 1. Trong đại số Boolean, đây sẽ là:

Q = (A * S) + (B * S')

Ở đâu:

  • Slà đầu vào được cung cấp bởi ifđiều kiện,
  • Alà đầu vào được cung cấp bởi thenbiểu thức con
  • Blà đầu vào được cung cấp bởi elsebiểu thức con và
  • Q là đầu ra của biểu thức.

Về mặt lý thuyết, bạn có thể khái quát hóa điều này để bao gồm một cạnh đồng hồ duy nhất , nhưng nó phức tạp hơn rất nhiều và sẽ giống với một tế bào đồ họa khi bạn hoàn thành. Về cơ bản, nếu bao gồm một cạnh đồng hồ, bạn không thể có một elsemệnh đề (vì nó hoàn toàn "không thay đổi đầu ra") và bất kỳ phần không có cạnh nào của ifđiều kiện sẽ đơn giản trở thành biểu thức kích hoạt đồng hồ. Khi bụi đã lắng xuống, bạn sẽ được để lại một phiên bản ít rõ ràng hơn của always_ffcâu lệnh mà bạn nên sử dụng thay thế.

Điều kiện có hai hoặc nhiều cạnh đồng hồ không thể tổng hợp.

EDIT: Đầu tiên, tôi không chắc if(posedge(...))là có thể tổng hợp được. Nói chung, bạn sử dụng posedge(...)mệnh đề trong always_ff @(...)dòng và không cần posedge()bên trong khối.

Trong SystemVerilog, hình thức chung của bộ ghép kênh 2: 1 là một ifcâu lệnh. Ví dụ:

always_comb begin
    if(S)
        Q = A;
    else
        Q = B;
end

Tuy nhiên, nếu có cạnh đồng hồ, bạn cần sử dụng flip-flop:

always_ff @(posedge CLK) begin
    if(CLK_ENA)
        Q <= D;
end

Thêm một thiết lập lại không đồng bộ trông như thế này:

always_ff @(posedge RESET, posedge CLK) begin
    if(RESET)
        Q <= '0;
    else if(CLK_ENA)
        Q <= D;
end

Trong trường hợp này, RESET hoạt động ở mức cao. Lưu ý rằng bạn chỉ cần nói RESET là phần nhạy cảm trong @()phần. Trong phần còn lại của khối, RESET sẽ có cấp độ sau cạnh. Cũng lưu ý rằng độ nhạy cảm cạnh là một danh sách; bạn không thể nói "và". (Trong Verilog gốc, bạn tách biệt độ nhạy cảm cạnh bằng "hoặc", khiến mọi người hiểu lầm "và" cũng có thể hoạt động tốt.)


này, cảm ơn rất nhiều vì câu trả lời của bạn! ... tuy nhiên khi tôi khái quát tôi sẽ sử dụng cái gì như S? (tôi có một vị trí (clk) ... tức là một thuộc tính của tín hiệu chứ không phải là tín hiệu) .... bạn cũng có thể vui lòng giải thích ý của bạn về "bất kỳ phần không cạnh nào của điều kiện trở thành biểu thức cho phép đồng hồ" ...cảm ơn rất nhiều!
Người chờ đợi

Bạn có ý nghĩa gì bởi "^ ........"?
Mike DeSimone

Tôi nhận ra tôi đã không gắn thẻ bạn trong câu trả lời của tôi cho bình luận của bạn ... vì vậy tôi đã viết một bình luận khác để hướng bạn đến bình luận đầu tiên! ... vì thế ^ .... tôi đã sử dụng các dấu chấm còn lại vì một bình luận phải dài hơn 15 ký tự: D ... dù sao bạn có thể vui lòng giải quyết truy vấn của tôi không?
Người chờ đợi

Một người trả lời được thông báo về tất cả các ý kiến ​​cho câu trả lời của họ, vì vậy tôi đã không nhớ bạn. Bạn chỉ cần sử dụng thẻ nếu bạn đang trả lời một bình luận viên. Đối với các truy vấn của bạn, trước tiên, hãy xem ví dụ tổ hợp cho S ở đâu. Vì bạn có lợi thế trong điều kiện của mình, bạn không thể sử dụng logic tổ hợp và thay vào đó phải sử dụng flip-flop. Đối với truy vấn thứ hai của bạn, xem ví dụ lật ở trên. Nó có thể được coi là if(CLK_ENA & posedge(CLK)); lưu ý rằng một phần của điều kiện đó là posedge()và một phần thì không.
Mike DeSimone

cảm ơn vì đã trả lời! .. nhưng nói chung bạn sẽ tổng hợp một mã có nhiều hơn một yếu tố như thế nào? .. ý tôi là có một yếu tố trong danh sách độ nhạy Tôi có thể đưa nó vào đồng hồ..nhưng còn hai yếu tố Ở đó? .. Tôi tin rằng "thiết lập lại ý tưởng" sẽ không luôn hoạt động..và nếu nó nhiều hơn 2 thì sao? Cảm ơn!!
Người chờ đợi

0

Đây có phải là sự kết hợp đơn giản giữa AND và XOR không? VÀ có logic đang được thử nghiệm và thứ hai được gắn với cao. XOR có logic đang được thử nghiệm và thứ hai được gắn cao.

VÀ (NẾU)

0 (1) = 0

1 (1) = 1

XOR (ELSE)

0 (1) = 1

1 (1) = 0


Nói đúng ra, vì người khác là một người dễ nắm bắt, sẽ không nandthích hợp hơn xor?
James M. Lay
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.