Tôi đang bắt đầu với mã hóa VHDL và tôi đã thực hiện một số xử lý hình ảnh cơ bản trên bảng phát triển của mình.
Tôi đã nhận thấy rằng hầu hết các bảng phát triển FPGA thường sử dụng DRAM (SDRAM, DDRAM) làm RAM. Ví dụ: tôi đang sử dụng bảng dev của TERASIC và nó sử dụng DRAM. Mặc dù bộ nhớ DRAM dường như rẻ hơn SRAM (RAM tĩnh), nhưng theo quan điểm của tôi, nó không được tối ưu hóa để xử lý hình ảnh, hãy để tôi giải thích: Dữ liệu DRAM được truy cập theo khối, dữ liệu SRAM có thể được truy cập (địa chỉ) theo byte (byte) hoặc từng chữ, hoặc 36 bit mỗi lần, bất cứ điều gì). Tính năng này phù hợp hơn với xử lý hình ảnh, ví dụ: bộ lọc trung bình đơn giản trong đó pixel là giá trị trung bình của hàng xóm, nói
Pix(x,y) = (Pix(x-1,y-1) + Pix(x,y-1) + Pix(x+1,y-1) + Pix(x-1,y) + Pix(x,y)
+ Pix(x+1,y) + Pix(x-1,y+1) + Pix(x,y+1) + Pix(x+1,y+1))/9
rất khó thực hiện với DRAM, bạn cần có bộ đệm bên trong ít nhất hai dòng để ghi nhớ các dòng y-1
và y
(thực hiện xử lý trên y+1
dòng). Ngoài ra, có vẻ như phải mất một khoảng thời gian rất lớn để Quartus thực hiện quá trình xử lý đơn giản này (Tôi đang sử dụng 2ports FIFO).
Nếu bảng đã sử dụng SRAM như IS61LPS25632A từ ISSI chẳng hạn, việc xử lý sẽ đơn giản vì địa chỉ của pixel có thể là ví dụ
ByteAdress <= x + (LINEWIDTH*y);
Từ quan điểm phần cứng, với 9 chu kỳ bộ nhớ đọc / ghi, quá trình được thực hiện cho một pix và với một số thủ thuật xử lý song song, tôi có thể cải thiện điều này. Vậy thì, sự hiểu biết của tôi có đúng không? Nếu không, lỗi ở đâu?
BIÊN TẬP:
Sử dụng RAM RAM bên trong không phải là một lựa chọn đối với tôi vì không có đủ bộ nhớ trong thiết bị FPGA mà tôi sử dụng (Cyclone III) và tôi không biết việc trả tiền cho một bộ công cụ phát triển đắt tiền hơn chỉ để có thêm RAM bên trong FPGA là hợp lý .
Câu hỏi của tôi liên quan nhiều hơn đến hiệu quả mã. Nói ví dụ rằng một người có 8 MB SRAM. Theo quan điểm của tôi, mã được tạo ra với loại RAM này sẽ hiệu quả hơn (tốc độ và bộ đệm) trong trường hợp xử lý 2D (như xử lý hình ảnh) vì truy cập ngẫu nhiên thực sự rất phù hợp để truy cập dữ liệu có độ lệch (lớn) giữa sau đó, như trên tuyên bố này:
ByteAdress <= x + (LINEWIDTH*y);
Sắp xếp lại thông tin là tốn thời gian. Tôi sử dụng máy ảnh xuất ra các pixel dữ liệu theo tuần tự, từng dòng một. Tôi chỉ có thể lưu trữ những dữ liệu này trên hai cổng thành phần RAM FIFO được xây dựng với DRAM. Tôi thậm chí không thể thực hiện một chuyển vị đơn giản trước khi lưu trữ dữ liệu với điều này. Đáng ngạc nhiên là tôi đã không tìm thấy bất kỳ mã nào trên web liên quan đến vấn đề 2D này.