thiết kế hệ thống xử lý ảnh video trên FPGA (cyclone II)
Trang 1GIỚI THIỆU ĐỀ TÀI
Đề tài này trình bày về thiết kế hệ thống xử lý ảnh Video trên FPGA (Cyclone II) bao gồm các thành phần: Thu nhận và số hóa tín hiệu Video Analog, xử lý ảnh Video số, hiển thị lên VGA
Trong đề tài này ngoài Cyclone II các thành phần tích hợp trên Kit DE2 mà ta
sẽ sử dụng là: Chip mã hóa tín hiệu Video Analog ADV7181B, SDRAM IS42S16400
để lưu trữ và xuất frame ảnh hợp lý, cổng VGA (chip ADV7123) để hiển thị ảnh lên màn hình
Trang 21 GIỚI THIỆU VỀ NGÔN NGỮ VHDL VÀ FPGA
1.1 NGÔN NGỮ VHDL
VHDL là một ngôn ngữ mô tả phần cứng (hardware description language), mô
tả hành vi của mạch điện hoặc hệ thống, từ đó mạch điện vật lý hoặc hệ thống có thể được thực thi
VHDL là viết tắt của VHSIC Hardware Description Language Bản thân VHSIC là viết tắt của Very High Speed Integrated Circuits (mạch tích hợp tốc độ cao), lần đầu tiên được sáng lập bởi United State Department of Defense trong những năm 80, sau đó tạo ra VHDL Phiên bản đầu tiên là VHDL 87, lần nâng cấp sau đó có tên là HDL 93 VHDL là ngôn ngữ mô tả phần cứng nguyên gốc đầu tiên được chuẩn hóa bởi Institue of Electrical and Electronics Engineers (IEEE), tới chuẩn IEEE 1076 Trong IEEE 1164, có một chuẩn được thêm vào là giới thiệu hệ thống logic đa giá trị (multi-valued logic system)
Động cơ thúc đẩy cơ bản khi dùng VHDL (hay dùng Verilog) là VHDL là một ngôn ngữ độc lập chuẩn của các nhà công nghệ, các nhà phân phối do đó chúng có khả năng portable và kế thừa cao (reusable) Hai ứng dụng trực tiếp chính của VHDL
là trong mảng các thiết bị logic lập trình được (Programmable Logic Devices) (bao gồm CPLDs – Complex Programmable Logic Devices và FPGAs – Field Programmable Gate Arrays) Mỗi khi mã nguồn VHDL được viết, chúng có thể được dùng để thực thi mạch điện trong các thiết bị lập trình được (từ Altera, Xilinx, Almel, ) hoặc có thể gửi đến các xưởng chế tạo các chíp ASIC Hiện này, rất nhiều các chip thương mại phức tạp (ví dụ như các microcontrollers ) được thiết kế dựa trên cách tiếp cận này
Một điều chú ý về VHDL là trái ngược với các chương trình máy tính thông thường được thực hiện tuần tự thì các câu lệnh được thực hiện song song (concurrent)
Vì lí do đó, nên VHDL thường được coi là một mã nguồn hơn là một chương trình Trong VHDL chỉ có các câu lệnh đặt trong PROCESS, FUNCTION, hay PROCEDURE được thực thi tuần tự
Một trong những tiện ích lớn của VHDL là cho phép tổng hợp mạch điện hoặc
hệ thống trong thiết bị khả lập trình (programmable devide) (PLD hoặc FPGA) hoặc trong một hệ ASIC
1.2 FPGA
Trang 3FPGA (Field Programable Gate Arrays) là một thiết bị bán dẫn bao gồm các khối logic lập trình được gọi là "Logic Block", và các kết nối khả trình Các khối logic có thể được lập trình để thực hiện các chức năng của các khối logic cơ bản như AND, XOR, hoặc các chức năng kết hợp phức tạp hơn như decoder hoặc các phép tính toán học Trong hầu hết các kiến trúc FPGA, các khối logic cũng bao gồm cả các phần tử nhớ Đó có thể là các Flip-Flop hoặc những bộ nhớ hoàn chỉnh hơn
Các kết nối khả trình cho phép các khối logic có thể nối với nhau theo thiết kế của người xây dựng hệ thống, giống như một bảng mạch khả trình
Một số kiến trúc FPGA hiện nay còn có thể cho phép cấu hình lại từng phần (partial re-configuration) Có nghĩa là cho phép một phần của thiết kế được cấu hình lại trong khi những thiết kế khác vẫn tiếp tục hoạt động
Một ưu điểm khác của FPGA, là người thiết kế có thể tích hợp vào đó các bộ
xử lý mềm (soft processor) hay vi xử lý tích hợp (embedded processor) Các vi xử lý này có thể được thiết kế như các khối logic thông thường, mà mã nguồn do các hãng cung cấp, thực thi các lệnh theo chương trình được nạp riêng biệt, và có các ngoại vi được thiết kế linh động ( khối giao tiếp UART, vào/ra đa chức năng GPIO, thernet ) Các vi xử lý này cũng có thể được lập trình lại (re-configurable computing) ngay trong khi đang chạy
FPGA được ứng dụng điển hình trong các lĩnh vực như: xử lý tín hiệu số, xử
lý ảnh, thị giác máy, nhận dạng giọng nói, mã hóa, mô phỏng (emulation) FPGA đặc biệt mạnh trong các lĩnh vực hoặc ứng dụng mà kiến trúc của nó yêu cầu một lượng rất lớn xử lý song song, đặc biết là mã hóa và giải mã FPGA cũng được sử dụng trong những ứng dụng cần thực thi các thuật toán như FFT, nhân chập (convolution), thay thế cho vi xử lý
Hiện nay công nghệ FPGA đang được sản xuất và hỗ trợ phần mềm bởi các hãng như: Xilinx, Altera, Actel, Atmel Trong đó Xilinx và Altera là 2 hãng hàng đầu Xilinx cung cấp phần mềm miễn phí trên nền Windows, Linux, trong khi Altera cung cấp những công cụ miễn phí trên nền Windows, Linux và Solaris
1.2.1 KIẾN TRÚC FPGA
Trang 4Hình 1.1: kiến trúc FPGA
Mỗi nhà sản xuất FPGA có riêng cấu trúc FPGA, nhưng nhìn chung cấu trúc được thể hiện giống như trong hình bên trên Cấu trúc FPGA bao gồm có configuration logic blocks (CLBs), configurable I/O blocks (IOB), và programmable interconnect Và tất nhiên, chúng có mạch clock để truyền tín hiệu clock tới các logic block, và thêm vào đó có các logic resources như ALUs, memory và có thể có cả decoders Các phần tử lập trình được của FPGA có 2 dạng cơ bản là các RAM tĩnh (Static RAM) và anti - fuses
Configurable I/O Blocks:
Configurable Logic Blocks (CLBs) bao gồm các Look-Up Tables (LUTs) rất linh động có chức năng thực thi các logic và các phần tử nhớ dùng như là các flip-flop hoặc các chốt (latch) CLB thực hiện phần lớn các chức năng logic như là lưu trữ dữ liệu,
Configurable I/O Blocks:
Input/Output Blocks (IOBs) điều khiển dòng dữ liệu giữa các chân vào ra I/O
và các logic bên trong của FPGA Nó bao gồm có các bộ đệm vào và ra với 3 trạng thái và điều khiển ngõ ra dạng open collector Phần lớn là có trở kéo lên ở ngõ ra và
Trang 5thỉnh thoảng lại có trở kéo xuống.IOBs hỗ trợ luồng dữ liệu 2 chiều (bidirectional data flow) và hoạt động logic 3 trạng thái (3 state) Hỗ trợ phần lớn các chuẩn tín hiệu, bao gồm một vài chuẩn tốc độ cao, như Double Data-Rate (DDR)
Programmable Interconnect:
Interconnect ở FPGA khác xa so với ở CPLD, tuy nhiên lại giống với của gate array ASIC Có một line dài được dùng để nối các CLBs quan trọng mà chúng lại ở cách xa nhau mà không gây ra quá nhiều trễ Chúng có thể được dùng như là các bus ở trong chip Có các line ngắn được dùng để liên kết các CLBs riêng rẽ nhưng đặt gần nhau
Và cũng thường có vài ma trận chuyển đổi (switch matrices), giống như trong CPLD, nối giữa các line dài và ngắn lại với nhau theo một số cách đặc biệt Các chuyển đổi lập trình được (Programmable switches) bên trong chip cho phép kết nối giữa CLBs tới các interconnect line và giữa interconnect line với các line khác và với switch matrix Các bộ đệm 3 trạng thái được dùng để kết nối phần lớn các CLBs với các line dài (long line), tạo nên các bus Các long line đặc biệt, gọi là các line clock toàn cục (global clock lines), được thiết kế đặc biệt cho trở kháng thấp và nhờ đó mà thời gian lan truyền nhanh hơn Chúng được kết nối với các bộ đệm clock và với mỗi phần tử được clock trong mỗi CLB Đó là cách mà clock có thể phân phối bên trong FPGA
Mạch đồng hồ (Clock Circuitry):
Các khối vào ra với bộ đệm clock high drive gọi là các clock driver, nằm rải rác xung quanh chip Các bộ đệm này được nối với các chân clock vào và lái các tín hiệu clock vào các đường clock toàn cục (global clock line) như mô tả ở bên trên Các đường clock được thiết kế sao cho thời gian thời gian lệch nhỏ nhất và thời gian lan truyền nhanh Thiết kế đồng bộ là yêu cầu bắt buộc với FPGA, từ khi độ lệch tuyệt đối và trễ không được bảo đảm Chỉ khi dùng các tín hiệu clock từ các bộ đệm clock thì thời gian trễ tương đối và thời gian lệch mới được đảm bảo
2 CHÍP MÃ HÓA TÍN HIỆU VIDEO ADV7181B
2.1 CHỨC NĂNG VÀ DẠNG DỮ LIỆU NGÕ RA
Nguồn ảnh cần xử lý là tín hiệu analog video do DVD plalyer xuất ra Kết nối ngõ ra TV-Out composite của DVD Player với cổng TV-In trên Kit DE2 thì bộ ADV7181B sẽ số hóa tín hiệu này sang chuẩn ITU - RTBT 656 là chuỗi các frame ảnh Mỗi điểm trong frame ảnh thu về được biểu diễn dưới dạng I(x,y) trong đó x,y là tọa độ của pixel trên frame và I là mức xám tương ứng của pixel đó Như vậy 1 frame
Trang 6ảnh thu được sẽ đươc biểu diễn dưới dạng một ma trận 2 chiều 720 x 525 với 720 là
số pixel trên 1 hàng, 525 là số hàng trong 1 frame
Chuẩn Video ITU – RBT601:
Chuẩn ITU – RBT 610/656 định nghĩa một thiết kế cho việc mã hóa một
khung bao gồm 525 (hoặc 625) line tín hiệu video tương tự thành dạng số, truyền tín
hiệu với xung clock 27MHz Một single horizontal line có cấu trúc:
EAV, BLANKING và SAV đều là các trường (field) phân biệt để đồng bộ dữ
liệu được truyền
EAV và SAV đều là các trường 4 byte:
EAV: cho biết điểm kết thúc của Active Video Data trong line hiện hành
cũng như là điểm bắt đầu của line tiếp theo
SAV: báo hiệu điểm bắt đầu của Active Video Data trong line hiện hành
FFh 00h 00h XY
Byte thứ tư XY chứa thông tin về trường được truyền, tình trạng của khoảng
trống (field blanking) theo chiều dọc (Vertical) hoặc của dòng trống (line blanking)
theo chiều ngang (horizontal):
Vertical Blanking Status Bit:
- Lên mức cao khi ở vertical field blanking interval
- Xuống mức thấp ở các trường hợp khác
4 H Horizontal Blanking Status bit:
- Nếu là trường SAV thì ở mức 0
Trang 7- Nếu là trường EAV thì ở mức 1
Các Protecction bit thì dùng để kiểm tra và sửa lỗi phụ thuộc vào các bít
F,V,H nhưng khi nhận Video Stream ta có thể bỏ qua các bit này nên ta không xét
đến
Ý nghĩa của các bit F và V là để đảm bảo sự đồng bộ các horizontal line trong
một frame theo chiều dọc:
TABLE 1 Field interval definitions
625 525 V-digital field blanking
Line 1 Line 4 Line 313 Line 266
Cách đặt giá trị các bit F,V theo trường (Field 1 hoặc 2) và tính hiệu dụng
(Active or Blanking) sẽ được hiểu rõ hơn qua bảng mô tả một frame gồm 525
horizontal line sau :
Trang 8Field 1 (F=0) : 262 line từ line 4 đến line 265; Field 2(F=1) : 263 line từ line
266 đến line 3
Active or Blanking : các Active video data và các Vertical Blanking Interval
được sắp xếp xen kẽ nhau :
Active portion (V=0) Odd Field : 244 line từ 20->263; Even Field: 243 line từ
283->525;
Vertical Blanking Interval (V=1): 38 line gồm 19 line từ 1->19 và 19 line từ
266->282;
Hình 2.1: Frame ảnh theo chuẩn ITU656
Một horizontal line tín hiệu sẽ gồm các thành phần sau:
Blanking: trong suốt thời gian truyền tín hiệu Video, ở giữa các Active video
signal Segments sẽ là các horizontal blanking interval Giá trị của các byte trong
Trang 9trường này sẽ phải phù hợp với các cấp độ (level) của các tín hiệu Cb, Cr và Y tương ứng theo quy tắc sau: Cb = 80h; Y = 10h; Cr = 80h ta có chuỗi byte : 80h, 10h, 80h,…80h,10h
Tùy vào số line tín hiệu mà chuỗi này sẽ bao gồm 268 byte (khung 525 line) hoặc là 280 byte (khung 625 line)
Active Video Data: Có tất cả 1440 byte chứa đựng các thông tin về ảnh: 720
giá trị Y (luminace-brightness); 360 giá trị Cr (red chrominace); 360 giá trị Cb (blue chromiance) được sắp xếp theo từng nhóm cứ một Cb và Cr thì có 2 giá trị Y: CbYnCrYn+1 tạo thành chuỗi:
… … …
Các trường SAV và EAV: mỗi trường dài 4 byte
Vậy trong hệ thống 525 line thì một Horizontal line sẽ bao gồm 1716 byte
2.2 GIAO THỨC CÀI ĐẶT I2C
ADV7181B hỗ trợ một giao diện kết nối 2 dây tuần tự “a-wire serial interface” I2C Hai ngõ vào : dữ liệu tuần tự SDA, xung clock tuần tự SCLK mang thông tin giữa ADV7181B với bộ điều khiển hệ thống I2C Mỗi thiết bị tới (Slave) sẽ được nhận ra bởi một địa chỉ duy nhất
Các chân I2C của ADV7181B cho phép người dùng cài đặt, cấu hình bộ mã hóa và đọc ngược lại dữ liệu VBI (vertical blank interval) bắt được ADV7181B có 4 địa chỉ Slave cho tất cả thao tác đọc và ghi phụ thuộc vào mức logic của chân ALSB ALSB điều khiển bit 1 của địa chỉ Slave (Slave_address[1] ) bởi việc thay đổi chân này có thể điều khiển được cả 2 bộ ADV7181B mà không có sự xung đột vì trùng địa chỉ Slave Bit thấp nhất của địa chỉ Slave( LSB hay là Slave_address[0] ) quyết định thao tác ghi hay đọc: mức 1 đọc và mức 0 thì ghi Ở đây ta chỉ sử dụng 1 bộ ADV7123, giao thức I2C chủ yếu dùng để nạp dữ liệu cho các thanh ghi nên chọn địa chỉ Slave cho chip mã hóa này là 0x40h từ bảng giá trị địa chỉ I2C Slave dưới đây:
Trang 10Để điều khiển thiết bị trên Bus thì phải có một giao thức đặc biệt đi kèm Đầu tiên Master sẽ khởi động truyền dữ liệu bằng việc thiết lập điều kiện bắt đầu (SDA
từ 1 xuống 0 trong khi SCLK vẫn ở mức cao) ở đây ta gọi là START, nó ám chỉ rằng theo sau đó là một luồng địa chỉ hay dữ liệu Các ngoại vi đáp trả lại START và dịch chuyển 8 bit tiếp theo (7 bit địa chỉ và 1 bit đọc/ghi), các bit này được truyền từ bit cao (MSB) đến thấp (LSB) Các ngoại vi khi đã nhận ra các địa chỉ được truyền thì đáp ứng bằng cách giữ SDA = 0 trong toàn bộ chu kỳ thứ 9 của xung clock gọi là ACK Các thiết bị khác thì sẽ rút khỏi bus tại điểm này và bảo toàn trạng thái IDE (khi cả SDA và SCLK đều ở mức cao để cho các thiệt bị theo dõi 2 line này, chờ START và địa chỉ được truyền đúng) Bit đọc/ghi chỉ ra hướng của dữ liệu, LSB = 0/1 thì master ghi/đọc thông tin vào/từ ngoại vi
ADV7181B hoạt động như thiết bị Slave tiêu chuẩn trên Bus, chứa 196 địa chỉ con (Subaddress là độ lệch của địa chỉ cần thao tác với địa chỉ thiết bị) để cho phép truy cập các thanh ghi nội Điều đó giải thích rằng byte đầu tiên là địa chỉ của thiết bị
và byte thứ 2 là địa chỉ con đầu tiên Các địa chỉ con này tự động tăng dần cho phép truy đọc/ghi ở địa chỉ con bắt đầu Sự truyền dữ liệu thì luôn bị ngắt bởi điều kiện dừng (STOP) Người dùng có thể truy cập tới bất cứ duy nhất 1 thanh ghi ở địa chỉ con trên cơ sở 1-1 khi không có sự cập nhật toàn bộ các thanh ghi Ở đề tài này ta không sử dụng chế độ cập nhật toàn bộ mà chỉ truy cập vào các thanh ghi cần thiết ở các địa chỉ con trên cơ sở 1-1
START và STOP có thể xuất hiện ở bất kì đâu trong sự truyền dữ liệu, nếu các điều kiện này được khẳng định ở ngoài chuỗi liên tục với các thao tác đọc và ghi thông thường, thì nó tác động làm bus trở về trạng thái IDE Nếu địa chỉ người dùng phát ra không phù hợp (invalid) thì ADV7181B sẽ không gửi xác nhận ACK và trở về trạng thái IDE
Nếu các địa chỉ con tự động tăng dần rồi vượt quá giới hạn địa chỉ con cao nhất:
Nếu đang đọc thì những giá trị chứa đựng trong thanh ghi có địa chỉ con cao nhất sẽ được tiếp tục đọc cho đến khi Master phát 1 NACK (SDK không bị đưa xuống mức thấp trong toàn bộ chu ky thứ 9) để chỉ rằng việc đọc kết thúc
Nếu đang ghi thì những giá trị của byte không phù hợp sẽ không được load
Trang 11Hình 2.1: Truyền dữ liệu trên bus và chuỗi đọc và ghi tuần tự với giao thức I2C
Truy cập các thanh ghi : MPU có thể viết hoặc đọc các thanh ghi ngoại trừ các địa chỉ con, chúng chỉ được ghi, chúng chỉ ra các thanh ghi mà tác vụ đọc hay ghi tiếp theo truy cập đến Mọi sự giao tiếp với phần này thông qua Bus START với một
sự truy cập các thanh ghi này Các thao tác ghi hay đọc sẽ được thực hiện từ địa chỉ đích, rồi tăng lên địa chỉ tiếp theo đến khi một lệnh STOP trên Bus được thực thi
Lập trình các thanh ghi: cấu hình cho từng thanh ghi, thanh ghi giao tiếp gồm 8 bit chỉ được ghi Sau khi thanh ghi này được truy cập trên Bus và một thao tác đọc/ghi được lựa chọn, các địa chỉ con được cài đặt chỉ ra các thanh ghi mà tác vụ sẽ đặt tới
Chọn lựa thanh ghi: (SR đến SR0) những bit này được cài đặt để chỉ ra địa chỉ bắt đầu được yêu cầu
Chuỗi I2C : được sử dụng khi cần các thông số vượt quá 8 bit, vì vậy nó phải được phân phối trên ít nhất 2 thanh ghi của I2C:
Khi một thông số được thay đổi bởi 2 lần ghi thì nó có thể giữ giá trị không phù hợp (invalid) trong khoảng thời gian lần đầu và lần cuối I2C được hoàn thành, có nghĩa là các bit đầu của nó có thể mang giá trị mới trong khi các bit còn lại vẫn giữ giá tri cũ
Để tránh sai sót này chuỗi I2C sẽ giữ các bit giá trị cập nhật của các thông số trong bộ nhớ cục bộ, và các bit của chuỗi I2C được cập nhật với nhau một lần khi tác
vụ ghi vào thanh ghi cuối cùng hoàn thành
Tác vụ hợp lý trên chuỗi I2C sẽ dựa trên cơ sở sau: các thanh ghi dành cho chuỗi I2C sẽ được ghi theo thứ tự tăng dần địa chỉ các thanh ghi Ví dụ: HSB[10:0] thì ghi lên 0x34 trước rồi ngay lập tức ghi thêm vào 0x35
3 SDRAM IS42S16400
Trang 12SDRAM IS42S16400 có tất cả 67180864 bit SDRAM được tổ chức thành 4 dải (BANK) nhớ, mỗi dải có dung lượng 1024576 từ (Words) 16 bit với tốc độ truyền
DQM mặt nạ dữ liệu: Khi cao, những tín hiệu này khống chế dữ liệu
vào/ra Khi đi kèm với sự viết, dữ liệu không thật sự viết vào Khi dữ liệu được giữ ở mức trong hai chu kỳ trước một chu kỳ đọc, việc đọc không được đưa ra từ chip Trên
một chip nhớ x16 hay DIMM, với 1 từ 8 bit thì có một hàng DQM
/RAS Row Address Strobe là bit điều khiển cho qua địa chỉ hàng
/CAS Column Address Strobe bit điều khiển cho qua địa chỉ cột
/WE Write enable cho phép ghi
Các tín hiệu /RAS, /CAS, /WE dùng để lựa chọn 1 trong 8 lệnh Nói chung thì
dùng để phân biệt các lệnh đọc, ghi
SDRAM bên trong được chia thành trong 2 hay 4 dải (Bank) dữ liệu nội độc lập bên trong Một hoặc hai địa chỉ vào của dải (Bank) BA0 và BA1 sẽ lựa chọn Bank
mà lệnh tác động đến
Phần lớn các lệnh đều sử dụng địa chỉ được đưa vào ngõ vào địa chỉ Nhưng
có một số lệnh lại không sử dụng chúng, hay chỉ biểu diễn một địa chỉ cột, vì vậy ta
sử dụng A[10] để lựa chọn những phương án
Trang 13là đóng hàng lại
Active (kích hoạt):
mở một hàng với lệnh Read và Write
Precharge (nạp lại): Ngưng hoạt động hàng hiện hành của bank (dải) được chọn
L L H L X H X
Precharge all (nạp lại toàn bộ): Ngưng hoạt động hàng hiện hành của tất
cả các bank (dải)
L L L H X X X
Auto refresh (tự động làm tươi): làm tươi từng hàng của từng bank, sử dụng bộ đếm nội Tất cả các dải phải được nạp lại
Lode mode register (chế độ nạp các thanh ghi): A[9:0] được nạp để cấu hình chip DRAM
Trang 14Trong đó quan trọng nhất là ngầm định CAS (2 hoặc
3 chu kỳ) và chiều dài khối (1, 2, 4, hoặc 8 chu kỳ)
Sự tương tác các tín hiệu điều khiển SDRAM:
Không có lệnh nào luôn được cho phép:
Lệnh chế độ nạp các thanh ghi (load mode register command) yêu cầu tất cả các dải (Bank) ở trạng thái IDE, và phải trì hoãn về sau cho sự thay đổi để tác động
Lệnh tự động làm tươi (auto refresh command) thì yêu cầu tất cả các dải (Bank) ở trạng thái IDE, và mất 1 khoảng thời gian làm tươi để đưa Chip về trạng thái IDE: thường là trcd + trp
Chỉ có những lệnh khác thì cho phép trên một Bank IDE là các lệnh kích hoạt Cần phải mất trcd trước khi hàng được mở hoàn toàn và chấp nhận một lệnh đọc hay ghi
Khi một dải (Bank) được mở thì có 4 lệnh được cho phép: đọc, ghi, kết thúc truyền khối (Burst terminal), nạp lại (precharge) Lệnh đọc, ghi bắt đầu truyền khối và
có thể bị ngắt bởi những ngắt sau:
Ngắt một đọc khối dữ liệu:
Sau một lệnh đọc thì bất cứ lúc nào cũng có thể có một trong các lệnh: đọc, kết thúc truyền khối, hoặc là nạp được phát ra Và sẽ ngắt đọc khối này nếu có một ngầm định CAS được cấu hình Nếu có 1 lệnh đọc ở thời điểm 0, 1 lệnh đọc khác ở chu kỳ 2, ngầm định CAS ở chu kỳ 3 thì lệnh đọc đầu tiên sẽ truyền khối dữ liệu ra ngoài ở chu kỳ 3 và 4, và kết quả của lệnh đọc thứ 2 sẽ bắt đầu xuất hiện ở chu kỳ 5
Nếu lệnh ở chu kỳ 2 là kết thúc truyền khối hoặc là nạp lại Bank kích hoạt thì không có dữ liệu ra ở chu kỳ 5
Mặc dù việc ngắt lệnh đọc có thể xuất hiện ở một Bank bất kỳ , nhưng lệnh nạp lại chỉ ngắt việc đọc khối nếu nó tác động trên cùng một Bank hoặc tất cả các Bank, nếu lệnh này hướng đến một Bank khác thì việc đọc khối vẫn tiếp tục
Sự ngắt đọc tạo ra bởi một lệnh ghi thì cũng có thể nhưng sẽ khó khăn hơn Thực hiên điều này nhờ vào một tín hiệu DQM để khống chế ngõ ra của SDRAM, vì vậy trong khoảng thời gian này, chíp điều khiển bộ nhớ có thể lái dữ liệu đi qua chân
DQ để ghi vào SDRAM Vì tác động của DQM trên lệnh đọc thì bị trì hoãn 2 chu kỳ
Trang 15trong khi đối với lệnh đọc thì ngay lập tức, nên DQM phải lên mức cao (raised) sớm hơn 2 chu kỳ trước khi có lệnh ghi
Để thực hiện điều này trong 2 chu kỳ thì yêu cầu định vị thời điểm SDRAM tắt ngõ ra tại 1 cạnh lên xung Clock và thời điểm dữ liệu được cung cấp (cho lệnh ghi ) như ngõ vào của SDRAM ở cạnh tiếp theo của Clock
Một ngắt ghi khối dữ liệu:
Bất kỳ lệnh đọc, ghi, hay kết thúc truyền tới một Bank bất kỳ sẽ kết thúc (dừng) việc ghi khối ngay lập tức, dữ liệu trên chân DQ khi lệnh thứ 2 được phát thì chỉ do lệnh này sử dụng
Ngắt ghi khối với lệnh precharge (đến cung một Bank) thì khá phức tạp Đó là thời gian viết nhỏ nhất, twr phải được lướt qua giữa tác vụ ghi sau cùng tới 1 Bank (chu kỳ không bị che (unmasked) cuối cùng của ghi khối) với lệnh precharge kế tiếp,
vì vậy một ghi khối sẽ bị dừng (hủy) bởi lệnh tích nạp (pre-charge) nếu có đủ chu kỳ kéo dài được che đi (dùng DQM) để tạo twr cần thiết Một lệnh ghi với sự tích nạp tự động chứa đựng một trì hoãn tự động
Ngắt một lệnh tích nạp tự động:
Việc xử lý sự gián đoạn của thao tác đọc, ghi với chế độ tích nạp tự động là một đặc tính lựa chọn của SDRAM, và được hỗ trợ rất nhiều Nếu được sử dụng, sự tích nạp hay thời gian chờ twr theo sau bởi sự tích nạp (sau khi đọc) bắt đầu cùng một chu kỳ như một lệnh ngắt
Sắp xếp truyền khối SDRAM:
Một bộ vi xử lý hiện đại có bộ đệm nói chung sẽ truy nhập bộ nhớ trong những đơn vị của line bộ đệm Ví dụ để truyền 64 byte, line bộ đệm yêu cầu 8 sự truy cập liên tiếp tới một DIMM (dual in-line memory module: module nhớ có hai hàng chân) 64bit, mà toàn bộ có thể được kích khởi bởi một lệnh đơn đọc hay ghi tùy vào
sự cấu hình các chíp SDRAM
Sự truy cập line đệm điển hình được kích khởi bởi một sự đọc từ một địa chỉ đặc biệt, và SDRAM cho phép " từ có tính chất quyết định " của line đệm sẽ được truyền đầu tiên ("từ " ở đây có nghĩa là chiều rộng (của) chíp SDRAM hay DIMM,
64 bít với một DIMM tiêu biểu)
Chíp SDRAM hỗ trợ hai giao thức để sắp xếp các từ còn lại trong line đệm:
- Chế độ truyền khối đan xen: làm cho các tính toán của con người thêm phức tạp nhưng lại dễ dàng tổng hợp phần cứng hơn và được ưu tiên với các bộ vi xử
lý Intel Ta không sử dụng kiểu truyền này
Trang 16- Chế độ truyền khối tuần tự: những từ trễ hơn được truy cập trong việc tăng dần địa chỉ, khi kết thúc thì quay trở lại điểm bắt đầu khối Chẳng hạn, với một tuyền khối có chiều dài là 4, và địa chỉ cột được yêu cầu là 5, những từ sẽ truy cập theo thứ
tự 5-6-7-4 Nếu chiều dài truyền khối là 8, thứ tự truy cập là 5-6-7-0-1-2-3-4 Điều này được thực hiện bởi việc thêm một bộ đếm địa chỉ cột, và bỏ qua số nhớ khi đi hết khối
Ta có thể lựa chọn chiều dài khối và kiểu truy cập khối bằng cách sử dụng chế
độ thanh ghi được mô tả phần tiếp theo
Chế độ thanh ghi của SDRAM:
Tốc độ dữ liệu đơn SDRAM có một chế độ thanh ghi 10 bít đơn lập trình được Sau đó chuẩn SDRAM tốc độ dữ liệu kép SDRAM bổ sung thêm chế độ thanh ghi, định địa chỉ sử dụng những chân địa chỉ Bank Với SDR SDRAM, chân địa chỉ Bank và địa chỉ hàng A[10] và cao hơn thì được lờ đi, nhưng phải là 0 trong khi ở chế
độ ghi vào thanh ghi Trong chu kỳ của chế độ thanh ghi thì các giá trị nạp vào M[9:0] chính là các bit địa chỉ
- M[9] chế độ ghi từng khối, ở mức 0 thì ghi sử dụng chế độ và chiều dài truyền khối ở chế độ đọc, ở mức 1 thì tất cả các ghi không phải là truyền khối (định vị đơn)
- M[8:7] chế độ vận hành, muốn ở chế độ lưu trữ thì đặt giá trị 00
- M[6:4] ngầm định CAS chỉ với các giá trị hợp lệ là 010 (CL2) và 011 (CL3) Chỉ ra số chu kỳ giữa lệnh đọc và dữ liệu được gửi ra từ Chip Chip sẽ hoàn thành một giới hạn cơ bản trong nanô-giây dựa trên giá trị này; khi khởi tạo, bộ điều khiển bộ nhớ phải sử dụng kiến thức của nó về tần số xung Clock và dịch giới hạn kia thành những chu trình
- M[3] kiểu truy cập các từ trong khối : 0 thì truy cập tuần tự, 1 thì truy cập đan xen
- M[2:0]: chiều dài khối: giá trị 000, 001, 010 và 011 chỉ ra kích thước khối tương ứng là 1, 2, 4 hay 8 từ Mỗi đọc ( và viết, nếu m[9] là 0) sẽ thực hiện nhiều sự truy cập, trừ phi được gián đoạn bởi một sự dừng (hủy) truyền khối hay các lệnh khác Giá trị 111 đặc tả khối với đầy đủ hàng (full-row Burst hoặc còn gọi là full page Burst) Sự truyền khối với đầy đủ hàng chỉ được cho phép với kiểu tuần tự Đối với SDRAM IS42S16400 thì chiều dài của 1 khối ở chế độ full page Burst là 256 từ Sự truyền khối thì tiếp tục cho đến khi có ngắt
Làm tươi tự động:
Trang 17Dùng để làm tươi lại Chip ram nhờ vào sự mở và đóng ( kích hoạt và tích nạp ) từng hàng trong từng Bank Tuy nhiên, để đơn giản hóa chíp điều khiển bộ nhớ, Chip SDRAM hỗ trợ lệnh tự động làm tươi, tức là đồng thời thực hiện thao tác này tới một hàng trong từng Bank SDRAM cũng duy trì một bộ đếm nội được lặp lại trên toàn bộ các hàng có thể Chip điều khiển bộ nhớ thì đơn giản phải phát ra đủ số lượng các lệnh làm tươi tự động (1 lệnh đối với 1 hàng ) với mỗi khoảng làm tươi (một giá trị chung là tref = 64 ms) Tất cả các Bank phải ở trạng thái IDE khi lệnh được phát
Chế độ Lover Power:
Như đã đề cập, ngõ vào cho phép xung Clock (CKE) có thể được dùng để dừng xung Clock tới SDRAM Giá trị ngõ vào CKE được xét tại từng cạnh lên của xung Clock, và nếu ở mức thấp, thì mọi cạnh lên của xung Clock tiếp theo sẽ bị bỏ qua mọi mục đích khác so với việc kiểm tra CKE
Nếu CKE xuống thấp trong khi SDRAM đang thực hiện tác vụ, thì nó đơn giản chỉ là “đóng băng lại” tại chỗ cho đến khi CKE lên mức cao
Nếu SDRAM ở trạng thái IDE ( tất cả các Bank được tích nạp, không có lệnh nào đang hoạt động) khi CKE xuống thấp, SDRAM tự động chọn chế độ power-down (tiết kiệm năng lượng), giữ năng lượng ở cực tiểu cho tới khi có cạnh lên của CKE Khoảng này thì không được dài hơn giá trị tối đa khoảng làm tươi tref, nếu không những gì bộ nhớ chứa đựng sẽ bị mất Đây là phương pháp để dừng toàn bộ xung Clock trong khoảng thời gian này để tiết kiệm năng lượng
Cuối cùng, nếu CKE ở mức thấp vào lúc một lệnh làm tươi tự động được gửi đến SDRAM, SDRAM chọn chế độ tự làm tươi ( seft-refresh mode) Tương tự Power Down, nhưng SDRAM dùng một timer nội để phát ra các chu kỳ làm tươi nội khi cần thiết Trong thời gian này thì dừng xung Clock Chế độ tự làm tươi tiêu thụ ít năng lưọng hơn so với chế độ Power Down, nhưng vẫn cho phép bộ điều khiển bộ nhớ disable toàn bộ
4 CƠ CHẾ HIỂN THỊ ẢNH LÊN MONITOR
4.1 NGUYÊN TẮC CHUNG
Để hiện thị hình ảnh ra màn hình được tích hợp thì cần phải có một bộ VGA Grenerator với các tín hiệu và cơ chế làm việc như sau:
4.1.1 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ử
Trang 18(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ừ 0V (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
Hình 4.1: VGA Connection
Tùy vào độ rộng A bít của tín hiệu màu ngõ vào tín mà mỗi màu analog ở ngõ
ra là một trong 2A mức với bộ chuyển đổi digital to analog A bit, 3 tín hiệu analog kết hợp với nhau tạo nên phần tử ảnh (pixel) với 2A x 2A x 2A = 23A màu khác nhau
4.1.2 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 dạng tiêu biểu gồm 640 x 480m 800 x 600, 1024 x 768 và 1280 x 1024
Hình 4.2: CRT Display Timing Example
Trang 19Để 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
VGA Display Timing với chế độ 640 x 480:
Ts Sync pulse time 16.7 ms 416,800 521 32µs 800
TDISP Display time 15.36 ms 384,000 480 25.6µs 640
Hai mạch tạo xung đồng bộ (pulse generation circuit) được dùng để tạo các xung đồng bộ dọc (VSYNC) và ngang (HSYNC) Bộ hirizontal sync generator có đầu
ra là tín hiệu gate một chu kì trùng khớp với sường lên của xugn đồng bộ ngang (horizontal sync pulse), tín hiệu gate này nối với tín hiệu clock – enable của bộ vertical sync generator vì thế nên clock – enable chỉ cập nhật bộ đến thời gian sau mỗi dòng pixel (line of pixels) Tín hiệu gate của vertical sync generator được dùng như tín hiệu báo kết thúc một frame, đồng thời nó cũng reset và xóa toàn bộ nội dung của pixel buffer nên bộ VGA generator luôn khởi động từ trạng thái xóa sạch hoàn toàn với mọi frame
Bộ tạo tín hiệu đồng bộ cũng tạo ra các tín hiệu horizontal và vertical blanking Khi dùng phép toán OR logic ta được tín hiệu blanking toàn cục
4.2 BỘ VGA DAC ADV7123
Kit DE2 tích hợp một bộ VGA DAC và ADV7123 với cấu trúc
Trang 20 Hỗ trợ tín hiệu màu 10 bit ở ngõ vào, với bộ DAC 10 bit sẽ cho ra mức màu Analog ở ngõ ra, tuy nhiên trong thiết kế dữ liệu màu ta cung cấp cho ADV7181 chỉ là 8 bit nên tín hiều màu ở Analog ngõ ra có mức 3, tín hiệu analog kết hợp lại với nhau tạo nên phần tử ảnh (16 triệu) màu, 1028224
Các tín hiệu đồng bộ là SYNC và BLANK: giá trị của SYNC thì không ảnh hưởng đến quá trình hiển thị, BLANK với giá trị 0 thì chốt các dữ liệu màu ở ngõ vào
Hình 4.3: Sơ đồ cấu trúc ADV7123
Các chân của ở ngõ ra được nối tương ứng với các chân của cổng VGA trên KIT DE2, vì vậy để sử dụng được bộ VGA DAC này ta phải tạo ra một khối vừa cung cấp các tín hiệu BLANK, Red, Green, Blue cho ADV7123 vừa phải tạo ra 2 tín hiệu đồng bộ VSYN và HSTNC nối trực tiếp vào cổng VGA một cách đồng thời
5 SƠ LƯỢC HỆ THỐNG
5.1 SƠ ĐỒ THIẾT KẾ
Trang 21Hình 5.1: Sơ đồ hệ thống
5.2 NGUYÊN LÝ HOẠT ĐỘNG
Khối I2C_Video_Config: với giao thức giao tiếp I2C sẽ đặt giá trị cho các thanh ghi của bộ mã hóa ADV7181 để cấu hình hoạt động cho chip mã hóa này Khối Timer trì hoãn ban đầu: Sau chuỗi khởi động, ADV7181 rơi vào thời kì không ổn định, khối sẽ phát hiện thời kì không ổn định này rồi tính toán thời điểm bắt đầu làm việc của các khối khác
Khối Disize_Horizon: Lấy ra chuỗi liên tục các pixel trong dòng dữ liệu do ADV7181B xuất ra đồng thời định lại kích thước frame ảnh từ dạng 720 x 480 sang chuẩn VGA 640 x 480
SDRAM BUFFER: Nhận dữ liệu và tính hiệu điều khiển ghi từ khối Disize_Horizon để ghi giá trị các pixel vào SDRAM, đồng thời cũng nhận tín hiệu từ VGA controller để điều khiển việc xuất dữ liệu, địa chỉ phù hợp (xuất xen kẽ các line thuộc Odd field và Even field)
Khối xử lý ảnh YUV: xử lý dữ liệu ảnh nhận được từ SDRAM BUFFER rồi xuất ra dữ liệu ảnh cho khối Convert YUV to RGB
Khối ConvertYUVtoRGB: ADV718B xuất ra ảnh video dạng YUV, để có thể hiện thị lênh VGA thì trước tiên chuyển đổi thành dạng RGB
Khối VGA_Controller: Nhận dữ liệu ảnh RGB từ khối ConvertYUVtoRGB để xuất dữ liệu và tín hiệu đồng bộ cho video DAC7123, đồng thời cũng phát ra các tín hiệu điều khiển SDRAM_BUFFER để xuất dữ liệu từ SDRAM
Trang 226 KHỐI I2C_VIDEO_CONFIG
6.1 SƠ ĐỒ KHỐI
Hình 6.1: Sơ đồ khối I2C_Video_Config
ICLK Xung Clock 50MHz từ kit DE2
RESET Tín hiệu Reset hệ thống
I2C_SCLK Ngõ ra chứa xung Clock cung cấp cho ADV7181B
I2C_DATA Port 2 chiều để cấu hình các giá trị thanh ghi của ADV7181B
Hình 6.2: Dạng sóng để truyền dữ liệu và cấu trúc ghi với giao thức I2C
6.2 MÔ TẢ
Vai trò của khối chỉ là ghi giá trị vào các thanh ghi của ADV7181B nên có thể chọn xung clock làm việc của khối là 20KHz nhờ vào bộ chia tần số 50MHz Địa chỉ Slaver của ADV7181B là 40h nên ta sử dụng cách gán mI2C_DATA là kiểu dữ liệu cần truyền trên Bus và LUT_DATA chứa địa chỉ của thanh ghi và giá trị cần nạp
Khi reset, bắt đầu cấu hình lại cho ADV7181B bằng cách xóa giá trị các bộ đếm và cờ Sau đó để nạp giá trị cho các thanh ghi ta sử dụng máy trạng thái sau:
Trang 23always@(posedge mI2C_CTRL_CLK or negedge iRST_N) begin
//LUT_SIZE là số lần nạp giá trị cho các thanh ghi cần thiết
//LUT_INDEX là biến đếm để ánh xạ đến địa chỉ của các thanh ghi và giá trị cần nạp
begin case(mSetup_ST)
Trang 24//tăng LUT_INDEX lên 1 để nhảy đến thay ghi mới rồi quay về trạng thái 0
case(LUX_INDEX):
27: LUT_DATA <= 16’h0050;
Để AVD7181B có thể phát hiện chuẩn video NTSC thì ta sẽ nạp các giá trị cho các thanh ghi theo bảng giá trị cài đặt ở phần mô tả ADV7181B Tuy nhiên khi truyền chuỗi này trên bus ta cần phải thêm các bit đồng bộ: 1 bit cho trạng thái IDE, 2 bit để thiết lặp cờ START, 3 bit để chờ ACK cho ADV xác nhận, 3 bit để thiết lặp cờ STOP và báo kết thúc chuỗi, vì vậy thực sự chuỗi dài 33 bit:
Trang 25//thả nổi đường truyền nhập để ACK từ ADV7181B qua port 2 chiều I2C_DATA
//giá trị cần ghi vào thanh ghi
//thiết lặp cờ STOP và báo kết thúc chuỗi
6’d30 : begin SDO=1’b0; SCLK=1’b0; ACK3=I2C_SDAT;end
wire I2C_SCLK = SCLK | (((SD_COUTER>=4) &
(SD_COUTER<=30))? ~CLOCK : 0 );
wire ACK=ACK1 | ACK2 | ACK3;
// khi xét xác nhận đã nạp xong thanh ghi ta sử dụng giá trị bù của //ACK (tích cực mức thấp), chỉ xác nhận khi có đủ 3 xác nhận ACK1, //ACK2, ACK3
Và dạng sóng thu được trên chân I2C_SCLK như sau (END từ 0 lên 1 chỉ ra rằng đã nạp xong giá trị cho một thanh ghi):
Trang 26Hình 6.4: dạng sóng mô phỏng trên chân I2C_SCLK
7 KHỐI TIMER TRÌ HOÃN BAN ĐẦU
7.1 SƠ ĐỒ KHỐI
Hình 7.1: Sơ đồ của khối timer trì hoãn ban đầu
ICLK Xung clock 50Mhz từ kit DE2
VS Tín hiệu VS (Vertical Sync) từ ADV7181B
HS Tín hiệu HS (Horizontal Sync) từ ADV7181B
TD_Stable Báo hiệu ADV7181b đã hoạt động ổn định
RST0, RST1, RST3 Ngõ ra cho phép các khối khác bắt đầu làm việc
7.2 MÔ TẢ
Với cấu hình đã cài đặt ở phần trước, khi đã hoạt động ổn định, dạng sóng do ADV7181B phát ra như sau:
Hình 7.2: Mô tả dạng sóng ADV7181B
Trang 27Vì vậy để phát hiện xem chip mã hóa này đã hoạt động ổn định hay chưa khối TD_DETEC tiến hành kiểm tra điều kiện: VS ở mức cao trong 9 chu kỳ liên tiếp của
HS rồi chuyển xuống mức thấp, nếu thỏa mãn thì đưa TD_Stable lên mức cao Khi tín hiệu TD_Stable lên mức cao, khối RESET_DELAY bắt đầu đếm lên theo xung nhịp của ICLK (50MHz) để tính thời điểm xuất ra mức 1 trên các chân RST0, RST1, RST2 Các tín hiệu này dùng để khởi động các khối khác theo trình tự như sau:
a) Ban đầu xóa tất cả dữ liệu trong các khối
b) Tính từ thời điểm TD_Stable lên 1 (đơn vị là chu kỳ clock 27MHz)
- Sau 1132461.5: tích cực RST0 để kích hoạt khối SDRAM BUFFER
- Sau 1698692.5: tích cực RST1 để kích hoạt khối Desize Horizon
- Sau 2264923.5: tích cực RST2 để kích hoạt khối xử lý ảnh YUV và VGA controller
c) Giữ nguyên giá trị ngõ ra cho đến khi có tín hiệu RESET hệ thống thì lặp lại
Điểm cần chú ý ở đây là khi Desize Horizon hoạt động thì sẽ xuất DATA_VALID cho phép ghi dữ liệu vào SDRAM BUFFER Rồi phải chờ một khoảng thời gian để ghi đủ số liệu cần thiết mới kích hoạt VGA Controller để xuất dữ liệu từ SDRAM BUFFER Như ta đã biết một frame ảnh do ADV7181B xuất ra bao gồm 900900 byte (525 line, mỗi line có 1716 byte) hay để truyền hết một frame sẽ mất 900900 chu kỳ Do xung clock trên chân LLC để truyền các byte là 27MHz nên
ta kiểm tra lại các thời điểm này như sau:
- Lấy gốc thời gian là khi bắt đầu frame đầu tiên
- TD_Stable lên 1 khi Frame đầu tiên đã phát được 9 line: 9 x 1716 =
15444 chu kỳ
- Frame thứ ba được bắt đầu tại thời điểm 2 x 900900 = 1801800
- Khối Desize Horizon được kích hoạt tại thời điểm 1714136.5
(= 15444 + 1698692.5) tức là trước khi frame thứ ba bắt đầu Đảm bảo rằng khối sẽ xuất ra DATA_VALID = 1 ở toàn bộ các Active Pixel của frame thứ 3
- Khối VGA Controller được kích hoạt tại thời điểm 2280367.5(=15444 + 2264923.5) nên oRequest được xuất ra tại thời điểm 2315727.5(= 2280376.5 + 35360) Với 35360 chu kỳ là khoảng thời gian từ khi khối được reset cho đến khi oRequest lên 1 Vậy việc đọc từ SDRAM BUFFER được kích hoạt khi frame thứ 3 đã bắt đầu được một khoảng thời gian là 513927.5(= 2315727.5 – 1801800) Điều này
Trang 28đảm bảo cho việc xuất ra đúng từng frame từ SDRAM BUFFER mà ta sẽ đề cập kỹ hơn ở phần mô tả SDRAM BUFFER
TD_DATA[7:0] Dữ liệu hình ảnh từ ADV7181B
ACLR Tín hiệu xóa bất đồng bộ do khối Timer trì hoãn cung cấp
CLK Xung clock 27MHz từ chân TD_CLK của ADV7181B