Làm thế nào để có được một thiết kế đồ họa chắc chắn sẽ hoạt động trên phần cứng thực tế


9

Tôi mới bắt đầu học thiết kế logic kỹ thuật số với đồ họa của FPGA và đã xây dựng rất nhiều dự án. Hầu hết thời gian (vì tôi là một người mới), tôi có một thiết kế mô phỏng hoàn hảo (mô phỏng hành vi) nhưng không tổng hợp đúng.

Vì vậy, câu hỏi của tôi là "các bước thiết kế mà tôi có thể kết hợp trong quy trình làm việc của mình là gì, điều đó sẽ đảm bảo rằng tôi có một thiết kế hoạt động sẽ hoạt động ngay trên FPGA của mình?"

Tôi có hai lĩnh vực chính mà tôi mong muốn tư vấn, nhưng điều này hoàn toàn dựa trên quan điểm rất hẹp của tôi khi mới bắt đầu, và nhiều điều khác được chào đón:

  • Tất cả các bước (xem sơ đồ RTL, mô phỏng bài tổng hợp, ...) tôi nên thực hiện việc học để thực hành tốt nhất.
  • Tất cả những điều tôi nên ghi nhớ trong khi thiết kế logic của mình (giả sử các mạch liên tục hoặc tuần tự của FSM) để tránh mọi kết quả không mong muốn.

Tôi đang sử dụng bộ công cụ Xilinx Spartan 6 và bộ thiết kế Xilinx ISE Design cho công việc của mình.


1
Những loại vấn đề bạn đang gặp phải với tổng hợp? Bạn có đạt được mức độ bao phủ cao trong mô phỏng không?
pjc50

@ pjc50 Tôi không hiểu câu hỏi. Bạn có ý nghĩa gì "mức độ bao phủ cao trong mô phỏng"?
Ironstein

1
Bạn có một testbench hoặc kích thích lái mô phỏng. Các công cụ bảo hiểm cho bạn biết bao nhiêu phần trăm của thiết kế đang được thực hiện trong bài kiểm tra, tính theo phần trăm. Nếu con số này quá thấp thì testbench của bạn không đủ và bạn không kiểm tra một số trường hợp có thể xảy ra trong sử dụng thực tế.
pjc50

@ pjc50 đó thực sự là một lời khuyên rất tốt. Tương đương với điều này trong bộ thiết kế Xilinx ISE là gì?
Ironstein

1
Đáng chú ý: tổng hợp và "chắc chắn hoạt động trên phần cứng thực tế" là các mức độ nghiêm ngặt khác nhau. Có những mẫu người ta có thể làm theo để đảm bảo nó tổng hợp. Tuy nhiên, khi nói đến việc làm cho nó hoạt động trên phần cứng thực tế, chắc chắn, người ta phải nhớ câu châm ngôn mô phỏng: "Tất cả các mô hình đều sai; một số là hữu ích."
Cort Ammon

Câu trả lời:


13

Tại một nơi tôi làm việc có hai trại thiết kế đồ họa. Một trại tôi gọi là mô phỏng, mô phỏng, mô phỏng hoặc s khối. Các trại khác là tất cả về thiết kế.

Những kẻ lập phương đã sử dụng một trình giả lập như mô hình, họ sẽ đưa ra một thiết kế ban đầu thông qua các phương thức mã hóa và \ hoặc các khối trong bộ thiết kế. Sau đó, họ sẽ mô phỏng nó và tìm những thứ không hoạt động, sau đó thay đổi mã. Quá trình này được lặp đi lặp lại nhiều lần cho đến khi họ đưa ra một thiết kế có hiệu quả.

Trại thiết kế (mà tôi thích) sẽ thiết kế dạng sóng trên giấy (hoặc giấy kỹ thuật số như visio), chính xác những gì được yêu cầu. Sau đó đưa ra một sơ đồ logic. Đây là một quá trình tự viết tài liệu. Sau đó sơ đồ được dịch thành mã (mã và sơ đồ là 1: 1 nếu có một cái gì đó trong sơ đồ, có một quy trình cho nó trong mã). Sau đó, nó đã được mô phỏng, và dạng sóng mô phỏng được so sánh với dạng sóng được thiết kế trên giấy, và được dự kiến ​​là giống nhau.

Cuối cùng tôi đã làm cả hai, đôi khi tôi sẽ vào chế độ hình khối, và nó không vui lắm. Tôi thấy rằng đôi khi tôi đã đánh mất mục tiêu của mình. Ví dụ: tôi sẽ thay đổi trạng thái trong máy trạng thái và thay đổi sẽ chuyển sang trạng thái tiếp theo, sau đó tôi sẽ phải sửa lỗi đó. Cuối cùng tôi đã dành nhiều thời gian hơn là nghĩ về nó.

Trại nào bạn thích ở? Tôi nghĩ rằng cần phải có thiết kế nghiêm ngặt, làm những gì phù hợp với bạn, nhưng tôi nghĩ rằng bạn càng thiết kế chi tiết và nghiêm ngặt hơn, bạn sẽ càng gặp ít vấn đề trong thời gian dài. Tôi đã đưa ra một số ví dụ về những gì có thể, chúng có thể không phù hợp với cấu trúc tổ chức nơi làm việc của bạn. Lý do tại sao chi tiết thiết kế và lập kế hoạch cẩn thận rất hữu ích, là nó buộc bạn phải suy nghĩ về những gì bạn đang làm. Nó làm cho nó dễ dàng để gỡ lỗi. Phát triển một quy trình thiết kế cho phép điều này xảy ra. Ngoài ra, hãy làm quen với các công cụ mô phỏng và viết các bài kiểm tra tốt sẽ kiểm tra tất cả các điều kiện mà thiết bị mô phỏng có thể gặp phải. Điều này tất nhiên cần phải được cân bằng với thời gian. Ví dụ, viết mã ADC HDL sẽ mô phỏng thiết bị trong các mô phỏng của bạn.

Công cụ có giá trị nhất cần có trong thiết kế đồ họa (theo ý kiến ​​của tôi) là một quy trình thử nghiệm tốt sẽ cho phép bạn kiểm tra đầy đủ thiết kế của mình và chạy nó qua các bước của nó. Một thiết kế đồ họa không thể được mong đợi "chỉ hoạt động" cần phải nỗ lực để đảm bảo tất cả các phần đều hoạt động. Nếu bạn phát hiện ra lỗi, sau đó quay lại mô phỏng và thiết kế và tìm hiểu sự khác biệt giữa một mô phỏng đồ họa và RTL là gì. Điều đó chủ yếu đi kèm với kinh nghiệm, nhưng nếu thiết kế hoạt động trong mô phỏng nhưng không phải trong phần cứng thì bạn cần tìm hiểu tại sao có sự khác biệt.

Một vài điều quan trọng mà tôi đã học được:
1) Vệ sinh đầu vào của bạn, mạch đồng hồ và thiết lập lại cần phải sạch hoặc bạn có thể nhận được sự di chuyển lan truyền qua hệ thống của bạn. Biết một bộ đồng bộ hóa xếp hạng kép là gì. Có nhiều cấu trúc liên kết khác nhau cho các mạch đặt lại, biết cách sử dụng chúng (có một bài viết tuyệt vời trên mạng, mặc dù tôi không có nó trong tay).
2) Nhận các yêu cầu của thiết kế lên phía trước và sau đó thiết kế xung quanh những yêu cầu đó. Nếu những người xung quanh bạn sẽ không cung cấp cho bạn những yêu cầu nhất định, thì hãy tự mình đưa ra một số yêu cầu.
3) Hộp công cụ điểm cố định Matlab rất tốt để mô phỏng các hệ thống điều khiển và ứng dụng DSP, nhưng bạn có thể không có quyền truy cập vào đó. Đó là một cách tuyệt vời để chứng minh một thiết kế trước khi bạn viết mã.
4) Thiết kế đến trước, sau đó mã hóa, sau đó mô phỏng.
5) Gõ mạnh, cũng giữ các tên tín hiệu nhất quán trên sơ đồ pcb và hdl. (đây cũng là lý do tại sao tôi thích VHDL hơn verilog.


2
STôimbạntôimộttTôion3

Khá tốt: để "thiết kế nghiêm ngặt" tôi sẽ thêm "sử dụng hệ thống loại". Ví dụ: một chỉ mục mảng có loại thích hợp, chẳng hạn như phạm vi của mảng, không cần kiểm tra điều kiện ngoài giới hạn. Tôi chỉ không đồng ý với "dạng sóng so với dạng sóng được thiết kế trên giấy" ... dạng sóng được thiết kế phải ở VHDL theo giai đoạn đó, (hoặc có lẽ đọc từ tệp văn bản) và trình giả lập sẽ thực hiện so sánh.
Brian Drumond

Nó cũng có thể được thực hiện theo cách đó, tôi thấy nó hữu ích khi thiết kế một dạng sóng trên giấy vì nó đã cho một cái gì đó để so sánh với. Giống như dạng sóng ADC, thời gian được thiết kế và sau đó được so sánh với đầu ra modlesim, sau đó được xác minh vật lý. Nếu đầu ra mô hình là chính xác, sau đó so sánh nó với đó. Mã được gõ mạnh (tôi quên đề cập đến điều đó), nhưng điều đó thực sự quan trọng. Đó là lý do tại sao tôi thích VHDL hơn verilog, bạn có thể sử dụng ít phím tắt hơn. Và nó làm cho mã dễ đọc hơn nhiều.
Điện áp Spike

Đúng. Trên thực tế cũng giống như các lĩnh vực khác như phần mềm hoặc phần cứng thông thường, điểm khởi đầu là chia vấn đề thành các khối và sau đó tự hỏi "làm sao tôi biết khi nào khối đó hoạt động". Sau đó làm điều đó. Xây dựng khối thiết kế của bạn theo từng khối, sau đó đặt các khối lại với nhau và kiểm tra lại xem những gì bạn nhận được là những gì được mong đợi. Đôi khi bạn có thể nhận ra rằng với một thiết kế cấp khối tốt hơn, nó sẽ sạch hơn hoặc dễ dàng hơn, vì vậy bạn quay lại.
danmcb

6

Những điều chính là:

  • Mã hóa cẩn thận để tránh các cấu trúc không tổng hợp
  • Giảm thiểu mức logic để thực hiện thời gian tốt hơn (làm cho logic giữa các thanh ghi càng đơn giản càng tốt)
  • kiểm tra, thử nghiệm, kiểm tra để đảm bảo tính chính xác của chức năng và kiểm tra những thứ như regs chưa được khởi tạo và dây bị ngắt
  • tổng hợp và kiểm tra nhật ký tổng hợp để cảnh báo, đảm bảo các cảnh báo không chỉ ra sự cố (Cảnh báo thanh ghi bị xóa có thể là cố ý (không sử dụng đầu ra mô-đun) hoặc vô ý (quên kết nối đầu ra mô-đun / lỗi đánh máy / v.v.)
  • lập bản đồ và kiểm tra báo cáo bản đồ cho các số liệu sử dụng, đảm bảo rằng đồ họa không quá đầy
  • phân tích địa điểm và tuyến đường và thời gian, đảm bảo rằng thiết kế của bạn sẽ chạy ở tốc độ đồng hồ yêu cầu

Tôi đã có một vài thiết kế khá phức tạp hoạt động chính xác (hoặc ít nhất là chính xác) trong thử nghiệm đầu tiên trên một đồ họa thực tế bằng cách làm theo các điều trên. Không cần kiểm tra sơ đồ RTL, điều đó cực kỳ cồng kềnh và hoàn toàn lãng phí thời gian cho các thiết kế lớn. Một mô phỏng sau tổng hợp sẽ hữu ích hơn nhiều.


1
Cảm ơn bạn vì hồi ứng nhanh chóng. Bạn có thể vui lòng giải thích về điểm thứ hai (giảm thiểu mức logic).
Ironstein

5

Tất cả các mã tổng hợp của bạn cần phải được thể hiện như sau:

  • LUT
  • Dép tông
  • Nguyên thủy dành riêng cho nhà cung cấp

Các nguyên hàm dành riêng cho nhà cung cấp được khởi tạo một cách rõ ràng hoặc được tạo bởi trình hướng dẫn của nhà cung cấp hoặc được suy ra bởi các mẫu mã hóa rất cụ thể, do đó không nên có bất kỳ sự mơ hồ nào ở đó.

Trong VHDL chẳng hạn, bạn không thể sử dụng wait formã tổng hợp. Để hiểu lý do tại sao, hãy thử thể hiện một wait for 100 nscách xác định bằng cách sử dụng LUT hoặc flip-flop. Bạn không thể.

Điều đó không có nghĩa là bạn không thể thực hiện nó bằng cách thiết lập bộ đếm với tần số đồng hồ đã biết (với khoảng thời gian có thể chia 100 ns) và sử dụng số đếm của nó để biết khi nào thời gian kết thúc. Nhưng công cụ tổng hợp sẽ không tự động đưa ra sơ đồ này, bạn cần phải rõ ràng về kiến ​​trúc về mặt logic tổ hợp (cổng / LUT) và các thanh ghi.

Vì vậy, điều chính cần ghi nhớ để tạo mã tổng hợp, là có một bức tranh tương đối rõ ràng về cách mã của bạn trở thành cổng logic và flip flop. Đó thực sự là nó.


wait until rising_edge(clk);chắc chắn là có thể tổng hợp, mặc dù một số công cụ áp đặt các hạn chế đối với việc sử dụng nó.
Brian Drumond

2

Bước đầu tiên rõ ràng nhất là kiểm tra các cảnh báo.

Các công cụ Xilinx tạo ra các tệp nhật ký cảnh báo về bất kỳ thứ gì có thể không phải là thứ mà người viết mã dự định. Đôi khi điều này gây khó chịu, khi bạn có hàng loạt cảnh báo về các tín hiệu không được sử dụng mà bạn biết hoàn toàn rõ ràng không được sử dụng. Nhưng đôi khi nó bắt lỗi chính hãng. Nếu bạn là người mới, khả năng bạn mắc lỗi sẽ cao hơn đáng kể.

Sau đó, bạn cần phải thiết lập các ràng buộc thời gian. Làm thế nào nhanh chóng sau khi một cạnh tăng trên đồng hồ A dòng dữ liệu B cần phải được thiết lập? Hoặc dòng dữ liệu B cần được giữ trong bao lâu trước khi cạnh rơi trên đồng hồ A? Hạn chế thời gian sẽ cho phép bạn chỉ định tất cả điều này. Nếu bạn không có các ràng buộc về thời gian, trình biên dịch có thể cho rằng bạn không quan tâm đặc biệt và có thể định tuyến tín hiệu của bạn đến bất cứ đâu. Nếu bạn có các ràng buộc về thời gian, trình biên dịch sẽ hoạt động để đảm bảo tín hiệu của bạn đáp ứng các ràng buộc đó bằng cách di chuyển vị trí xung quanh. Và nếu nó không thể đáp ứng các hạn chế về thời gian, nó sẽ đưa ra cảnh báo.

Nếu vấn đề của bạn là đầu ra không làm được những gì bạn mong đợi, hãy xem chi tiết tại các khối I / O. Mỗi chân I / O có một chút logic liên quan và một flip-flop. Thứ tự mà bạn chỉ định các biến logic và trạng thái trong mã của mình có thể không giúp mã của bạn phù hợp với kiến ​​trúc này, do đó bạn sẽ có thêm độ trễ từ bất kỳ nơi nào nó được đặt. Cảnh báo về các ràng buộc thời gian sẽ cho bạn biết nếu điều này xảy ra (giả sử bạn đã thiết lập các ràng buộc thời gian của mình), nhưng việc khắc phục nó đòi hỏi bạn phải hiểu phần cứng và cách thiết kế của bạn sẽ ánh xạ vào phần cứng. Nói chung, đây chỉ là một vấn đề khi bạn bắt đầu đạt tốc độ xung nhịp cao, nhưng nó đáng được đề cập.

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.