L ời cảm ơn
3.2. Xây dựng hệ thống thu thập, lưu trữ, xử lý và hiển thị ảnh
3.2.1.Thành phần thu thập ảnh Framegrabber
Nhiệm vụ: nhiệm vụ cơ bản của khối Framegrabber là đồng bộ với chip
Video Decoder để đọc các pixel và ghi vào FIFO.
Phân tích cách thực thi
Framegrabber dùng một Finite State Machine để giải mã và chốt thành phần luminance (chỉ lấy các thành phần độ xám grayscale) từ pixel stream của ITU-R BT.656 4:2:2 ( định dạng xuất ra mặc định của video decoder).
Pixel stream được định dạng như sau:
Hình 3.3: Pixel stream waveform
Đầu tiên là các byte đánh dấu bắt đầu một frame (FF-00-00), tiếp theo là
byte đồng bộ(embedded sync byte) ES. Theo sau là 1440 byte gồm: 720 giá trị
Sơ đồcấu trúc của State machine như hình vẽ dưới đây:
Hình 3.4 : Framegrabber state machine
Từhình vẽta thấy 3 trạng thái đầu: wait_for_embedded_sync,
wait_embedded_sync_1, wait_embedded_sync_2 dùng đểkiểm tra 3 byte
đánh dấu đầu tiên (FF-00-00).
Tại trạng thái check_embedded_sync kiểm tra các tín hiệu đồng bộgồm có
field id, field change và ghi byte đồng bộ vào FIFO để phục vụcho việc ghi dữliệu vào FIFO và hiển thịVGA. Nếu có tín hiệu image_processing_start để
khởi động khối này thì tiếp tục chuyển sang các trạng thái tiếp theo đểnhận dữliệu và ghi vào FIFO, còn không thì quay lại trạng thái ban đầu đểkiểm
tra các byte đánh dấu của frame mới.
Sau khi đã đồng bộxong thì liên tục thực hiện các trạng thái
Dữliệu ghi vào FIFO bao gồm 16 bit có 2 bit đầu tiên là các bit đồng bộ: field_id và field_change, theo sau là các bit 0 và byte luminance:
Pixel_in <= field_change & field_id & “000000” & luminance(7 downto 0)
3.2.2. Lưu dữliệu từFramegrabber vào SDRAM
Khối lưu dữ liệu này thực hiện rất đơn giản với State machine với 2 trạng thái:
Wait for pixel: chờ khi nào có pixel từ bộ đệm ghi Write Buffer, khi đó
chuyển sang trạng thái ghi pixel.
Store pixel: Ghi pixel vào SDRAM qua SDRAM Controller
3.2.3. Các cơ chế ghi đọc SDRAM: SDRAM Controller, Dual Port SDRAMSDRAM Controller SDRAM Controller
Đặc điểm: XSA Board synchronous DRAM (SDRAM) controller core chấp nhận các yêu cầu đọc và ghi đơn giản từ phía host-side và tạo ra các dạng sóng (timed waveform) cần thiết để thực hiện các hoạt động read, write với SDRAM. Với chế độ đọc, ghi kiểu pipeline thì với một hàng của SDRAM có thể không cần phải chốt sau mỗi chu kì đọc, vì thế tốc độ đọc và ghi có thể
gấp 10 lần so với cách đọc không pipeline từng pixel trong SDRAM ở các địa chỉ không liền nhau. Bộ điều khiển cũng đảm nhiệm thực hiện refresh SDRAMđể giữ cho các dữ liệu không bịsai, và sẽ đặt SDRAM vào chế độ tự làm tươi (self-refresh) nên dư liệu vẫn được giữ lại thậm chí khi bộ điều khiển không hoạt động.
Trong đồ án này, chúng em dùng read, write với chế độ pipeline.
Hình 3.5 : Pipelined Read Operation timing waveforms Pipeline Read Operation
Trên đây là dạng sóng cho hoạt động đọc kiểu pipeline. Hoạt động đọc ở
chế độ pipeline được thực hiện bằng cách giữ cho tín hiệu rd lên cao trong ghi liên tục cung cấp địa chỉ cần đọc mỗi khi mà tín hiệu earlyOpBegun hoặc
opBegun lên cao báo hiệu hoạt động đọc trước đã bắt đầu. Ví dụ trên mô tả 3 hoạt động đọc truy nhập các vùng nhớ SDRAM tại bank và hàng của
SDRAM đang được active. Nếu việc đọc thực hiện ở bank hoặc hàng khác của SDRAM thì SDRAM Controller sẽ hoàn thành quá trình đọc hiện tại và active bank và row mới trước khi tín hiệu earlyOpBegunvà opBegunlên cao.
Hình 3.6 : Pipelined Write Operation timing waveforms
Hoạt động ghi ở chế độ pipeline được thực hiện bằng cách giữ cho tín hiệu wrlên cao trong khi đó thì liên tục cung cấp địa chỉmới mỗi khi tín hiệu
earlyOpBegunhay opBegunlên cao báo hiệu rằng quá trình ghi trước đó đã bắt
đầu. Ví dụ trên đây thực hiện 3 hoạt động ghi vào bộ nhớ trong bank và row hiện tại của SDRAM. Nếu ghi vào địa chỉ ở bank hoặc row khác thì SDRAM Controller sẽ hoàn thành việc ghi hiện tại và sau đó kích hoạt bank và row mới trước khi tín hiệu earlyOpBegunvà opBegun lên cao.
Hình 3.7 : Ghép nối với SDRAM Controller Dualport Module for the SDRAM Controller
Chức năng: Dualport module đính vào phía các cổng bên host-side của bộ điều khiển XESS SDRAM Controller và chia thành hai phần host-side riêng biệt, mỗi phần có thể hoạt động như các cổng của host-side ban đầu do đó ứng dụng có thể gồm nhiều thành phần truy nhập SDRAM nhưng chỉdùng 1 bộ điều khiển SDRAM Controller. Bất kì ứng dụng nào thực hiện việc ghi đọc bộ nhớ SDRAM đều độc lập với hoạt động đó ở các post khác. Băng thông
tổng cộng của SDRAM có thể được phân phối giữa 2 port để cho khớp với data rate của các ứng dụng dùng dual port. Dualport module có thể xây dựng kiểu tầng đểxây dựng giao diện SDRAM với 3 hay nhiều cổng độc lập.
Hình 3.8 : Ghép nối dualport với SDRAM Controller
Hình 3.9 : Xây dựng 4 ports SDRAM interface
Phân phối băng thông SDRAM cho các port của một dualport được thực hiện qua tham sốPORT_TIME_SLOTS, là một vector 16 bit với mỗi bit tương
thể xảy ra. Thiết lập bit bằng 0 để cấu hình time slot cho port0, và thiết lập bằng 1 đểdành time slot cho port 1.Sau đây là một sốcách thiết lập:
PORT_TIME_SLOTS => “1111000011110000” áp dụng 8 time slot cho mỗi port, với mỗi port có 4 lần truy cập liền nhau vào SDRAM trước khi dual port chuyển điều khiển cho port kia. Vì thế, mõi port được phân phối một nửa băng thông của dual port.
Tham số PORT_TIME_SLOTS chỉ có tác động tới hoạt động của dualport module khi các ứng dụng trên cả2 port cùng cốgắng truy nhập vào SDRAM.
Ứng dụng ở một port sẽ truy nhập trực tiếp vào SDRAM nếu không có hoạt
động ghi và đọc đang tiến hành ở port kia. Vì thế PORT_TIME_SLOTS = “1111111111111111” sẽ cho phép port 0 truy nhập SDRAM chỉ khi port 1 không truy cập, nhưng không ngăn hoàn toàn port 0 trong việc truy cập SDRAM.
PORT_TIME_SLOTS = “1111111100000000” cấu hình một nửa băng thông
cho mỗi port tuy nhiên có thể block truy cập của một port lên tới 8 time slot trong khi port kia được ưu tiên hơn. Để giảm trễ chỉ cần gàn PORT_TIME_SLOTS = “0101010101010101” tuy nhiên sẽ lãng phí thời gian bởi vì SDRAM Controller phải xóa pipeline trước mỗi quá trình chuyển port. Vì thế, nhóm các bit liền nhau cùng một giá trịlà giải pháp tốt nhất.
3.2.4. Image Processing core
Image Processing core là thành phần quan trọng nhất của hệ thống xử lý
ảnh, trong đó thực thi tất cả các thuật toán từ cơ bản( lọc, dò biên, phân
ngưỡng...) đến nâng cao ( gán nhãn đối tượng, xác định các đặc trưng ). Hoạt
động của thành phần này được điều khiển bởi bộxửlý trung tâm.
Như đã thấy ở trên, mỗi pixel được thu thập, xử lý và lưu vào SDRAM có
dạng một word 16bit chứa thông tin như sau :
thịmức xám của pixel, sẽ được xử lý trong các thuật toán về sau. Còn lại 6 bit
cao sau field_change chưa được sử dụng đến, sẽ được dùng đểgán nhãn đối
tượng.
Việc thiết kế Image Processing Core chủ yếu sử dụng công cụ System Generator. Với công cụ này, người thiết kế có thể sử dụng các core có sẵn đã
được cung cấp bởi Xilinx, giảm thiểu công sức và thời gian thiết kế, đồng thời vẫn có thể tự tạo ra các block riêng cho mình sử dụng công cụ Black Box, và
đặc biệt, việc gỡ rối và mô phỏng hệ thống có thể thực hiện hoàn toàn trên Matlab, vốn đã rất quen thuộc với sinh viên Điều khiển tự động.
Hình 3.10: Sơ đồkhối xửlý ảnh.
Khối xử lý ảnh giao tiếp với SDRAM thông qua 2 FIFO là read_fifo và store_fifo.
read_fifo có nhiệm vụ đọc tuần tự dữ liệu từ SDRAM vào để khối xử lý
ảnh lưu vào buffer và xử lý. Việc đọc bắt đầu khi tín hiệu báo read_fifo không còn trống (read_fifo_empty='0' hay read_fifo_avail='1') và dừng khi
store_fifo có nhiệm vụlấy dữliệu đã xử lý từkhối xử lý ảnh và lưu tuần tự trở lại vào SDRAM tại vị trí xác định. Cũng như read_fifo, việc ghi của
store_fifo điều khiển quá trình xử lý, khi store_fifo đầy thì tạm dừng việc xử
lý.
Cấu trúc của Image Processing Core gồm 2 thành phần :
fifo_to_buffer : thực thi việc giao tiếp với read_fifo và lưu dữ liệu vào một bộ đệm. Thực chất bộ đệm dữ liệu là một Block Ram trong FPGA, có khả năng lưu đến 27 dòng của frame. Việc lưu dữ liệu được điều khiển sao cho
tránh xung đột với thành phần xửlý.
Hình 3.11 : Khối ghi dữliệu từread_fifo vào Buffer
processing_algorithms : lựa chọn, thực thi tất cảcác thuật toán xửlý ảnh, từ lọc, dò biên, các thuật toán xử lý đồng cấu,... cho đến phân ngưỡng, phân vùng và gán nhãn đối tượng. Đồng thời thành phần này còn thực hiện giao tiếp giữa Image Processing Core trong việc giao tiếp với store_fifo để đưa dữ
Hình 3.12 : Khối thuật toán xửlý ảnh
Khối xửlý này đọc dữ liệu từ bộ đệm theo cùng một phương pháp trong
tất cảcác thuật toán xử lý. Điều này có thểgây kéo dài thời gian xử lý đối với một sốít thuật toán, nhưng lại giúp tiết kiệm rất nhiều tài nguyên và công sức thiết kếcũng như giảm thiểu khả năng gây lỗi hoặc nhầm lẫn trong quá trình thiết kế.
Việc ghi và đọc dữliệu ởbộ đệm buffer như sau:
Ban đầu ta đọc tuần tự dữ liệu vào buffer cho đến khi đầy 10 dòng, ta lại
quay ngược trở lại vị trí ban đầu và tiếp tục đọc. Đồng thời, cửa sổ ghi ra để
xử lý được dịch tuần tự cho đến hết 10 dòng , rồi cũng quay ngược trở lại dòng đầu tiên. Việc ghi và đọc được điều khiển sao cho không xảy ra sự xung
đột : chỉ ghi vào những dòng đã xử lý và chỉ đọc khi đã ghi đủ số dòng cần thiết đểxửlý.
Việc đọc và ghi như trên cho phép sử dụng một cách hiệu quả số block ram hữu hạn của FPGA, tránh hoàn toàn khả năng xung đột đọc/ghi, đồng thời loại giúp cho việc đọc và ghi trở nên tương đối độc lập với nhau, giảm thiểu sai sót trong quá trình xử lý.
Các khối xửlý cơ bản
Khối đọc dữ liệu : các cửa sổ được đọc ra từ bộ đệm, để đưa vào một thanh ghi dịch 9 word. Việc đọc được thực hiện tuần tự từ trên xuống theo từng cột từtrái sang, dữ liệu đọc ra được dịch dần vào thanh ghi dịch.
Hình 3.13 : Khối đọc dữliệu từbuffer
Khi chuyển sang cửa sổkế tiếp, do 2 cửa sổ kề nhau có chung 6 word nên
để tiết kiệm thời gian, ta sẽ không đọc lại từ đầu 6 word cũ mà sử dụng lại chúng với sự trợ giúp của thanh ghi dịch. Do đó ta sẽchỉviệc đọc tiếp 3 pixel
ởcột tiếp theo. Tín hiệu full_win báo hiệu một cửa sổvừa được đọc xong, cần
đưa vào quá trình xửlý.
Thanh ghi dịch Pixel register : Thanh ghi này có nhiệm vụ ghi dần các
pixel đọc từ buffer do khối đọc dữ liệu điều khiển. Các pixel được dịch dần trong quá trình xử lý, do đó, cứ mỗi 3 chu kì xử lý, trong thanh ghi lại lưu
Có thểthấy, với thanh ghi dịch này, ta có thể tận dụng tối đa khả năng xử
lý song song của FPGA cho các thuật toán xửlý ảnh số.
Khối xử lý : Khối xử lý bao gồm nhiều thuật toán xử lý khác nhau. Tuy nhiên, cấu trúc của các thuật toán là tương đối giống nhau và ta có thể tận dụng một cơ chế đọc duy nhất đểdùng chung cho tất cảcác thuật toán.
Cấu trúc bộ lọc tuyến tính, dò biên : Bộ lọc tuyến tính và dò biên theo
phương pháp Laplacien cùng sử dụng phép nhân chập với 2 mặt nạ khác
nhau. Do đó ta có thể ghép chung lại thành một khối. Phép nhân chập có thể được thực hiện rất nhanh chóng sử dụng cấu trúc song song. Dưới đây là cấu trúc bộnhân chập trong các bộxửlý này :
Hình 3.15 : Cấu trúc nhân chập
Bộxử lý đồng cấu ảnh nhịphân : Khối này chủyếu tính ra giá trịmax,min của các pixel trong cửa sổ, do đó sử dụng các block so sánh. Cấu trúc như
Hình 3.16 : Cấu trúc bộxửlý đồng cấu ảnh nhịphân.
Khối tính ngưỡng và phân ngưỡng : Ngưỡng được tính theo phương pháp
trung bình. Tổng mức xám của các pixel sẽ được cộng dần vào một thanh ghi và thực hiện phép chia bằng cách dịch bit. Kết hợp nhiều khối dịch bit với nhau cho phép ta thực hiện phép chia với sai số của ngưỡng nhỏ hơn 3 và
thuật toán chỉcần thực hiện trong 1 chu kì xung.
Khối đếm đối tượng: Khối đếm đối tượng cũng tận dụng khả năng xử lý song song của FPGA để thực hiện đếm đối tượng. Với khối này, việc gán nhãn cho mỗi pixel dựa trên nhãn của các pixel lân cận chỉ cần thực hiện trong 1 chu kì đồng hồ.
Hình 3.17 : Khối gán nhãn đối tượng
Đầu vào khối gán nhãn đối tượng là 9 pixel của cửa sổhiện tại, với pixel 5 là trung tâm, cần được xem xét để gán nhãn. Việc gán nhãn cho pixel trung tâm thực hiện như thuật toán đã trình bày ởphần 1.
3.2.5.Hiển thị ảnh lên VGA: VGA GeneratorVGA Color Signals VGA Color Signals
Có 3 tín hiệu color là: red, green và blue gửi tín hiệu màu sắc (color information) đến màn hình VGA. Mỗi một tín hiệu điều khiển một súng bắn
điện tử (electron gun) để phóng các hạt electron vẽ lên một màu cơ bản tại một điểm trên màn hình. Dải của tín hiệu nằm từ từ 0 V (tương ứng với màu tối hoàn toàn) và 0.7V (sáng hoàn toàn) điều khiển cường độ của mỗi thành phần màu và 3 thành phần màu kết hợp với nhau tạo lên màu của điểm ảnh (dot) hay phần tử ảnh (pixel) trên màn hình.
Mỗi tín hiệu màu analog có thể là một trong 8 mức bằng 3 tín hiệu digital bằng cách dùng bộ chuyển đổi digital to analog 3 bit (DAC 3 bit). Do đó, 8
mức trên mỗi tín hiệu analog kết hợp với nhau tạo nên phần tử ảnh (pixel) với 8 x 8 x 8 = 512 màu khác nhau. Tuy nhiên trong đồ án này, chúng em chỉ dùng camera đen trắng nên hiển thịtrên màn hình chỉ được 8 màu khác nhau hay 8 mức thôi.
Hình 3.20 : 8 màu cơ bản VGA Signal Timing
Mỗi một ảnh (hay frame) trên màn hình hiển thị là kết hợp của h dòng, mỗi dòng có w pixel. Kích thước của mỗi frame được biểu diễn w x h dưới các dạng tiêu biểu gồm 640 x 480m 800 x 600, 1024 x 768 và 1280 x 1024.
Để vẽ một frame, có những mạch điện có trách nhiệm di chuyển dòng electron từ trái sang phải và từ trên xuống dưới dọc theo màn hình gọi là deflection circuit. Những mạch này yêu cầu phải có 2 tín hiệu động bộ để
khởi động và dừng dòng electron tại đúng thời điểm để cho một dòng các
điểm ảnh được vẽ dọc theo màn hình và mỗi dòng được điền theo cơ chế từ
trên xuống dưới đểtạo lên một ảnh.
Sau đây là ví dụVGA Display Timing với chế độ640 x 480:
Hình 3.22 : 640 x 480 Mode VGA Control Timing Nguyên tắc hoạt động của VGA Generator
Sơ đồ cấu trúc của bộ hiển thị hình ảnh lên VGA như trên hình vẽ dưới. Hệ thống bên ngoài ghi giá trị pixel vào trong bộ đệm pixel (pixel buffer)
(trong trường hợp này là FIFO 256 x 16). Các pixel được lấy từbộ đệm rồi ghi vào trong thanh ghi pixel (pixel register). Mỗi pixel cso thểlà 1, 2, 4, 8 hoặc 16 bit vì thếnên nội dung của thanh ghi pixel này được dịch sau mỗi xung clock
để thay thế pixel hiện tại theo thứ tự các bít có trọng số thấp đến cao. Các bit
này được gửi đến colormap circuit để chuyển các pixel này sang các giá trị