VHDL: số nguyên để tổng hợp?


17

Tôi hơi bối rối về việc tôi có nên sử dụng các số nguyên trong VHDL cho các tín hiệu và cổng tổng hợp, v.v.

Tôi sử dụng std_logic ở các cổng cấp cao nhất, nhưng bên trong tôi đang sử dụng các số nguyên có phạm vi ở khắp mọi nơi. Tuy nhiên, tôi đã tình cờ thấy một vài tài liệu tham khảo cho mọi người nói rằng bạn chỉ nên sử dụng đã ký / chưa ký cho mã nhắm mục tiêu tổng hợp.

Tôi đã đi và làm lại dự án hiện tại của mình để sử dụng không dấu ... và, tốt, nó xấu hơn đáng kể.

Có phải là một thực hành xấu để sử dụng số nguyên? Có vấn đề gì vậy? Có một số điểm không chắc chắn về độ rộng mà công cụ sẽ ánh xạ các số nguyên tới?


Câu hỏi hay. Tôi đã tự hỏi rằng bản thân mình. Tôi bắt đầu với việc sử dụng các số nguyên, dương và các loại khác ở khắp mọi nơi nhưng hóa ra nó rất nhiều lông để được tổng hợp đúng cách. Tôi hy vọng ai đó có thể giải thích lý do tại sao mọi người kết thúc bằng cách sử dụng std_logic bằng ngôn ngữ được đánh máy cao.
Trygve Laugstøl

1
Vâng. Điều đó có điên không? Đánh máy cao trong thực tế hiện tại có xu hướng dẫn đến rất nhiều DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); loại công cụ ... mà không làm phiền ai? :) Có vẻ như rất nhiều hành lý không cần thiết. (Đặc biệt khi thêm STD_LOGIC_VECTOR () vào đó) Tôi đã khai báo loại và kích thước của mình, đây phải là DATA_I <= 32010; Điều đó nên được ngầm hiểu. Đi giữa ký / không dấu, vv có thể và nên rõ ràng ... nhưng một phép gán hoặc thao tác rõ ràng rõ ràng trên các số nguyên nên được ẩn.
darron

Câu trả lời:


15

Số nguyên là tốt trong tổng hợp, tôi sử dụng chúng mọi lúc.

Tôi sử dụng std_logic ở các cổng cấp cao nhất, nhưng bên trong tôi đang sử dụng các số nguyên có phạm vi ở khắp mọi nơi

Tốt rồi!

Hãy lưu ý:

  • Trước tiên, bạn đang mô phỏng không phải là bạn :) - Các loại số nguyên không tự động "cuộn" trong mô phỏng - đó là lỗi khi đi ra khỏi phạm vi bạn đã chỉ định cho chúng. Nếu bạn muốn hành vi cuộn lại, bạn phải mã hóa nó một cách rõ ràng.
  • -(231-1)+231-1-231unsignedsigned
  • Nếu bạn không giới hạn chúng, đôi khi bạn có thể kết thúc với các bộ đếm 32 bit, nơi sẽ làm ít hơn (nếu công cụ tổng hợp và các công cụ tiếp theo không thể "thấy" rằng chúng có thể tối ưu hóa các bit đi).

Ở phía trên:

  • Chúng mô phỏng nhanh hơn nhiều so với các vectơ không dấu / đã ký
  • Họ không tự động cuộn lại trong mô phỏng (vâng, nó nằm trong cả hai danh sách :). Điều này rất tiện lợi - ví dụ bạn nhận được cảnh báo sớm rằng bộ đếm của bạn quá nhỏ.

Khi bạn sử dụng các loại vectơ, bạn đang sử dụng ieee.numeric_std, phảiieee.std_logic_arith không?

Tôi sử dụng integers nơi tôi có thể, nhưng nếu tôi rõ ràng muốn "bộ đếm n-bit cuộn qua", tôi có xu hướng sử dụng unsigned.


Có, tôi sử dụng num_std. Tôi đoán tôi hầu như lo lắng về các công cụ Xilinx ... họ vẫn tạo std_logic_vector cho mọi thứ và "KHÔNG ĐƯỢC KÝ" thậm chí không có trong cú pháp tô sáng.
darron

1
@darron Đừng lo lắng về việc đánh dấu cú pháp. Trình chỉnh sửa và cú pháp tô sáng của nó là một phần mềm hoàn toàn khác với công cụ tổng hợp. Ngoài ra, không dấu là "chỉ" một kiểu dữ liệu. Nó là một phần của một thư viện tiêu chuẩn, không phải của ngôn ngữ.
Philippe

Không phải là giới hạn dưới -2 ^ 32 + 1 thay vào đó? Nếu đó là -2 ^ 31 - 1 bạn chỉ cần thêm một bit để chỉ đại diện cho một số duy nhất - rất kỳ lạ.
Bregalad

@Bregalad - đánh bắt tốt - điều đó đã sai khá lâu!
Martin Thompson

@MartinThndry Hoặc có thể bạn có thể viết nó dưới dạng - (2 ^ 32-1) nếu bạn muốn giữ dấu trừ.
Bregalad


6

Không có gì sai khi sử dụng số nguyên cho RTL mỗi lần , nhưng có một số lý do mà một số người tránh nó. Đây thực sự là một câu hỏi về "thực hành tốt nhất" chủ quan và cuối cùng bạn sẽ phải tự tìm ra những gì bạn thích. Để giúp đỡ điều đó, tôi sẽ chia sẻ kinh nghiệm và suy nghĩ của tôi về điều này.

Về cơ bản , tôi thích sử dụng các số nguyên (bị ràng buộc), cũng như khi viết để tổng hợp. Đôi khi tôi làm điều đó, nhưng trong thực tế , thường thì tôi gắn bó signedunsigned. Tôi sẽ giải thích lý do tại sao.

Bạn sẽ bị buộc phải sử dụng một kiểu dữ liệu được vector hóa trong một phần của thiết kế của bạn:

  • Hầu như bất kỳ nhà cung cấp-IP hoặc bên thứ 3-IP sẽ sử dụng integerloại cho các cổng

  • Ví dụ: khi gửi dữ liệu qua BlockRam, ngay cả khi bạn suy luận và do đó không bao giờ cần phải giao tiếp với bất kỳ IP / macro / nguyên thủy nào, rất có thể bạn sẽ cần phải chuyển đổi sang loại véc tơ

  • Ngay cả khi không áp dụng một trong những điều trên, bạn hầu như sẽ cần phải giao tiếp với một thứ khác tại một thời điểm nào đó (một cổng cấp cao nhất, nếu không có gì khác)

Vì bạn không thể sử dụng integercho thiết kế đầy đủ, bạn có thể muốn bỏ qua tất cả cùng nhau, bởi vì:

  • Tại một số điểm, dù sao bạn cũng cần thực hiện chuyển đổi và điều này sẽ lấy đi một phần của điểm sử dụng integerở nơi đầu tiên

  • Ngoài ra, để mô phỏng, các chuyển đổi này thường sẽ được gọi bằng các vectơ 'U'hoặc 'X'trước khi đặt lại hoặc vào các thời điểm khác và mỗi lệnh gọi như vậy sẽ tạo ra một thông báo cảnh báo từ chức năng gói, làm lộn xộn các cảnh báo / nhắc nhở mô phỏng của bạn

Hạn chế của việc sử dụnginteger :

  • Trái với các loại véc tơ, số nguyên không có 'U''X'; Tôi tìm thấy những điều rất hữu ích trong mô phỏng. Bạn thấy các tín hiệu chưa được khởi tạo truyền qua thiết kế như thế nào và có thể bạn sẽ phản ứng nếu bạn thấy rất nhiều tín hiệu chưa được khởi tạo sau khi thiết lập lại. Điều này sẽ không xảy ra nếu sử dụng số nguyên.

  • Với các số nguyên, sẽ có rủi ro mô phỏng / tổng hợp sai lớn hơn khi cộng hoặc trừ dẫn đến kết quả dưới / tràn. (Như đã được chỉ ra bởi người khác.)

Các trường hợp điển hình mà tôi thấy integerthực sự là một lựa chọn tốt:

  • Đối với các tín hiệu / bộ đếm gỡ lỗi mà bạn giám sát thông qua chipScope / signalTap, v.v.

  • Đại diện hoàn toàn nội bộ của các quầy, không bao giờ đi vào hoặc ra khỏi mã của riêng bạn. Vâng, có những trường hợp như vậy, ví dụ như nếu bạn đang viết một FIFO và bạn đang viết dead-reckoning / đọc để hình thành các tín hiệu full, empty, almostFullvv (tuy nhiên arithmetics trên con trỏ là một cách tốt hơn so với dead-reckoning trong trường hợp này. ..)

Kết luận của riêng tôi : Đôi khi tôi sử dụng số nguyên, nhưng ít, và chủ yếu trong các trường hợp được mô tả ở trên. Tôi không thấy nhiều chi phí sử dụng unsignedsignedthay vì số nguyên, và do đó, thường bám vào chúng.

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.