Xây dựng hệ thống thu thập, lưu trữ, xử lý và hiển thị ảnh

Một phần của tài liệu 212861 (Trang 53)

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

Nhim 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 thc 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 earlyOpBegunopBegunlê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 earlyOpBegunopBegun 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

ở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, greenblue 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. (adsbygoogle = window.adsbygoogle || []).push({});

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ị

Một phần của tài liệu 212861 (Trang 53)