Tôi không quen thuộc với các công cụ của Xilinx, nhưng tôi với Altera, vì vậy tôi sẽ kể cho bạn nghe về các công cụ của họ. Xilinx và những người khác không nên quá khác biệt.
Phiên bản
Điều đầu tiên bạn sẽ cần làm là học Verilog . Điều này sẽ khiến bạn đau đầu vì Verilog (và VHDL hơi giống nhau) lần đầu tiên được thiết kế dưới dạng ngôn ngữ mô phỏng và nhiều cấu trúc (như #5
có nghĩa là "chờ 5 bước thời gian", bước thời gian thường là nano giây). Vì vậy, có rất nhiều hạn chế mà bạn phải ghi nhớ để làm cho mã Verilog của bạn có thể tổng hợp được , tức là có thể biên dịch thành một dòng bit cho một FPGA.
Tuy nhiên, cú sốc lớn nhất là những gì bạn viết trong Verilog (và VHDL) là hành vi bạn mong đợi từ hệ thống và trình biên dịch đưa ra logic thích hợp từ mô tả của bạn. Nếu bạn không cẩn thận, bạn có thể nhận được rất nhiều lỗi khó chịu từ việc này.
Ví dụ, một flip-flop D trông giống như:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Phần này mô tả cách DFF hoạt động và trình biên dịch phải phân tích nó và tìm ra bạn muốn có DFF. Các @(...)
được gọi là một danh sách nhạy cảm , đó là một danh sách các tín hiệu kích hoạt một tái thẩm định của khối mã; do đó, trong khối này, Q
chỉ thay đổi nếu có cạnh tăng trên RESET
hoặc CLK
(đây là cho thiết lập lại hoạt động ở mức cao). Nếu bạn quên một cái gì đó trong danh sách độ nhạy (cần chứa tất cả các biến ở phía bên phải mà không có bất kỳ posedge
hoặc negedge
sửa đổi nào cho khối logic tổ hợp), trình biên dịch sẽ tổng hợp các chốt khi cần thay vì gọi lỗi. Thật điên rồ, nhưng nó là như vậy, bởi vì Verilog ban đầu là một ngôn ngữ mô phỏng ẩn (và do đó không yêu cầu) chi tiết triển khai. VHDL là như nhau nhưng dài dòng hơn nhiều.
Cuối cùng, một phiên bản mới của Verilog có tên SystemVerilog đã được phát hành vài năm trước, giúp việc viết mã tổng hợp dễ dàng hơn nhiều . Nếu có thể, hãy học ngôn ngữ này, vì Xilinx ISE và Altera Quartus II đều hỗ trợ nó. Vấn đề chính là thiếu tài liệu tham khảo tốt.
Phiên bản SystemVerilog của DFF sẽ dọn sạch một vài điều nhỏ:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Lưu ý rằng các tín hiệu trong danh sách độ nhạy được phân tách bằng dấu phẩy. Điều này là do or
đã gây nhầm lẫn vì and
không thể làm việc ở đó. Cũng lưu ý việc thay thế 1'b0
(một đơn 0
bit) với '0
(một biểu tượng mà mở rộng tới tuy nhiên nhiều 0
bit là cần thiết dựa trên những gì nó đang được giao nhiệm vụ; nhiều linh hoạt hơn với các module tham số). Cuối cùng, lưu ý thay thế always
(có thể được sử dụng cho bất cứ điều gì; logic tổ hợp, chốt và dép xỏ ngón) với always_ff
yêu cầu nội dung tổng hợp thành flip-flop. Ngoài ra còn có một always_comb
loại bỏ danh sách độ nhạy, vì nó chỉ tìm ra độ nhạy từ đầu vào đến khối.
Phần mềm thiết kế của Altera được gọi là Quartus II và bạn sẽ tìm kiếm Phiên bản Web . (Các phiên bản đăng ký khá đắt và chỉ cần cho các mô hình FPGA nhanh nhất hoặc gần đây nhất.)
Điều đáng buồn là tôi đã không tìm thấy một cuốn sách hay về chủ đề này. Những gì tôi đã học được tôi có được bằng cách ghép các thứ lại với nhau từ nhiều nguồn, chẳng hạn như các cuốn sách Verilog không làm tốt công việc cho bạn biết cái gì có thể tổng hợp và cái gì không, và mã ví dụ. Quartus II có lệnh "insert template" chèn mã mẫu cho một số cấu trúc phổ biến, từ D flip-flop đến các máy trạng thái.
Phần cứng demo
Khi bạn đã triển khai bộ xử lý của mình trong Verilog, bạn cần xây dựng nó. Hiện tại, hãy để Quartus chọn chip (bạn phải chọn gia đình; tôi muốn giới thiệu Cyclone IV) và sơ đồ chân. Một khi nó sinh học, bạn sẽ biết bạn cần bao nhiêu chip. Nó sẽ cho bạn biết có bao nhiêu phần tử logic, flip flop, bit RAM, v.v. bạn đã sử dụng. Hãy chắc chắn rằng bạn không quá 50% cho bất kỳ ai trong số đó; nếu là bạn, hãy nhìn vào con chip mà trình biên dịch đã chọn và chọn thủ công con chip lớn hơn (về phần tử logic) tiếp theo có ít nhất nhiều chân và lặp lại cho đến khi bạn sử dụng dưới 50%.
Sau đó, đi mua sắm cho một bảng demo có chip ít nhất là lớn như cái cuối cùng bạn đã xây dựng. Kiểm tra xem nó có các thiết bị ngoại vi và / hoặc I / O mà bạn cần. Không có gì lạ khi xây dựng một thẻ con gái cắm vào một đầu nối mở rộng để cung cấp bất kỳ phần cứng bị thiếu nào.
Bây giờ bạn đã chọn phần cứng của mình, hãy tìm ra sơ đồ chân thực và sử dụng Công cụ lập kế hoạch để đặt tín hiệu đúng vào các chân phải. Bảng demo sẽ có hướng dẫn người dùng cho bạn biết chân nào được nối với thiết bị hoặc chân kết nối nào trên bảng demo.
Khi bạn đã thiết lập sơ đồ chân, hãy xây dựng lại để nó sử dụng các chân bạn muốn. Hãy nhớ rằng một số tín hiệu như đồng hồ hệ thống sẽ cần các chân đầu vào chuyên dụng (để chúng định tuyến thẳng đến các PLL bên trong).
Sử dụng lập trình viên để tải thiết kế của bạn trực tiếp vào FPGA (thanh ghi thay đổi mà tôi đã đề cập một lúc trước). Bây giờ bạn đang trong chu trình gỡ lỗi chỉnh sửa-biên dịch chạy quen thuộc. Đánh cho đến khi nó hoạt động.
Khi nó hoạt động, bạn có thể sử dụng lập trình viên để tải mã vào thiết bị cấu hình trên bo mạch để chương trình của bạn sẽ tải và chạy khi bật nguồn.
Điều này là khá dài, và tôi hy vọng nó đã giúp một số. Có rất nhiều điều để học hỏi; nó không giống như học một ngôn ngữ lập trình mới cũng giống như học một mô hình lập trình mới, ví dụ như chuyển từ ngôn ngữ thủ tục sang ngôn ngữ chức năng. Verilog là một ngôn ngữ đồng thời; hầu hết các mã luôn luôn thực thi.
Chúc may mắn!