Sự khác biệt giữa câu lệnh If-other và Case trong VHDL


11

Tôi muốn hiểu làm thế nào các cấu trúc khác nhau trong mã VHDL được tổng hợp trong RTL.

  • Ai đó có thể cho tôi biết sự khác biệt giữa cấu trúc câu lệnh If-Elsecâu lệnh Case của một quy trình trong VHDL về cách mã được suy ra trong mạch RTL bằng công cụ tổng hợp không?
  • Hãy xem xét trường hợp nhiều câu lệnh if- other lồng nhautrộn các câu lệnh case với if-other xây dựng bên trong một tiến trình.
  • Ngoài ra khi nào nên sử dụng cấu trúc nào?

PS: Tôi đã thấy một câu hỏi liên quan "Nhiều câu lệnh đang xử lý trong vhdl" nhưng dù sao nó cũng không trả lời câu hỏi của tôi.


Tôi không thể nhận xét về cách các cổng vật lý sẽ được cấu hình, nhưng trong hầu hết các trình biên dịch phát ra lắp ráp x86, một if-other thường tồn tại dưới dạng một kiểm tra với một bước nhảy có điều kiện (ví dụ: jg, jl, jz, jnz, v.v.), trong khi chuyển đổi tổ chức các trường hợp theo thứ tự số và thực hiện lặp dec/ jzhướng dẫn, hiệu quả hơn nhiều. Có lẽ một tối ưu hóa tương tự được áp dụng ở đây.
Đa thức

@Polynomial Hành vi của If-other và case khác nhau đáng kể về ngôn ngữ phần cứng so với lập trình tuyến tính thông thường của bạn. Tối ưu hóa mã Op không liên quan lắm vì câu lệnh HDL thực thi "ngay lập tức".
W5VO

Câu trả lời:


10

Ai đó có thể cho tôi biết sự khác biệt giữa cấu trúc câu lệnh If-Else và câu lệnh Case của một quy trình trong VHDL về cách mã được suy ra trong mạch RTL bằng công cụ tổng hợp không?

Cấu if-elsif-elsetrúc này tạo ra một mạng định tuyến ưu tiên:

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab

Điều này tương ứng với

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

Mặt khác case, cấu trúc này tạo ra một mux lớn:

nhập mô tả hình ảnh ở đây

Điều này tương ứng với

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Rõ ràng đây là những thiết kế rất đơn giản chỉ có một biểu thức giá trị, dẫn đến một đầu ra.

Hãy xem xét trường hợp nhiều câu lệnh if-other lồng nhau và trộn các câu lệnh case với if-other xây dựng bên trong một tiến trình.

Theo những điều trên, bạn có thể thấy chúng sẽ lồng / trộn như thế nào.

Ngoài ra khi nào nên sử dụng cấu trúc nào?

if-elsemức độ ưu tiên của nó, nên được sử dụng khi có nhiều điều kiện đầu vào có thể xảy ra. Sử dụng case, mặt khác, là thích hợp khi các đầu vào loại trừ lẫn nhau.


Tôi hiểu rằng trường hợp thống kê chỉ hoạt động cho điều kiện đầu vào duy nhất và nếu khác có thể hoạt động cho nhiều điều kiện đầu vào. Nhưng cả hai cấu trúc về cơ bản đều tạo ra các mux (không có clk). Không phải là tổng hợp logic có thể tối ưu hóa một đầu vào nếu khác thành một mux lớn duy nhất thay vì chuỗi các mux? Ngoài ra, mạng định tuyến ưu tiên là gì ... không phải đây chỉ đơn giản là chuỗi các mux thay vì 1 mux lớn?
Nurabha

Ngoài ra, khi chúng ta có một quy trình nhạy cảm với đồng hồ, nếu không thì có thể tạo ra các phần tử tuần tự như thanh ghi, chốt, v.v. Một câu lệnh tình huống cũng có thể tạo ra logic tuần tự không?
Nurabha

Vâng, một mạng định tuyến ưu tiên chính xác là như vậy - một chuỗi các mux. Tuy nhiên, bản chất của if-elsecấu trúc là nơi phát sinh chuỗi đó. Điều kiện đầu tiên phải thất bại đối với điều kiện thứ hai được kiểm tra. Đây không phải là trường hợp, er, casecấu trúc, và đây là lý do tại sao một if-elsecâu lệnh không thể được tổng hợp thành một mux lớn duy nhất.
Angelo Stavrow

1
Và vâng, một casetuyên bố có thể tạo ra logic tuần tự là tốt. Tôi tìm thấy "Real World VHDL" , một loạt các bài giảng từ Đại học Glasgow, có thể hữu ích cho bạn.
Angelo Stavrow

Đây là một tài liệu tham khảo tốt.
Nurabha

4

Trong bài đăng trên blog cũ này , tác giả đã viết và tổng hợp hai phiên bản chức năng tương đương của mã VHDL. Một sử dụng if-other, trường hợp sử dụng khác. Kết quả:

Tôi đã tổng hợp mã này và nhận được kết quả chính xác. Ngay cả sơ đồ RTL giống hệt nhau cho cả hai chương trình.

Và kết luận của anh ấy:

Điều này cho thấy các câu lệnh 'case' và 'if ... elsif ... other' đều hiệu quả như nhau. Nhưng nếu bạn muốn viết một mã rõ ràng, thì tốt hơn bạn nên sử dụng 'case'. 'Case' rất hữu ích khi đầu ra phụ thuộc vào một số lượng lớn các điều kiện. Nhưng nếu số lượng điều kiện rất nhỏ (2 hoặc 3) thì bạn có thể sử dụng 'if..elseif..else'.

Ngoài ra còn có hàng tá bài viết về chủ đề này trên Stack Overflow cho mọi ngôn ngữ có thể hiểu được. Kết luận nói chung là như nhau, rằng không có sự khác biệt về hiệu suất. Đôi khi, nếu có một số lượng lớn các trường hợp, một trình biên dịch có thể đủ thông minh để tạo một bảng tra cứu sẽ mang lại hiệu suất tốt hơn một chút.

Một bộ tổng hợp VHDL có thể có thể làm một cái gì đó tương tự. Nhưng bạn vẫn sẽ cần một số lượng lớn các trường hợp trong đó trường hợp (ý định chơi chữ) bạn có thể muốn sử dụng một tuyên bố trường hợp vì nó cung cấp khả năng đọc tốt hơn khi có số lượng lớn các tùy chọn.

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.