Động lực trong việc sử dụng Verilog hoặc VHDL trên C là gì?


12

Tôi đến từ một nền tảng lập trình và không bị rối tung quá nhiều với phần cứng hoặc phần sụn (nhiều nhất là một chút điện tử và Arduino).

Động lực trong việc sử dụng các ngôn ngữ mô tả phần cứng (HDL) như Verilog và VHDL so với các ngôn ngữ lập trình như C hoặc một số hội là gì?

Đây có phải là vấn đề của sự lựa chọn?

Tôi đọc phần cứng đó, phần sụn của nó được viết bằng HDL, có một lợi thế rõ ràng trong việc chạy các hướng dẫn song song. Tuy nhiên, tôi đã rất ngạc nhiên khi thấy các cuộc thảo luận bày tỏ sự nghi ngờ về việc nên viết firmware trong C hay hội (làm thế nào hội phù hợp nếu bạn không nhất thiết phải có CPU?) Nhưng tôi kết luận đó cũng là một lựa chọn.

Do đó, tôi có một vài câu hỏi (đừng ngần ngại giải thích bất cứ điều gì):

  1. Phần sụn thực sự có thể được viết bằng HDL hoặc bằng ngôn ngữ lập trình phần mềm, hay đó chỉ là một cách khác để thực hiện cùng một nhiệm vụ? Tôi thích những ví dụ thực tế. Những hạn chế kết quả từ mỗi lựa chọn?

  2. Tôi biết rằng việc sử dụng phần mềm cơ sở trên phần mềm là phổ biến trong các bộ tăng tốc phần cứng (như GPU, bộ điều hợp mạng, bộ tăng tốc SSL, v.v.). Theo tôi hiểu, việc tăng tốc này không phải lúc nào cũng cần thiết, mà chỉ được khuyến nghị (ví dụ, trong trường hợp SSL và tăng tốc của các thuật toán phức tạp). Có thể chọn giữa phần sụn và phần mềm trong mọi trường hợp không? Nếu không, tôi rất vui với các trường hợp trong đó phần sụn rõ ràng và phù hợp một cách rõ ràng.

  3. Tôi đã đọc rằng phần sụn chủ yếu được ghi trên ROM hoặc flash. Làm thế nào nó được đại diện trong đó? Trong bit, như phần mềm? Nếu vậy, sự khác biệt sâu sắc là gì? Đây có phải là sự sẵn có của các mạch thích ứng trong trường hợp phần sụn?

Tôi đoán tôi đã phạm sai lầm ở đây và ở đó trong một số giả định, xin vui lòng tha thứ cho tôi. Cảm ơn bạn!


14
Ngôn ngữ lập trình là để mô tả phần mềm, ngôn ngữ mô tả phần cứng là để mô tả phần cứng.
Ignacio Vazquez-Abrams

1
Bạn không viết chương trình cơ sở với Verilog hoặc VHDL - bạn sử dụng Verilog hoặc VHDL để thiết kế chip, chương trình FPGA và thiết kế bo mạch chủ. Bạn sử dụng C hoặc lắp ráp để viết firmware. Bạn cũng có thể sử dụng C / C ++ để thiết kế bo mạch chủ - có một thư viện có tên SystemC có thể được biên dịch bởi trình biên dịch C để tạo chương trình mô phỏng thiết kế của bạn nhưng cũng có thể được trình biên dịch SystemC biên dịch thành các mạch.
slebetman

FWIW, vì bạn có kinh nghiệm về Arduino, phần mềm viết cho Arduino được gọi là phần sụn viết. Phần sụn có thể là hệ điều hành hoàn chỉnh - ví dụ linux được sử dụng trong phần sụn của hầu hết các bộ định tuyến và Windows được sử dụng trong phần sụn của hầu hết các máy ATM
slebetman

Câu trả lời:


28

Động lực trong việc sử dụng các ngôn ngữ mô tả phần cứng (HDL) như Verilog và VHDL so với các ngôn ngữ lập trình như C hoặc một số hội là gì?

C và lắp ráp là những ngôn ngữ tốt để nói cho CPU biết phải làm gì. Chúng mô tả các hành động được thực hiện tuần tự bởi một máy trạng thái duy nhất.

HDL là ngôn ngữ tốt để mô tả hoặc xác định một bộ sưu tập các mạch kỹ thuật số tùy ý. Chúng có thể diễn đạt các hoạt động được thực hiện song song theo cách mà các ngôn ngữ lập trình không thể. Họ cũng có thể mô tả các giới hạn thời gian cho các giao diện giữa các khối theo cách mà ngôn ngữ lập trình không thể.

Tôi đã rất ngạc nhiên khi thấy các cuộc thảo luận bày tỏ sự nghi ngờ về việc nên viết firmware trong C hay hội (làm thế nào hội phù hợp nếu bạn không nhất thiết phải có CPU?)

Trong câu hỏi đó, câu hỏi được đặt ra là: "Nếu bạn đang viết mã cho vi điều khiển thì có sự khác biệt thực sự nếu bạn viết bằng cách lắp ráp hoặc C hoặc một số ngôn ngữ cấp cao khác?".

Vì anh ta đặc biệt hỏi về các hệ thống có vi điều khiển (CPU có thiết bị ngoại vi), C hoặc lắp ráp đều là những lựa chọn hợp lý để phát triển Firwmare, còn HDL thì không.

Phần sụn thực sự có thể được viết bằng HDL hoặc bằng ngôn ngữ lập trình phần mềm, hay đó chỉ là một cách khác để thực hiện cùng một nhiệm vụ?

Nó phụ thuộc vào loại phần cứng bạn có. Nếu bạn có CPU, hãy sử dụng ngôn ngữ lập trình. Nếu bạn có một đồ họa hoặc bạn đang thiết kế ASIC, hãy sử dụng HDL. Nếu bạn đang thiết kế một lượng logic kỹ thuật số rất lớn, bạn có thể tìm đến một trong những ngôn ngữ ở giữa như SystemVerilog.

Tôi đã đọc rằng phần sụn chủ yếu được ghi trên ROM hoặc flash. Làm thế nào nó được đại diện trong đó? Trong bit, như phần mềm? Nếu vậy, sự khác biệt sâu sắc là gì? Đây có phải là sự sẵn có của các mạch thích ứng trong trường hợp phần sụn?

Tôi nghĩ rằng bạn đang bị treo lên với thuật ngữ "phần sụn". Từ này ban đầu có nghĩa là mã được chạy trên một hệ thống nhúng, người dùng cuối không thể truy cập để thay đổi. Nếu bạn bán cho ai đó một PC, rất có khả năng người dùng sẽ thay đổi phần mềm nào đang chạy trên nó. Nếu bạn bán cho họ một máy hiện sóng, bạn sẽ không muốn họ thay đổi mã chạy trên bộ vi xử lý bên trong, vì vậy bạn đã gọi nó là phần sụn.

Người dùng FPGA đã sử dụng từ "phần sụn" cho đầu ra của thiết kế của họ, bởi vì nó dễ thay đổi hơn phần cứng (thứ được hàn lại với nhau). Nhưng thực sự "phần sụn" cấu hình một đồ họa khác với "phần sụn" chạy trên uC. phần sụn uC chỉ đạo uC thông qua một loạt các trạng thái để thực hiện chức năng của nó. Chương trình cơ sở đồ họa xác định một tập hợp các kết nối giữa các thành phần logic và các giá trị sẽ được lưu trữ trong các bảng tra cứu.

Trong cả hai trường hợp, phần sụn thường được lưu trữ dưới dạng bit trên eeprom (hoặc trên đĩa trên máy chủ sẽ tải nó bất cứ khi nào hệ thống nhúng được khởi động lại). Nhưng điều đó không làm cho chúng tương tự nhau.


Khi bạn viết bằng VHDL / Verilog, việc hình dung logic sẽ được triển khai và do đó tối ưu hóa sẽ dễ dàng hơn rất nhiều. Điều tương tự cũng không thể nói với C. Ngay cả SystemC vẫn đủ ly dị với việc thực hiện vật lý thực tế mà kết quả tổng hợp bất ngờ có thể xảy ra
JonRB

@JonRB, Nếu bạn đang mã hóa cho uC hoặc uP, tôi thực sự không biết bất kỳ cách nào để làm điều đó với HDL. Tôi đồng ý rằng khi mã hóa logic, SystemVerilog hoặc SystemC dành cho các hệ thống lớn đến mức nó không thực tế để cố gắng thiết kế mọi thứ ở cấp độ cổng riêng lẻ.
Photon

2
Lưu ý rằng VHDL và Verilog cũng được sử dụng khi bạn không có phần cứng nào cả. Chúng có thể được biên dịch trực tiếp vào các mạch thay vì dòng bit. Ví dụ, Apple đã sử dụng để thiết kế bo mạch chủ của họ bằng Verilog thay vì chụp sơ đồ GUI vì có hỗ trợ tốt hơn cho kiểm soát phiên bản, grepping và chỉ đơn giản là phân tích cú pháp bằng cách sử dụng tập lệnh khi thiết kế của bạn là văn bản thuần thay vì bản vẽ nhị phân độc quyền.
slebetman

10

Đối với phần đầu tiên của câu hỏi của bạn, về các động lực của việc sử dụng cái này hay cái khác: có một sự khác biệt cơ bản giữa C và HDL (VHDL / Verilog) . C là ngôn ngữ lập trình phần mềm (như lắp ráp), VHDL / Verilog là ngôn ngữ mô tả phần cứng . Chúng không có nghĩa cho cùng một mục đích.

C được dịch thành mã lắp ráp (ở dạng nhị phân, tức là ngôn ngữ máy) khi được biên dịch . Mã này là một chuỗi các hướng dẫn yêu cầu CPU thực hiện một loạt các hoạt động cơ bản (thay đổi giá trị đăng ký, thực hiện bổ sung, v.v.).

Mặt khác, HDL được tổng hợp thành phần cứng. Trong VHDL, ví dụ bạn có thể viết một cái gì đó như:

output <= input1 + input2;

(xem thêm một ví dụ đầy đủ hơn ở đây ). Điều này sẽ được tổng hợp thành một bộ cộng (phần cứng). Nếu mã được tổng hợp cho một FPGA , điều này có nghĩa là một dòng bit có thể cấu hình các FPGA cụ thể để thực hiện một bộ cộng (dưới dạng logic tổ hợp ).

Trên thực tế, bạn có thể thiết kế CPU trong VHDL (xem Bộ xử lý lõi mềm VS Bộ xử lý lõi cứng ) và viết phần mềm cho nó trong C ...

Về phần sụn: tất cả thực sự phụ thuộc vào cách bạn định nghĩa từ. Phần sụn có thể là một chương trình (phần mềm) chạy trong vi điều khiển (ví dụ được viết bằng C hoặc trình biên dịch) hoặc nó có thể là một dòng bit để cấu hình một thiết bị logic lập trình (phần cứng) (CPLD hoặc FPGA). Đôi khi, nó có thể là một gói chứa cả hai: nếu bạn lấy phần sụn cho một số kiểu FritzBox (modem ADSL), chúng thực sự chứa toàn bộ hệ thống Linux (được viết bằng trình biên dịch, C và nhiều ngôn ngữ lập trình khác) và một dòng bit cấu hình một đồ họa (có khả năng được tổng hợp từ VHDL hoặc Verilog).


3
  1. Nó phụ thuộc vào kiến ​​trúc của bạn. Nếu bạn có CPU (hoặc, thông thường, Vi điều khiển), bạn cần viết chương trình cơ sở bằng ngôn ngữ lập trình thông thường (bao gồm cả lắp ráp). Nếu bạn có một cái gì đó giống như một đồ họa, phần sụn của bạn cần phải được viết bằng HDL. HDL không thể (theo hiểu biết của tôi) tạo ra các chương trình có thể được thực thi hiệu quả bởi CPU thông thường và một GPU không thực hiện các chương trình thông thường ngoài hộp. Tuy nhiên, bạn có thể cấu hình FPGA của mình dưới dạng CPU và sau đó thực hiện một chương trình thông thường với điều đó. Điều này sẽ yêu cầu hai lớp phần sụn, lớp dưới được viết bằng HDL để xây dựng CPU và lớp cao hơn được viết bằng ngôn ngữ lập trình thông thường để thực thi trên CPU đó.
  2. Không có sự phân biệt cứng giữa phần sụn và phần mềm. Trên nhiều thiết bị, phần sụn sẽ được lưu trữ trong bộ nhớ flash, nhưng trên điện thoại hiện đại, hầu hết mọi thứ được lưu trữ trong bộ nhớ flash và sự khác biệt giữa phần sụn và phần mềm là không rõ ràng (hầu hết mọi người có thể sẽ xem xét mã để lập trình phần mềm bộ xử lý baseband và hầu hết mọi người sẽ xem xét phần mềm chương trình ứng dụng, nhưng đâu là ranh giới chính xác?).
  3. Như tôi đã nói trong 2, không có sự phân biệt rõ ràng, ngoài ý tưởng rằng phần sụn là lâu dài hơn một chút.

3

Đồng thời phần cứng là một động lực chính.

Các electron có thể chảy cùng một lúc trong các dây song song, vì vậy chúng tôi muốn tính đến điều đó khi thiết kế phần cứng.

Trong VHDL, nếu bạn viết một cái gì đó như:

x <= a or b;
y <= a and b;
z <= x xor y;

(bên ngoài một processhoặc function, rõ ràng đánh dấu nó là tuần tự), sau đó bạn đã mã hóa thực tế rằng:

  • x, y, z, ablà dây
  • ablà tín hiệu đầu vào
  • xđược kết nối với đầu ra của một ormạch, lấy ablàm đầu vào
  • và như vậy cho các dòng khác

Thật dễ dàng để xem làm thế nào nó sẽ được tổng hợp vào phần cứng thực tế, và điều đó xyđược đánh giá cùng một lúc.

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

Sau đó, khi đến lúc mô phỏng mạch, trình giả lập (thường là chương trình tuần tự) đã mô phỏng vật lý của mạch giống như thế này:

  • đã ahay bthay đổi? Đúng? Này, xphụ thuộc vào a. Hãy cập nhật x.
  • ycũng phụ thuộc vào a. Cập nhật điều đó là tốt.
  • zphụ thuộc vào x. Cập nhật nó vì xđã được cập nhật.
  • có bất cứ điều gì xphụ thuộc vào ( ahoặc b) đã được cập nhật? Không? Tương tự cho yz. OK, chúng tôi đã hoàn thành bước này.

Điều này dẫn đến các kết quả có thể "thú vị" không có tương tự tuần tự, nhưng đại diện cho các tình huống vật lý có thể xảy ra:

  • x <= not xsẽ dẫn đến một đệ quy vô hạn của mô phỏng. Mô phỏng chỉ có thể cắt sau một độ sâu nhất định.
  • x <= 0; x <= 1dẫn đến một lỗi (ngắn mạch). Đây là một trong những lý do tại sao std_logictồn tại.

Tuy nhiên, mặc dù mô hình VHDL phần cứng chặt chẽ hơn C, nhưng bản thân nó không phải là một mô tả chi tiết hoàn hảo về nó:

Cuối cùng, VHDL cung cấp một sự cân bằng tốt giữa chức năng mạch dễ hiểu của con người ở cấp độ cao hơn và khả năng tổng hợp ở cấp độ thấp hơn.

Mặt khác, C tập trung hơn vào việc nói chuyện với CPU một cách tuần tự.

Tất nhiên bạn có thể mã hóa một mạch với các cấu trúc C, enum và mảng, sau đó mô phỏng nó giống như VHDL (điều này trông ít nhiều giống như những gì System C làm, nhưng tôi chưa bao giờ thử nó).

Nhưng về cơ bản, bạn sẽ thực hiện lại một trình giả lập VHDL và với ngôn ngữ dài dòng hơn. Đúng công cụ cho công việc đúng tôi đoán.

Ngoài ra còn có các công cụ chuyển đổi C thành VHDL /programming/8988629/can-you-program-fpgas-in-c-like-lacular nhưng mong đợi hiệu suất thấp hơn vì đó là những chuyển đổi cấp độ cao khó hơn.


0

HDL được sử dụng để mô tả (tổng hợp) phần cứng trong đó ngôn ngữ lập trình được sử dụng để lập trình phần cứng đã được tổng hợp tức là cpu.

Bạn có thể lấy các phiên bản lõi mềm của cpus là VHDL hoặc bitflow để tổng hợp cpu đó trên một đồ họa.


-1

Một bộ xử lý sử dụng một lượng mạch khiêm tốn để thực hiện một số lượng lớn các hoạt động, theo tuần tự, bằng cách cho phép hầu hết các thành phần được sử dụng để thực hiện các hoạt động khác nhau tại các thời điểm khác nhau.

Một đồ họa chứa một số mạch không thể - ít nhất là riêng lẻ - thực hiện các hoạt động đặc biệt tinh vi, nhưng tất cả đều có khả năng hoạt động đồng thời và độc lập.

Giả sử người ta muốn có một con chip thực hiện một số nhiệm vụ, trong đó có giám sát 15 đầu vào và:

  • Đặt mức đầu ra cao bất cứ lúc nào tất cả các đầu vào đều ổn định trong ít nhất 21ms và số lượng đầu vào cao là bội số của ba
  • Đặt mức đầu ra thấp bất cứ lúc nào tất cả các đầu vào đều ổn định trong ít nhất 21ms và số lượng đầu vào cao không phải là bội số của ba
  • Thay đổi đầu ra theo cách tùy ý giữa thời gian bất kỳ thay đổi đầu vào và thời gian tất cả các đầu vào đã ổn định trong ít nhất 20ms.

Nếu một người có một vi điều khiển đang làm những việc khác, nhưng có thể dành vài micrô giây cứ sau 20ms để kiểm tra các đầu vào đó và đặt đầu ra, thì hầu hết các mạch mà vi điều khiển sử dụng để thực hiện các tác vụ khác cũng sẽ có thể sử dụng để thực hiện tác vụ được chỉ định ở trên, rất ít mạch (trừ một số ROM và có thể RAM) sẽ cần phải được dành cho nhiệm vụ đó. Mặt khác, có thể mất một lúc giữa thời gian đầu vào thay đổi và thời gian đầu ra phản ánh đúng.

Sử dụng Verilog hoặc VHDL, người ta có thể xây dựng một mạch phần cứng có thể liên tục theo dõi 15 đầu vào và thực hiện tính toán được chỉ định. Một thiết bị như vậy có thể sẽ có đầu ra tạo ra một chỉ thị chính xác trong vòng 100ns - đơn đặt hàng có cường độ nhanh hơn vi điều khiển - nhưng lượng mạch dành riêng cho nhiệm vụ đó và không thể sử dụng cho bất kỳ mục đích nào khác sẽ lớn hơn nhiều.


Đây dường như không phải là một ví dụ cắt giảm đặc biệt rõ ràng để minh họa cho sự khác biệt - có đủ các điểm gây tranh cãi trong chi tiết của nó rằng nó có thể không thực sự giúp làm quen với bất kỳ ai chưa quen. Ai đó thực tế phải đối mặt với vấn đề này có lẽ sẽ chọn một MCU hiện đại với từ dữ liệu rộng và các ngắt thay đổi pin tốt. Quyết định giải pháp nào đang tiêu thụ nhiều logic hơn sau đó sẽ yêu cầu quyết định nếu bạn đếm số lượng thiết bị ngoại vi không sử dụng trên MCU hoặc các lát cắt chưa được xử lý trên FPGA. Các cựu sẽ rẻ hơn một chút.
Chris Stratton

@ChrisStratton: Có lẽ tôi nên đề xuất rằng mọi thứ có thể thay đổi nếu yêu cầu về thời gian trở nên chặt chẽ hơn? Yêu cầu CPU có sẵn một vài micro giây trong mỗi 20ms có thể không yêu cầu bất kỳ thay đổi nào đối với hệ thống cơ bản, nhưng nếu thời gian đáp ứng cần là 200us, thì yêu cầu đó có thể cần CPU nhanh hơn nếu không cần thiết, nếu cần dưới 20us, có thể cần phải thêm một CPU bổ sung chỉ để xử lý nó và nếu dưới 200ns, có thể không thể thực hiện được tất cả với CPU.
supercat

Đó là bởi vì bạn không tận dụng khả năng của MCU. Trên ngắt thay đổi pin, bắt đầu khối hẹn giờ phần cứng sẽ đặt đầu ra 20 ms sau. Sau đó quyết định, lúc rảnh rỗi nếu điều đó thực sự được bảo hành, và nếu không, hãy hủy bỏ nó. Đây thực sự không phải là một ví dụ tuyệt vời để làm cho điểm FPGA của bạn bởi vì có quá nhiều sự phụ thuộc lẫn nhau - phần duy nhất thực sự chạy song song là phát hiện sự kiện và MCU hiện đại đã cung cấp cho bạn phần lớn song song. Trong khi đó phần còn lại là tuần tự hiệu quả, vậy bạn có xây dựng một cỗ máy trạng thái cực nhanh mà xem đồng hồ rất chậm?
Chris Stratton

@ChrisStratton: Nếu tính năng ngắt thay đổi pin phù hợp tồn tại và chưa được sử dụng cho mục đích khác, điều đó có thể tránh được yêu cầu bỏ phiếu liên tục, nhưng nếu nhiều việc xảy ra ngay lập tức, chúng sẽ cần được xử lý tuần tự ở bất kỳ mức nào CPU có thể xử lý chúng.
supercat

Xử lý tuần tự là một vấn đề không có sự chậm trễ lớn mà tuyên bố vấn đề của bạn áp đặt giữa đầu vào và phản hồi. Và ngay cả khi MCU hiện tại quá bận rộn, việc thêm một mục đích cho mục đích này sẽ là một phần chi phí của việc thêm một FPGA. Trên thực tế, cách duy nhất mà vấn đề này được giải quyết trong một GPU là bởi vì đã có một lát cắt dự phòng và các tín hiệu được chuyển đến nó, hoặc như một dự án nhân tạo trong bối cảnh giáo dục hoặc sở thích.
Chris Stratton
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.