Mục lục:

Arduino như một FPGA Breadboard giá rẻ: 5 bước (có hình ảnh)
Arduino như một FPGA Breadboard giá rẻ: 5 bước (có hình ảnh)

Video: Arduino như một FPGA Breadboard giá rẻ: 5 bước (có hình ảnh)

Video: Arduino như một FPGA Breadboard giá rẻ: 5 bước (có hình ảnh)
Video: Trên tay siêu phẩm bộ KIT học tập Arduino Uno R3 RFID BLK | Làm hệ thống gửi xe thông minh 2024, Tháng mười một
Anonim
Arduino như một FPGA Breadboard giá rẻ
Arduino như một FPGA Breadboard giá rẻ

Thiết kế mạch logic phần cứng có thể rất thú vị. Cách học cũ để làm điều này là sử dụng cổng NAND, trên bảng bánh mì, được kết nối bằng dây nhảy. Điều này vẫn có thể xảy ra, nhưng sẽ không mất nhiều thời gian trước khi số cửa vượt quá tầm tay. Một tùy chọn mới hơn là sử dụng FPGA (Mảng cổng lập trình trường). Những con chip này có thể tự cuộn lại để trở thành bất kỳ mạch logic kỹ thuật số nào mà bạn có thể thiết kế, nhưng không rẻ và luôn sẵn có. Tôi sẽ chỉ ra cách FPGA này có thể được thay thế bằng chip Atmega giá rẻ từ Arduino UNO, đưa mạch kỹ thuật số vào một gói DIP, rất thân thiện với breadboard một cách hiệu quả.

Bước 1: Thiết kế mạch mà "FPGA" sẽ đại diện

Thiết kế mạch điện
Thiết kế mạch điện
Thiết kế mạch điện
Thiết kế mạch điện
Thiết kế mạch mà
Thiết kế mạch mà

Tôi sẽ xây dựng một bộ cộng 2 bit + 2 bit. Nó cần hai cặp chân đầu vào logic và xuất ra một bộ ba chân đầu ra.

Để làm điều này với cổng NAND, hãy xem sơ đồ trong hình. Nó cần 14 cổng NAND. Tôi đã sử dụng 4 chip TTL cổng NAND quad và kết nối chúng trên bảng mạch bánh mì.

Tôi đã thêm một số đèn LED (đừng quên các điện trở giới hạn dòng điện) để hiển thị khi nào các chân đầu vào và đầu ra đang bật (cao) và khi nào chúng tắt (thấp). Để điều khiển các chân đầu vào, tôi có thể nhảy chúng vào đường ray nối đất hoặc đường ray điện dương.

Mạch này hoạt động, nhưng nó đã sử dụng 4 chip TTL và là một ổ chuột. Nếu cần nhiều bit hơn, sẽ có nhiều bảng mạch bánh mì hơn và nhiều bộ nhảy hơn. Rất nhanh chóng kích thước của mạch sẽ vượt ra khỏi tầm tay.

Một lưu ý nhỏ, khi làm việc với các cổng TTL, chúng không xuất ra chính xác 0V hoặc 5V như người ta mong đợi. Họ thường xuất ra xung quanh 3V cho "cao", nhưng điện áp chính xác là trong một phạm vi rất rộng. Cùng một mạch sử dụng chip tương đương CMOS sẽ tốt hơn chính xác từ 0V đến chính xác 5V.

Bước 2: Nhập FPGA

Nhập FPGA
Nhập FPGA
Nhập FPGA
Nhập FPGA

FPGA là một con chip tuyệt vời, theo nghĩa đen có thể trở thành bất kỳ tổ hợp cổng logic nào, được kết nối với nhau theo bất kỳ sự kết hợp nào. Một thiết kế "mạch" bằng ngôn ngữ thiết kế phần cứng (HDL). Có nhiều ngôn ngữ như vậy, một trong số đó được gọi là Verilog. Tệp.v trong hình là Verilog tương đương với bộ cộng hai bit. Tệp.pch bên dưới nó cũng cần thiết để gán các chân đầu vào và đầu ra có tên trong tệp Verilog cho các chân phần cứng thực trên chip.

Trong trường hợp này, tôi đang sử dụng bảng phát triển iCEstick của Lattice Semiconductors (https://www.latticesemi.com/icestick). Chip FPGA thực tế là iCE40HX-1k, với hơn 1000 cổng, mỗi cổng có thể trở thành bất kỳ cổng logic nào. Điều đó có nghĩa là mỗi cổng có thể là cổng NAND hoặc cổng OR, cổng NOT, NOR, XOR, v.v. Ngoài ra, mỗi cổng có thể xử lý nhiều hơn hai đầu vào. Điều này dành riêng cho từng nhà sản xuất, nhưng trên iCE40, mỗi cổng có thể xử lý 4 đầu vào. Vì vậy, mỗi cổng có khả năng cao hơn rất nhiều so với 2 cổng NAND đầu vào.

Tôi đã phải gán 4 thông đầu vào và 3 chân đầu ra cho các chân vật lý 91, 90, 88, 87, 81, 80 và 79 tương ứng. Điều này là cụ thể đối với chip fpga và bo mạch đột phá mà nó đang sử dụng, và cách các chân đó được kết nối với cổng PMOD. Điều này có sẵn trong bảng dữ liệu cho bảng FPGA này.

Lattice cung cấp chuỗi công cụ của riêng họ để tổng hợp các mạch (FPGA tương đương với biên dịch cho CPU) từ Verilog, nhưng tôi đã sử dụng chuỗi công cụ mã nguồn mở miễn phí icestorm (https://www.clifford.at/icestorm/). Hướng dẫn cài đặt có sẵn trên trang web đó. Với icestorm được cài đặt và tệp Verilog và pcf, các lệnh để tải mạch này lên FPGA là:

yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif

arachne-pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc

icepack haiBitAdder.asc haiBitAdder.bin

iceprog haiBitAdder.bin

Điều này hoạt động tuyệt vời, nhưng bao gồm cả việc vận chuyển iCEstick này sẽ có giá khoảng 30 đô la. Đây không phải là cách rẻ nhất để xây dựng một mạch kỹ thuật số, nhưng nó rất mạnh mẽ. Nó có hơn 1000 cổng và đối với mạch nhỏ này, nó chỉ sử dụng 3 trong số chúng. Cổng NAND tương đương sử dụng 14 cổng. Điều này là do thực tế là mỗi cổng có thể trở thành bất kỳ loại cổng nào, và mỗi cổng thực sự là một cổng 4 đầu vào. Mỗi cổng có thể làm được nhiều hơn thế. Nếu bạn cần nhiều cổng hơn, iCEstick có một người anh em lớn hơn với 8000 cổng, giá khoảng gấp đôi. Các nhà sản xuất khác có các dịch vụ khác nhưng giá có thể khá cao.

Bước 3: Từ FPGA sang Arduino

Từ FPGA đến Arduino
Từ FPGA đến Arduino

FPGA rất tuyệt vời, nhưng có thể đắt tiền, khó kiếm và không thân thiện với bảng mạch bánh mì. Một chip giá rẻ và thân thiện với breadboard là Atmega 328 P, đi kèm trong một gói DIP gọn gàng, hoàn hảo cho breadboard. Nó cũng có thể có với giá khoảng 4 đô la. Đây là trái tim của Arduino UNO. Tất nhiên bạn có thể sử dụng toàn bộ UNO, nhưng giá rẻ, chúng tôi có thể kéo Atmega 328 P ra khỏi UNO và sử dụng nó một mình. Tuy nhiên, tôi đã sử dụng bảng UNO như một lập trình viên cho Atmega.

Tại thời điểm này, bạn sẽ cần

1. Một Arduino UNO, với CPU Atmega 328P có thể tháo rời.

2. Một Atmega 328P khác với bộ nạp khởi động Arduino đã được ghi sẵn, để thay thế bộ nạp mà chúng tôi sắp lấy ra khỏi UNO. (Tùy chọn giả sử bạn vẫn muốn có UNO có thể sử dụng được).

Mục đích là chuyển đổi tệp Verilog thành một dự án arduino có thể được tải vào 328P. Arduino dựa trên C ++. Thuận tiện có một trình dịch từ Verilog sang C ++, được gọi là Verilator (https://www.veripool.org/wiki/verilator). Verilator nhằm mục đích được sử dụng bởi các nhà thiết kế phần cứng, những người cần mô phỏng thiết kế của họ trước khi đưa các thiết kế đó vào phần cứng đắt tiền. Trình xác minh chéo biên dịch Verilog sang C ++, sau đó người dùng cung cấp khai thác thử nghiệm để cung cấp tín hiệu đầu vào mô phỏng và ghi lại tín hiệu đầu ra. Chúng tôi sẽ sử dụng nó để nhồi nhét thiết kế Verilog vào Atmega 328P bằng chuỗi công cụ Arduino.

Đầu tiên hãy cài đặt Trình xác minh. Làm theo hướng dẫn tại

Cũng cài đặt Arduino IDE và kiểm tra xem nó có thể kết nối với Arduino UNO qua USB hay không.

Chúng tôi sẽ sử dụng cùng một tệp Verilog như cho FPGA, ngoại trừ tên của các chân cần được thay đổi. Tôi đã thêm dấu gạch dưới (_) vào đầu mỗi câu. Điều này là cần thiết vì các thư viện arduino bao gồm một tệp tiêu đề để dịch những thứ như B0, B001, v.v., sang số nhị phân. Các tên pin đầu vào khác có thể vẫn ổn, nhưng B0 và B1 có thể khiến quá trình xây dựng bị lỗi.

Trong thư mục chứa haiBitAdder.v và iCEstick.pcf, hãy chạy như sau:

Verilator -Wall --cc twoBitAdder.v

Thao tác này sẽ tạo một thư mục con được gọi là obj_dir chứa một số tệp mới. Chúng tôi chỉ cần các tệp tiêu đề và cpp, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h và VtwoBitAdder_Syms.cpp.

Trong Arduino IDE, tạo một bản phác thảo mới có tên là twoBitAdder.ino. Thao tác này sẽ tạo tệp ino trong một thư mục mới còn được gọi là twoBitAdder, bên trong thư mục sổ phác thảo Arduino của bạn. Sao chép các tệp VtwoBitAdder.h và VtwoBitAdder.cpp vào thư mục twoBitAdder này trong thư mục Arduino của bạn.

Bây giờ sao chép các tệp tiêu đề từ cài đặt trình xác minh.

cp / usr / local / share / verifylator / include / Verilated *.

cuối cùng sao chép trong thư viện std c ++ từ https://github.com/maniacbug/StandardCplusplus. Theo hướng dẫn cài đặt của họ Bản phác thảo này được cài đặt giống như một thư viện Arduino thông thường. Giải nén nội dung của bản phân phối vào thư mục 'thư viện' trong sổ phác thảo của bạn. Ví dụ: sổ phác thảo của tôi ở / home / maniacbug / Source / Arduino, vì vậy thư viện này nằm trong / home / maniacbug / Nguồn / Arduino / thư viện / StandardCplusplus.

Đảm bảo đặt lại Arduino IDE của bạn sau khi cài đặt nó."

Bây giờ thay thế nội dung của twoBitAdder.ino bằng nội dung được cung cấp ở bước này. Đây là một thử nghiệm khai thác mà trình xác minh mong đợi, thiết lập các chân đầu vào / đầu ra, sau đó trong vòng lặp, đọc các chân đầu vào, đưa chúng vào VtwoBitAdder (phiên bản đã dịch của mạch của chúng tôi), sau đó đọc kết quả đầu ra từ VtwoBitAdder và áp dụng chúng đến các chân đầu ra.

Chương trình này nên biên dịch và thực thi trên Arduino UNO.

Bước 4: Từ Arduino sang chip DIP trên bảng mạch bánh mì

Từ Arduino đến chip DIP trên bảng mạch bánh mì
Từ Arduino đến chip DIP trên bảng mạch bánh mì

Bây giờ chương trình đang chạy trên Arduino, chúng ta không còn cần đến chính bảng Arduino nữa. Tất cả những gì chúng ta cần là CPU.

Tháo Atmega 328P cẩn thận khỏi ổ cắm Arduino UNO và tùy chọn lắp bộ thay thế của nó.

Đặt Atmega 328P vào breadboard. Đặt phần cuối với divot hướng lên trên bảng bánh mì. Ghim 1 là ghim trên cùng bên trái. Ghim 2 là chốt tiếp theo xuống và cứ tiếp tục như vậy đến ghim 14 ở dưới cùng bên trái. Sau đó, chân 15 ở dưới cùng bên phải và chân 16 đến 28 đếm ngược lên phía bên phải của chip.

Nối chân 8 và 22 với đất.

Kết nối chân 7 với VCC (+ 5V).

Kết nối một tinh thể thạch anh 16Mhz giữa các chân 9 và 10. Ngoài ra, một tụ điện nhỏ (22pF) giữa chân 9 và mặt đất, và giữa chân 10 và mặt đất. Điều này mang lại cho Atmega 328P tốc độ đồng hồ 16Mhz. Có những hướng dẫn ở nơi khác về việc dạy 328P thay vào đó sử dụng xung nhịp 8Mhz bên trong của nó, điều này sẽ tiết kiệm một vài phần, nhưng điều đó sẽ làm chậm bộ xử lý.

Các cổng Arduino GPIO 5, 6, 7 và 8, mà chúng tôi sử dụng cho các chân đầu vào thực chất là các chân vật lý 11, 12, 13, 14 trên Atmega 328P. Đó sẽ là bốn chốt dưới cùng bên trái.

Các cổng Arduino GPIO 11, 10 và 9, mà chúng tôi sử dụng cho các chân đầu ra thực sự là các chân vật lý 17, 16, 15 trên Atmega 328P. Đó sẽ là ba chân dưới cùng bên phải.

Tôi đã nối các đèn LED vào các chân này như trước đây.

Bước 5: Kết luận

Phần kết luận
Phần kết luận

Các chip TTL hoạt động được, nhưng chúng cần rất nhiều để xây dựng bất cứ thứ gì. FPGA hoạt động thực sự tốt, nhưng không rẻ. Nếu bạn có thể sống với ít chân IO hơn và tốc độ thấp hơn, thì Atmega 328P có thể là chip dành cho bạn.

Một số điều cần ghi nhớ:

FPGA:

Pro

- Có thể xử lý tín hiệu tốc độ cao. Bởi vì không có CPU nào để xử lý tắc nghẽn đối với một lệnh tại một thời điểm, yếu tố hạn chế là độ trễ truyền qua các cổng trên mạch nhất định. Trong nhiều trường hợp, tốc độ này có thể nhanh hơn nhiều so với xung nhịp được cung cấp cùng với chip. Đối với thiết kế của tôi, độ trễ được tính toán sẽ cho phép haiBitAdder phản hồi khoảng 100 triệu thay đổi giá trị đầu vào mỗi giây (100Mhz) mặc dù đồng hồ trên bo mạch chỉ là tinh thể 12Mhz.

- Khi thiết kế ngày càng phức tạp, hiệu suất của các mạch hiện có không bị suy giảm (nhiều). Bởi vì việc thêm các mạch vào cấu trúc chỉ đơn giản là đưa một cái gì đó mới vào bất động sản chưa sử dụng, nó không ảnh hưởng đến mạch hiện có.

- Tùy thuộc vào FPGA, số lượng chân IO có sẵn có thể rất cao và chúng thường không bị khóa vào bất kỳ mục đích cụ thể nào.

Con

- Có thể đắt và / hoặc khó kiếm.

- Thường có trong gói BGA yêu cầu một số loại bảng đột phá để hoạt động với chip trong bất kỳ dự án nghiệp dư nào. Nếu bạn đang xây dựng nó thành một thiết kế với SMT PCB nhiều lớp tùy chỉnh, đây không phải là vấn đề.

- Hầu hết các nhà sản xuất FPGA đều cung cấp phần mềm thiết kế mã nguồn đóng của riêng họ, phần mềm này trong một số trường hợp có thể tốn tiền hoặc có ngày giấy phép hết hạn.

Arduino dưới dạng FPGA:

Pro

- Giá rẻ, và dễ lấy. Chỉ cần tìm kiếm atmega328p-pu trên Amazon. Chúng phải khoảng $ 4 / cái. Một số người bán bán chúng với số lượng 3 hoặc 4.

- Đây là một gói DIP, có nghĩa là hoàn toàn phù hợp trên một breadboard với các chân bên ngoài của nó.

- Đây là thiết bị 5V, có thể dễ dàng giao tiếp với các thiết bị 5V khác.

Con

- ATMEGA328P có một số lượng chân IO giới hạn (23) và một số trong số chúng được dành riêng cho các nhiệm vụ cụ thể.

- Khi độ phức tạp của mạch tăng lên, lượng mã chạy trong phương pháp vòng lặp Arduino tăng lên, có nghĩa là thời gian của mỗi chu kỳ dài hơn.

- Ngay cả khi độ phức tạp của mạch thấp, mỗi chu kỳ yêu cầu nhiều lệnh CPU để tìm nạp giá trị chân đầu vào, và ghi giá trị chân đầu ra, và quay trở lại đầu vòng lặp. Với tinh thể 16Mhz, ngay cả ở một lệnh trên mỗi chu kỳ đồng hồ, vòng lặp sẽ không chạy quá 1 triệu lần mỗi giây (1Mhz). Mặc dù vậy, đối với hầu hết các dự án điện tử nghiệp dư nhanh hơn mức cần thiết.

Đề xuất: