1. Nội dung thiết kế tốt nghiệp:
6.3.1 Tổng quan khối giải mã
Khối giải mã được thực hiện bởi ngôn ngữ mô tả phần cứng Verilog, có chức năng cơ bản là giải mã từ ảnh JPEG sang dữ liệu R-G-B 24bit.
Khả năng thực hiện giải mã với: - Mã hóa DCT baseline
- Tỉ lệ lấy mẫu 4:1:1
- Đọc các marker DQT, DHT, SOF0, SOS, SOI, EOI, RSTm. Bỏ qua các thành phần như APP marker..
Các file mã nguồn bao gồm:
jpeg_decode.v : File top entity, liên kết các khối xử lý khối giải mã jpeg_decode_fsm.v : Đọc các thông tin marker segment
jpeg_dht.v : Lưu trữ bảng DHT (mã huffman) jpeg_dqt.v : Lưu trữ bảng DQT (hệ số lượng tử) jpeg_haffman.v : Giải mã Huffman
jpeg_idct.v : Biến đổi IDCT (top module) jpeg_idctb.v : Vùng nhớ đệm IDCT
idctx.v : Xử lý biến đổi IDCT với trục x idcty.v : Xử lý biến đổi IDCT với trục y regdata.v : Khối FIFO đọc dữ liệu vào test.v : File dùng trong mô phỏng
ycbcr2rgb.v : Chuyển đổi không gian màu YCrCb sang không gian RGB ycbcr_mem.v : Lưu trữ giá trị YCrCb
100
ziguzagu.v : Xử lý quét zigzag(top module) ziguzagu_reg.v : Bộ đệm khối xử lý quét zigzag
Sơ đồ các cổng vào ra của khối giải mã được mô tả trên Hình 6.5
Hình 6.5 Sơ đồ các cổng vào ra
Khối input sẽ bao gồm đường truyền dữ liệu DataIn 32 bit, để truyền liên tiếp dữ liệu ảnh nén. Tín hiệu DataInEnable được điều khiển từ vi xử lý Nios II tạo xung nhịp để đồng bộ việc truyền dữ liệu từ vi xử lý đến module giải mã, tại mỗi sườn dương của tín hiệu sẽ kích thích một xung có độ dài một chu kì đồng hồ cho phép đọc dữ liệu từ vi xử lý. Tín hiệu DataInRead thông báo yêu cầu đọc đến nguồn dữ liệu. Tín hiệu JpegDecodeIdle hiển thị trạng thái chờ xuống mức „0‟ (đang bận) khi khối đang xử lý một khung ảnh (Hình 6.6).
Khối output bao gồm các tín hiệu của ảnh đã được giải mã 24bit RGB cần thiết để lưu trữ dữ liệu vào bộ nhớ Frame buffer để hiển thị ra màn hình. Tín hiệu OutPixelX, OutPixelY chỉ ra tọa độ của điểm ảnh hiện thời trên toàn khung ảnh.
Tín hiệu OutEnable sẽ giúp xác nhận thời điểm có dữ liệu ở đầu ra để xử lý.
JPEG Decoder DataIn[31:0] DataInEnable JpegDecodeStart DataInRead JpegDecodeIdle OutHeight[15:0] OutWidth[15:0] OutPixelX[15:0] OutPixelY[15:0] RGB [23:0] OutEnable
101
Hình 6.6 Sơ đồ tín hiệu đầu vào 6.3.2 Sơ đồ khối
Hình 6.7 mô tả sơ đồ khối giải mã JPEG
Hình 6.7 Sơ đồ khối giải mã JPEG
Khối input “FIFO” là một bộ đệm dữ liệu 96 bit, khi dữ liệu đọc vào điền đầy
nhỏ hơn hoặc bằng 64 bit bộ nhớ trên, tín hiệu yêu cầu đọc được kích hoạt và ngược lại. Dữ liệu từ khối này được đưa đến hai khối Huffuman và Decode_fsm để xử lý liên tục theo chu kì hoạt động của khối, đồng thời tạo ra tín hiệu báo trả về số bit đã sử dụng (đối với khối Huffuman) và tín hiệu báo số byte đã dùng (đối với khối Decode_fsm) để tạo yêu cầu đọc.
Khối “Decode FSM” nhận tín hiệu từ khối FIFO có chức năng đọc các marker
(SOI, APP, DQT, DHT, SOF0, SOS, EOI) nhằm xác định các “marker segment” lấy ra các thông tin về ảnh như kích thước, một số tín hiệu điều khiển luồng dữ liệu
FIFO Entropy decoder IDCT YCbCr
Decode FSM Frame Buffer DataInRead DataIn[31:0] 1 0 1 1 0 0 1 1 1 0 0 JpegDecodeIdle DataInEnable 1 JpegDecodeStart
102
(như tín hiệu báo bắt đầu vùng cần giải mã) và lưu trữ giá trị bảng mã Huffman (DHT: gồm hai bảng AC và DC) cũng như giá trị của bảng lượng tử hóa (DQT) được sử dụng khi giải mã Entropy và lượng tử.
Khối “Entropy decoder” có nhiệm vụ giải mã Huffman, lượng tử hóa ngược
dựa vào bảng DHT và DQT đồng thời thực hiện quét zigzag đưa khối ảnh từ chuỗi bit về không gian hai chiều 8x8. Kết quả đầu ra sẽ được lưu trữ vào một mảng 8x8 phần tử 16 bit sử dụng cho đầu vào của khối giải mã IDCT.
Khối giải mã “IDCT” chứa hai buffer lưu trữ cho mảng 8x8x16 bit cần được
giải mã từ khối Huffman. Khi một trong hai được điền đầy toàn bộ sẽ được tính toán giải mã và đồng thời dịch liên tiếp kết quả ở phía đầu ra, kết quả giải mã được cho ra dưới dạng 24 bit YCbCr và địa chỉ tương ứng của điểm ảnh đó.
Khối YCbCr2RGB convert không gian màu sang 24 bit RGB và địa chỉ điểm
ảnh theo tọa độ x, y. Công thức chuyển đổi:
Tuy nhiên để tránh việc tính toán phức tạp với dấu phẩy động cần nhân các hệ số trên với một hằng số và chia hằng số đó để lấy giá trị sau khi tính toán. Dịch 18 bit sang trái với các thành phần vế bên phải (đầu ra RGB sẽ phải dịch 18 bit sang phải), từ đó công thức trở thành:
Khối “Frame Buffer” làm nhiệm vụ lưu trữ kết quả đầu ra cho ảnh sau khi giải
mã vào bộ nhớ RAM đồng bộ dữ liệu RGB hiển thị trên màn hình. Do tài nguyên hệ thống không cho phép có thể buffer toàn bộ ảnh màu 24 bit, trong khuôn khổ thực hiện hệ thống sẽ demo với bảng LED có kích thước 64x64, nên kích thước của bộ
R = Y + 1.402 (Cr -128) G = Y - 0.34414 (Cb - 128) - 0.71414 (Cr - 128) B = Y + 1.772 (Cb - 128) R = Y + 0x02000000 + 0x59BA5 .Cr G = Y + 0x02000000 - 0x16066 .Cb - 0x2DB47.Cr B = Y + 0x02000000 + 0x71687.Cb
103
nhớ Ram cần thiết sẽ là: 64 x 64 x 3 byte = 12288 byte ~ 12 kB. Tuy nhiên, để tiện cho việc quan sát kết quả đầu ra, việc ghi dữ liệu của một ảnh vào Ram sẽ dựa trên những bít có ý nghĩa nhất do đó kết quả của một ảnh lớn hơn sẽ được thu gọn trong khung hình 64x64. Sơ đồ khối điều khiển hiển thị được mô tả trên Hình 6.8.
Hình 6.8 Khối hiển điều khiển hiển thị 6.3.3 Kết quả mô phỏng
Chương trình mô phỏng Testbench đọc dữ liệu từ file lưu dữ liệu Hex của một ảnh JPEG, biến đếm DATA_COUNT để lần lượt đọc từng word dữ liệu 32 bit của file trên tín hiệu JPEG_DATA. Đồng thời tạo các tín hiệu kích thích input theo cách thức giao tiếp với khối giải mã. Kết quả của giá trị của output sẽ được in ra và thể hiện trên biểu đồ tín hiệu cho thấy đúng về mặt logic các tín hiệu cũng như kết quả sau quá trình giải mã (Hình 6.9).
SYNC LED Vsync-Hsync LED CONTROLLER RAM Buffer 64x64x8 bits RGB[23:0 ] Address[11:0] RAM Buffer
64x64x8 bits RAM Buffer 64x64x8 bits R
G B
104
Hình 6.9 Kết quả mô phỏng các tín hiệu trên Modelsim
Dữ liệu ảnh giải mã liên tiếp ở đầu ra bao gồm các giá trị R-G-B và tọa độ X,Y tương ứng. Kết quả thời gian mô phỏng giải mã với ảnh 640x480 thực hiện với chu kì xung nhịp 50MHz là 12,943 (ms), có thể giải mã nhanh kể cả các khung hình kích thước lớn hơn. Tuy nhiên nếu thực hiện trên kit thực tế sẽ phụ thuộc rất nhiều quá trình truyền dữ liệu từ các nguồn lưu trữ dữ liệu đến khối giải mã. Nên tốc độ giải mã một khung hình sẽ chậm hơn, theo tính toán trung bình, thời gian thực hiện giải mã (trên kit DE2 khi đọc dữ liệu video Motion-JPEG từ Flash USB) của ảnh 640*480 là 45 ms và với ảnh 320*240 là 20 ms. Kết quả đầu ra khi mô phỏng với Modelsim được biểu diễn trên Hình 6.10.
105
Hình 6.10 Kết quả đầu ra khi mô phỏng với Modelsim
6.4 Kết luận
Sau khi thiết kế và tiến hành mô phỏng kiểm tra đạt yêu cầu đề ra. Nhóm đã tiến hành tích hợp khối giải mã ảnh JPEG vào hệ thống và tốc độ hoạt động của khối hoàn toàn đáp ứng được các yêu cầu đề ra.
R-G-B
Y-Cb-Cr Tọa độ X, Y
106
Chƣơng 7. Kết quả nghiên cứu, kết luận và
hƣớng phát triển đề tài
Trong chương này sẽ trình bày tóm lược những kết quả mà nhóm tác giả đã đạt được trong quá trình nghiên cứu và hướng phát triển cho đề tài trong tương lai.
7.1 Kết quả đạt đƣợc
7.1.1 Nhúng hệ điều hành uClinux và giao tiếp với USB, thẻ nhớ SD
Giao tiếp với Flash USB chuẩn định dạng FAT16 hoặc FAT32 trên hệ điều hành nhúng.
Giao tiếp với thẻ nhớ SD chuẩn định dạng FAT16 không sử dụng hệ điều hành, với các chức năng như đọc tên và hiển thị trên các file được lưu trữ, đọc nội dung file tùy chọn.
7.1.2 Xây dựng chƣơng trình truyền file xuống kit qua mạng LAN
Xây dựng thành công chương trình Socket Server trên hệ thống Nios II nhận dữ liệu từ client trên PC truyền xuống thông qua giao thức RTP, môi trường truyền dẫn là mạng nội bộ LAN.
7.1.3 Xây dựng khối giải mã JPEG
Khối giải mã JPEG có khả năng giải mã liên tiếp chuỗi ảnh MJPEG, dữ liệu video nén được truyền từ phía vi điều khiển với các nguồn được đọc từ Flash USB, thẻ nhớ SD, hay từ mạng LAN.
7.2 Kết luận
Đồ án đã được hoàn thành, về cơ bản dự án này đáp ứng được các yêu cầu chức năng đã đặt ra từ trước. Có thể xử lý hiển thị các video có kích thước 320x240, chuẩn VGA 640x480, và chuẩn 1024x720 từ các thiết bị và nguồn nêu ở trên.
Với hỗ trợ hiển thị video từ USB:
Video kích thước 320x240 có tốc độ hiển thị đạt khoảng 50 hình/s.
107
Video kích thước 1024x768 có tốc độ hiển thị đạt khoảng 10 hình/s. Nhưng với đề tài này, việc kiểm thử chỉ tiến hành lưu trữ và hiển thị một vùng kích thước 64x64 của video trên. Hình ảnh sẽ được hiển thị đầy đủ với nhiều module bảng led 64x64, mỗi module điều khiển cho từng bảng sẽ chịu trách nhiệm hiển thị từng phần tương ứng của video sau khi đã giải mã.
Tài nguyên sử dụng của hệ thống trên kit DE2 sau khi được synthesis được thể hiện trong hình 7.1.
Hình 7.1 Tài nguyên sử dụng của hệ thống
Trong đó, một vài thông số cần chú ý trong thiết kế với công nghệ FPGA như: - “Total logic elements” là số thành phần logic FPGA, chiếm 17.543 LE
(53%).
- “Total memory bits” là tài nguyên bộ nhớ RAM của chip FPGA chiếm 295.282/483.840 (61%).
7.3 Hƣớng nghiên cứu tiếp theo
Dựa trên kết quả đã đạt được và các nhược điểm còn tồn tại trong quá trình phát triển hệ thống, nhóm tác giả nhận thấy để có thể đi vào ứng dụng thực tiễn, hệ thống cần được tiếp tục nghiên cứu theo các hướng như sau:
Nâng cấp khối giải mã MJPEG thành MPEG-2 hoặc MPEG-4. Đây là các định dạng được sử dụng phổ biến hơn và hiệu quả hơn trong việc truyền và lưu trữ video.
108
Tài liệu tham khảo
[1] Volnei A. Pedroni, Circuit Design with VHDL, The MIT Press, 2004.
[2] Peter J. Ashenden, Digital Design- An Embedded Systems Approach Using
Verilog, Morgan Kaufmann, 2007.
[3] Ronald Sass and Andrew G. Schmidt, Embedded Systems Design with Platform
FPGAs - Principles and Practices, Morgan Kaufmann, 2010.
[4] R.C. Cofer and Benjamin F. Harding, Rapid System Prototyping with FPGAs, Newnes, 2005.
[5] Kimmo Nikkanen, Bachelor‟s Thesis “uClinux as an Embedded solution”, January 2003.
[6] Philipp Lutz, “Device drivers and Test application for a SOPC solution with
Nios II softcore processor and µClinux”, February 9, 2008.
[7] http://www.c-jump.com/CIS24/Slides/FAT/index.html, truy cập cuối cùng ngày 30/5/2012.
[8] http://en.wikipedia.org/wiki/File_Allocation_Table, truy cập cuối cùng ngày 30/5/2012.
[9] “Altera University Program Secure Data Card IP Core”, Altera corporation, March 2009.
[10] http://en.wikipedia.org/wiki/Real-time_Transport_Protocol, truy cập lần cuối ngày 31/5/2012.
[11] Brian "Beej" Hall, Beej’s Guide to Network Programming Using Internet
Sockets [Online]. Available: http://beej.us/guide/bgnet/.
[12] Michael Opdenacker (November 20, 2007), “Introduction to uClinux” [Online]. Avaiable: http://free-electrons.com/articles/uclinux.
[13] http://www.alterawiki.com/wiki/BinaryToolchain, truy cập lần cuối ngày 30/5/2012.
[14] http://www.alterawiki.com/wiki/ModuleProgramming, truy cập cuối cùng ngày 30/5/2012.
[15] Philips Semiconductors, “ISP 1362 embedded programming guide”, June 2002.
109
[16] http://www.alterawiki.com/wiki/FlashProgrammer, truy cập lần cuối ngày 30/5/2012.
[17] International Telecommunication Union, “Information technology digital compression and coding of continuos-tone still images requirements and
guidelines”, ITU, 1993.
[18] S.Stuijk, “Design and implementation of a JPEG decoder”, Faculty of electrical engineering, December 2001.
[19] http://www.alterawiki.com/wiki/CompileHello, truy cập cuối cùng ngày 30/5/2012.
[20] James O. Hamblen – T.S Hall – M.D.Furman, “Rapid prototyping of digital systems – SOPC Edition”, Springer Science, 2008.
[21] David Lariviere and Stephen A.Edwards, “uClinux on the altera DE2”, Columbia University, 2008.
[22] http://www.alterawiki.com/wiki/UsbHost, truy cập cuối cùng ngày 30/5/2012. [23] http://www.alterawiki.com/wiki/MmcSd, truy cập cuối cùng ngày 30/5/2012. [24] http://www.ccm.ece.vt.edu/twiki/bin/view/Main/Linux On NIOS2 Installation, truy cập cuối cùng ngày 30/5/2012.
[25] http://alumni.cs.ucr.edu/~amitra/sdcard/Additional/sdcard_appnote_foust.pdf, truy cập cuối cùng ngày 30/5/2012.
[26] http://opencores.org/project,mjpeg-decoder,overview, truy cập cuối cùng ngày 30/5/2012.
110
Bảng đối chiếu thuật ngữ Anh - Việt
Tên thuật ngữ tiếng Anh Tên thuật ngữ tiếng Việt
LED full color Bảng LED đa sắc
Partition Phân vùng
Streaming Tạo luồng video
End to End Truyền dữ liệu giữa hai điểm cuối Multicast Truyền dữ liệu tới nhiều đích
Real time Thời gian thực
Payload Dữ liệu tải
Profile Hồ sơ
Header Tiêu đề
Audio Âm thanh
Video Hình ảnh
Server Máy chủ
Client Máy khách
Smartphone Điện thoại thông minh
SW-HW codesign Đồng thiết kế phần cứng- phần mềm
Multithread Đa luồng
Clock Xung đồng hồ
Link Liên kết
Process Tiến trình
Stack Ngăn xếp
Flat memory model Mô hình bộ nhớ phẳng
Toolchain Gói công cụ dùng để phiên dịch kernel
Script File kịch bản
Kernel Nhân hệ điều hành
Segmentation Fault Lỗi truy cập bộ nhớ
111
Driver Trình quản lý, điều khiển ngoại vi
Boot Khởi động hệ điều hành
Download Nạp file ảnh zImage xuống KIT Component Thành phần của hệ thống
112
Phụ lục
Phụ lục 1: Chƣơng trình đọc file MJPEG từ một phân vùng trong uClinux và truyền tới khối hiển thị
#include <stdio.h> #include <stdlib.h> #include <pthread.h>
#define writel(b, addr) (void)((*(unsigned int *) (addr)) = (b)) #define readl(addr) \
({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
#define leng_buf 524288*2 unsigned char *buf;
FILE *fs;
unsigned int i,k,done; unsigned int readNum; void *readthread(); void *writethread();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; int main(int arg,char *arr[])
{
pthread_t thread1, thread2; int iret1, iret2;
fs = fopen(arr[1],"rb"); if(fs==NULL)
{
printf("Cannot open source file ! Press key to exit."); exit(0);
}
writel(0, 0x80400010);
buf = (unsigned char *) malloc(leng_buf);
/* Create independent threads each of which will execute function */
iret1 = pthread_create( &thread1, NULL, readthread, NULL); iret2 = pthread_create( &thread2, NULL, writethread, NULL); /* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate *
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL); pthread_join( thread2, NULL);
113
printf("Thread 2 returns: %d\n",iret2); exit(0); return 1; } void *readthread() { unsigned char c; unsigned int j; j=0; while (1){ //pthread_mutex_lock( &mutex1 ); c = fgetc(fs); buf[j] = c; ++j; if (j>=leng_buf-2){j=0;} // pthread_mutex_unlock( &mutex1 ); } printf("END!\n"); } void *writethread() { start: k=0; done = 0; while(k<leng_buf-1) { i=0; readNum = 0;
while(i<4) // Buffer 32 bit tu file { if(buf[k] == 0xd8) if (buf[k-1] == 0xff) { writel(0, 0x80400030); writel(1, 0x80400030); readNum = 0xff; i = 1; } readNum += (buf[k]<<(8*i++)); k++; }
writel(readNum, 0x80400000); // Nap data
writel(0, 0x80400010); // Cho phep doc data while(readl(0x80400020)!=1); writel(1, 0x80400010); } done = 1; goto start; }
114
Phụ lục 2: Chƣơng trình đọc file trong thẻ nhớ SD không thông qua hệ điều hành (nhằm tăng tốc độ truy xuất)
#include "basic_io.h" #include "LCD.h" #include "Fat16.h" #include "Interrupt.h" #include <stdio.h> #include <string.h> //--- --- #define UP 0x08 #define DOWN 0x04 #define ENTER 0x02 //--- ---