(Luận văn thạc sĩ) nghiên cứu, thiết kế vi xử lý 8 bit dựa trên công nghệ FPGA

102 40 0
(Luận văn thạc sĩ) nghiên cứu, thiết kế vi xử lý 8 bit dựa trên công nghệ FPGA

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

1 MỤC LỤC DANH MỤC BẢNG DANH MỤC HÌNH VẼ LỜI NÓI ðẦU CHƯƠNG TỔNG QUAN VỀ FPGA 1.1 Giới thiệu chung 1.2 Tổng quan thiết bị logic khả trình – PLD 1.3 Thiết bị logic khả trình đơn giản – Simple PLD 1.4 Thiết bị logic khả trình phức tạp – Complex PLD 12 1.5 FPGA – Field Programmable Gate Arrays 15 CHƯƠNG THIẾT KẾ TẬP LỆNH 22 2.1 Mô tả chung tập lệnh 22 2.2 Thiết kế chi tiết tập lệnh 23 CHƯƠNG THIẾT KẾ KIẾN TRÚC VI XỬ LÍ 27 3.1 Giới thiệu 27 3.2 Thiết kế datapath ñiều khiển cho RICS 28 3.4 Xây dựng module ñiều khiển 45 3.5 Tổ chức nhớ 45 CHƯƠNG 4: THIẾT KẾ TESTBENCH VÀ PHƯƠNG PHÁP MÔ PHỎNG TRÊN MODELSIM 51 4.1 Giới thiệu 52 4.2 Thiết kế hệ mô 53 4.3 Mơ để kiểm tra thiết kế 55 CHƯƠNG 5: THIẾT KẾ CHI TIẾT CHỨC NĂNG CỦA VI ðIỀU KHIỂN VÀ MÔ PHỎNG TRÊN MODELSIM 58 5.1 Giới thiệu chung 58 5.2 Thiết kế mô chức module vi xử lý 59 5.3 Thiết kế mơ hệ thống tự động 68 5.4 Mơ vi điều khiển thực đoạn chương trình đơn giản, kiểm tra chức module vi ñiều khiển 72 CHƯƠNG TRIỂN KHAI TRÊN KÍT DE2 VÀ MỘT ỨNG DỤNG ðƠN GIẢN 79 6.1 Tổng quan Kit DE2 79 6.2 Triển khai chạy thử kít DE2 80 6.3 Một ứng dụng nhỏ sử dụng vi ñiều khiển bít 81 KẾT LUẬN 83 TÀI LIỆU THAM KHẢO 85 Phụ lục 1: Các chương trình test bench dùng để mơ kiểm tra chức vi ñiều khiển 86 Phụ lục Mã nguồn Verilog nhân vi ñiều khiển 88 DANH MỤC BẢNG Bảng - 1: Tóm tắt thiết bị PLD Bảng - Altera CPLD 14 Bảng - Xilinx CPLD 14 Bảng 2- 1: Các lệnh hướng byte vi ñiều khiển 24 Bảng 2- 2: Các lệnh hướng bít vi điều khiển 25 Bảng 2- 3: Các lệnh rẽ nhánh vi ñiều khiển 26 Bảng - 1: Các ghi chức ñặc biệt 47 Bảng - 2: Thanh ghi trạng thái vi ñiều khiển 48 Bảng - 1: Lối vào ñiều khiển ALU 61 Bảng - 2: Mã nguồn chương trình mơ 73 Bảng - 3: Các testbench dùng để mơ kiểm tra chức vi ñiều khiển 78 DANH MỤC HÌNH VẼ Hình - Cấu trúc thiết bị PAL 10 Hình - Cấu trúc thiết bị PLA 10 Hình - 3: Cấu trúc chip GAL 16V8 11 Hình - 4: Cấu trúc chung CPLD 12 Hình - Cấu trúc CPLD XC9500 Xilinx 13 Hình - 6: Cấu trúc chung FPGA 16 Hình - 7: Cấu trúc CLB FPGA họ XC40000E 17 Hình - 8: Cấu trúc Logic Cell Spartan-IIE 18 Hình - Cấu trúc IOB Spartan-IIE 18 Hình - 10: Liên kết chuyển mạch 19 Hình - 11 Mạng liên kết CLB 19 Hình - 12 Các kết nối trực tiếp khối FPGA 20 Hình - 13 FPGA Spartan IIE Xilinx 20 Hình 2- 1: ðịnh dạng lệnh hướng byte 23 Hình 2- ðịnh dạng lệnh hướng bít 24 Hình 2- 3: ðịnh dạng lệnh rẽ nhánh 25 Hình 2- 4: ðịnh dạng lệnh goto 25 Hình 3- 1: Một datapath đơn giản mơ đun điều khiển tương ứng 28 Hình 3- 2: Tổng quan kiến trúc vi ñiều khiển 30 Hình 3- 3: Mơ hình điều khiển datapath 31 Hình 3- 4: Bộ nhớ chương trình, PC module tính PC+1 kết nối với tạo thành datapath ñơn giản 33 Hình 3- 5: Tệp ghi (register file) 33 Hình 3- 6: Bộ logic số học ALU 34 Hình 3- 7: Kết nối logic số học với register file 34 Hình 3- 8: Datapath ñơn giản sau ñã kết nối thành phần vi ñiều khiển với 35 Hình 3- 9: Datapath vi điều khiển sau ñã ñược thêm vào ghi pipeline ñể thực kĩ thuật xử lý đường ống 39 Hình 3- 10: Trạng thái datapath thực pha đầu tiên, tìm nạp lệnh 40 Hình 3- 11: Trạng thái datapath thực bước giải mã lệnh ñọc liệu từ register file 41 Hình 3- 12: Trạng thái datapath thực bước thực thi lệnh 42 Hình 3- 13: Datapath sau ñã thêm khối ñiều khiển 43 Hình 3- 14: Tổ chức nhớ chương trình vi điều khiển 46 Hình 3- 15: Tiến trình thực lệnh GOTO 48 Hình 3- 16: Tiến trình thực lệnh CALL 49 Hình 3- 17: Tổ chức nhớ liệu, bao gồm ghi chức ñặc biệt ghi chức chung 49 Hình 3- 18: Sơ ñồ kiến trúc vi xử lý 50 Hình - Mơi trường đồng mơ đồng 54 Hình - Mơi trường ñồng mô không ñồng 55 Hình - 1: Bộ lô gic số học ALU 60 Hình - MUX lựa chọn lối vào cho S1 ALU 60 Hình - 3: Bộ nhớ RAM single port dùng làm nhớ chương trình 62 Hình - 4: Sơ đồ khối nhớ chương trình 63 Hình - 5: Sơ ñồ khối chia tần số 64 Hình - 6: Sơ đồ khối nhớ chương trình 64 Hình - 7: IP core ñược dùng ñể làm nhớ chương trình 66 Hình - 8: Sơ ñồ bên register file 67 Hình - 9: Bộ nhớ Stack 68 Hình - 10: Kết mơ PC nhớ chương trình vi điều khiển 74 Hình - 11: Kết mô khối ALU 75 Hình - 12: Kết mô register file 76 Hình - Sơ đồ thành phần kít phát triển DE2 80 Hình - 2: Lưu đồ thuật tốn thực chạy chữ LCD 82 LỜI NÓI ðẦU Với xu hướng phát triển nhanh vi xử lý yêu cầu ngày cao người dùng, việc phát triển một vi xử lý với tốc độ tính tốn thật mạnh u cầu khẩn thiết nhà phát triển cơng nghệ Việc thiết kế vi xử lý có khả tính tốn cao khơng cịn vấn ñề mẻ giới, với Việt Nam địi hỏi phải vượt qua khó khăn định Trong luận văn tác giả khơng có tham vọng thiết kế vi xử lý có khả tính tốn cao mà chủ yếu tập trung vào phân tích kiến trúc thiết kế vi xử lý đơn giản Mục đích tác giả nắm kiến trúc, quy trình thiết kế, triển khai kiểm ñịnh vi xử lý Trên sở tác giả mở rộng, cải tiến vài mơ đun, chức vi xử lý để nâng cao dần hiệu suất tính tốn vi xử lý Kết luận văn tiền ñề ñể tác giả phát triển vi xử lý có tốc độ xử lý cao Luận văn bắt đầu với việc tìm hiểu xu hướng loại thiệt bị lơgic lập trình ñược nay, tìm hiểu, thiết kế tập lệnh, datapath ñiều khiển cho vi xử lý bít đơn giản dựa kiến trúc RISC với 33 lệnh tập lệnh, tiến hành triển khai ngôn ngữ Verilog mô kiểm tra chức vi xử lý phần mềm ModelSim Mục đích phần đầu hiểu quy trình thiết kế xây dựng mơi trường phát triển Sau tác giả cải tiến dần vi xử lý ñể có khả tính tốn tốt hơn, áp dụng kĩ thuật ñường ống pipeline, nâng ñộ sâu nhớ stack, mở rộng không gian nhớ nhớ chương trình nhớ liệu dùng kĩ thuật banking Cuối thực tổng hợp thiết kế kít FPGA DE2 Altera chạy thử chương trình nhỏ Phần cuối tác giả trình bày ứng dụng nhỏ sử dụng vi ñiều khiển vừa ñược thiết kế Kết cho thấy, vi điều khiển thực chức Chương TỔNG QUAN VỀ FPGA 1.1 Gi i thi u chung Ngày việc sử dụng hệ FPGA ñang ñề tài ñược quan tâm giới, lý sau: - Do phát triển nhanh công nghệ bán dẫn, giá thành chip FPGA ngày rẻ - Việc sử dụng chip FPGA ñể phát triển sản phẩm rút ngắn ñược nhiều thời gian thiết kế thời gian ñưa sản phẩn thị trường so với số phương pháp thiết kế truyền thống ASIC - Sử dụng cơng nghệ FPGA để verification thiết kế ASIC rút ngắn ñược nhiều thời gian simulation giảm ñược nhiều giá thành cơng sức thiết kế Dưới trình bày sơ lược thiết bị logic khả trình quy trình thiết kế dựa cơng nghệ FPGA, tác giả tập trung vào giới thiệu quy trình thiết kế dựa cơng nghệ FPGA tác giả sử dụng chip FPGA Altera ñể thử Prototype thiết kế tác giả Phần ñầu tiên chương giới thiệu thiết bị PLD: khái niệm PLD, trình phát triển thiết bị PLD, cấu trúc vài loại thiết bị PLD FPGA, công nghệ chế tạo tính ứng dụng 1.2 T ng quan v thi t b logic kh trình – PLD Field Programmable Device (FPD) – Một thuật ngữ chung ñể loại mạch tích hợp sử dụng ñể thực thi phần cứng số, mà ñó chip cấu hình lại người dùng cuối nhằm thu ñược thiết kế Người dùng cấu hình lại cho thiết bị nơi thiết bị sử dụng mà khơng cần ñem thiết bị cho nhà sản xuất thực việc cấu hình Lập trình cho thiết bị bao gồm việc ñưa chip vào thiết bị lập trình đặc biệt (nạp cấu hình), số khác cấu hình hệ thống (ISP – In System Programming) Một tên gọi khác FPD Programmable Logic Devices (PLD) Sau ta tìm hiểu kỹ thiết bị PLDs cụ thể PLD – Programable Logic Device thiết bị logic số lập trình được, PLD đưa giới thiệu vào khoảng thập kỷ 70, bắt nguồn từ ý tưởng chế tạo mạch logic tổ hợp có khả tái lập trình lại phần cứng (khả trình), nhằm phục vụ cho việc thử nghiệm, tạo mẫu, phát triển ứng dụng, sản xuất quy mô nhỏ Khác với vi xử lý, vi ñiều khiển hay loại IC số có trước chạy chương trình lập trình phân cứng cố định, khả tái lập trình PLDs nhằm đạt đến thay đổi mức phần cứng Nói theo cách khác, PLDs chip đa mục đích, tái cấu hình lại phần cứng nhiều lần tùy theo ứng dụng khác PLDs ñầu tiên thiết bị PAL – Programmable Arrays Logic (Mảng logic khả trình) hay PLA Các thiết bị sử dụng cổng logic số AND, OR (khơng có flip-flop), cho phép thực mạch logic tổ hợp khơng thực logic dãy ðể khắc phục nhược ñiểm này, ghi cho PLD ñã ñược ñưa nhằm thêm vào ñầu flip-flop, ñó thực ñược hàm logic dãy ñơn giản ðầu thập niên 1980s, mạch logic ñược ñưa vào ñầu PLD Cấu trúc tế bào ñầu gọi Macro Cell, chứa ñựng flip-flop, cổng logic dồn kênh (MUX) Sự cải tiến ñem lại cho PLDs khả linh hoạt thiết kế Kiến trúc PLDs ñược gọi GAL – generic PAL Các PLA, PAL, GAL ñược gọi chung thiết bị logic khả trình đơn giản – Simple PLDs (SPLD) ðến hệ tiếp sau, vài GAL ñược chế tạo ra, có cấu trúc phức tạp hơn, sử dụng cơng nghệ bán dẫn tiên tiến nhiều tính (như chuẩn JTAG, giao diện logic với nhiều chuẩn logic khác …) Một hệ thiết bị PLD ñời ñược biết tới thiết bị logic số khả trình phức tạp - Complex PLD (CPLD) CPLD có mật độ tích hợp cao, hiệu suất cao, giá thành thấp (có CPLD giá 1USD) ðến thập kỷ 80, FPGAs (Field Programmable Gate Arrays) ñược ñưa giới thiệu FPGA có nhiều điểm khác biệt với CPLD kiến trúc, cơng nghệ, tính kèm giá thành FPGA nhắm tới thiết bị mạch logic cỡ lớn, hiệu suất cao - PLA Simple PLD(SPLD) - PAL - Register PLA/PAL - GAL Complex PLD (CPLD) FPGA (Field Programmable Gate Arrays) Bảng - 1: Tóm tắt thiết bị PLD Trong phần ta tìm hiểu loại thiết bị PLD thiết bị PLD ñơn giản (SPLD) thiết bị PLD phức tạp (CPLD, FPGA) 1.3 Thi t b logic kh trình đn gi n – Simple PLD Như ñã ñề cập trên, thiết bị PAL, PLA GAL ñược gọi chung thiết bị logic khả trình đơn giản – Simple PLD Dưới trình bày cụ thể cấu trúc loại SPLDs 1.3.1 Thiết bị PAL PAL – Programmable Array Logic chip ñược ñưa giới thiệu Monolithic Memories khoảng thập kỷ 70 Cấu trúc PAL: Mảng cổng AND khả trình, theo sau cổng OR cố ñịnh Các ñầu vào ñược nối ñến cổng AND thông qua ma trận ñiểm nối lập trình được, đầu cổng AND ñưa ñến cổng OR ñến ñầu Hình mơ tả cấu trúc PAL (Hình 2.1) Với cấu trúc phần cứng đó, khả PAL cho phép thực hàm tổ hợp, gọi a1, a2, aN tìn hiệu đầu vào, x tìn hiệu đầu ra, ta có hàm tổ hợp: x = m1 + m2 + + mM với m = fi(a1,a2, aN) lấy ví dụ: x = a1a2 + a2 a3 a4 + a1a2 a3 a4 a5 ðể khắc phục nhược ñiểm này, cuối năm 70, Registered PALs (RPALs) ñược ñưa giới thiệu RPALs có thêm flip-flop đầu cổng OR, điều cho phép RPALs thực hàm logic tổ hợp logic dãy ñơn giản Một ví dụ điển hình cho thiết bị PAL thơng dụng chíp PAL16L8 có 16 đầu vào, đầu với kiểu đóng vỏ PDIP-20 nên có 10 chân vào cho tín hiệu, chân cho tín hiệu chân vào/ra 1.3.2 Thiết bị PLA ðưa giới thiệu vào năm 70 hãng Signetics Cấu trúc PLA khác với PALs chỗ, thiết bị PLAs có mảng kết nối AND OR lập trình được, đem lại cho PLA tính linh hoạt PAL thiết kế logic số Nhược ñiểm: Số ñiểm nối nhiều dẫn ñến tốc ñộ chậm Một PLA ñiển hình Signetics PLS161 với 12 vào Công nghệ chế tạo PLA giống với công nghệ chế tạo PAL Mặc dù ngày thiết bị PLA ñã cũ, xong chúng lại ñược xuất trở lại gần ñây khối kiến trúc họ CPLDs tiêu thụ lượng thấp, họ CoolRunner (Xilinx) 10 Kết nối lập trình Hình - Cấu trúc thiết bị PAL Hình - Cấu trúc thiết bị PLA 88 Ph l c Mã ngu n Verilog c a nhân vi ñi u n `timescale 1ns / 10ps module mrisc( clk, rst_in, inst_addr, inst_data, portain, portbin, portcin, portaout, portbout, portcout, trisa, trisb, trisc, tcki, wdt_en ); // Basic Core I/O input clk; input rst_in; // Program memory interface output [10:0] inst_addr; input [11:0] inst_data; // Basic I/O Ports input [7:0] portain; input [7:0] portbin; input [7:0] portcin; output [7:0] output [7:0] output [7:0] portaout; portbout; portcout; output [7:0] output [7:0] output [7:0] trisa; trisb; trisc; input input tcki; wdt_en; // This should be set to the ROM location where our restart vector is // As set here, we have 512 words of program space parameter PC_RST_VECTOR = 11'h000, // Should be: 11'h7FF, STAT_RST_VALUE = 8'h18, 89 OPT_RST_VALUE FSR_RST_VALUE TRIS_RST_VALUE parameter ALU_ADD ALU_SUB ALU_INC ALU_DEC ALU_AND ALU_CLR ALU_NOT ALU_IOR ALU_MOV ALU_MOVW ALU_RLF ALU_RRF ALU_SWP ALU_XOR ALU_BCF ALU_BSF parameter = 8'h3f, = 7'h0, = 8'hff; = = = = 4'h0, 4'h1, 4'h2, 4'h3, = = = = = = = = = = = = 4'h4, 4'h5, 4'h6, 4'h7, 4'h8, 4'h9, 4'ha, 4'hb, 4'hc, 4'hd, 4'he, 4'hf; // Byte Oriented RF Operations (Register File) I_ADDWF = 12'b0001_11??_????, I_ANDWF = 12'b0001_01??_????, I_CLRF = 12'b0000_011?_????, I_CLRW = 12'b0000_0100_0000, I_COMF = 12'b0010_01??_????, I_DEC = 12'b0000_11??_????, I_DECFSZ = 12'b0010_11??_????, I_INCF = 12'b0010_10??_????, I_INCFSZ = 12'b0011_11??_????, I_IORWF = 12'b0001_00??_????, I_MOV = 12'b0010_00??_????, I_MOVWF = 12'b0000_001?_????, I_NOP = 12'b0000_0000_0000, I_RLF = 12'b0011_01??_????, I_RRF = 12'b0011_00??_????, I_SUBWF = 12'b0000_10??_????, I_SWAPF = 12'b0011_10??_????, I_XORWF = 12'b0001_10??_????, // Bit Oriented RF Operations I_BCF = 12'b0100_????_????, I_BSF = 12'b0101_????_????, I_BTFSC = 12'b0110_????_????, I_BTFSS = 12'b0111_????_????, // Literal & Controll Operations I_ANDLW = 12'b1110_????_????, I_CALL = 12'b1001_????_????, I_CLRWDT = 12'b0000_0000_0100, I_GOTO = 12'b101?_????_????, I_IORLW = 12'b1101_????_????, I_MOVLW = 12'b1100_????_????, I_OPTION = 12'b0000_0000_0010, I_RETLW = 12'b1000_????_????, //22 //1 //18 90 I_SLEEP = 12'b0000_0000_0011, I_TRIS = 12'b0000_0000_0???, I_XORLW = 12'b1111_????_????; //33 //Special Function Register parameter // sfr register address encodings, totaly we have sfr INDF_ADDR = 3'h0, TMR0_ADDR = 3'h1, PCL_ADDR = 3'h2, STAT_ADDR = 3'h3, //Status FSR_ADDR = 3'h4, PORTA_ADDR = 3'h5, PORTB_ADDR = 3'h6, PORTC_ADDR = 3'h7; parameter // Source Select K_SEL = 2'b10, // SFR_SEL = 2'b00, //Special Funcion Register select RF_SEL = 2'b01; //Register File Select parameter // STATUS Register status bits we STAT_WR_C = 3'b001, //Carry/!borrow STAT_WR_DC = 3'b010, //Digit carry/!borrow STAT_WR_Z = 3'b100; //Zero bit: the result is rezo; result is not zero // Instruction Register reg rst; reg [11:0] instr_0, instr_1; reg rst_r1, rst_r2; wire valid; reg valid_1; reg reg reg reg reg [7:0] [7:0] [3:0] [1:0] mask; sfr_rd_data; alu_op; src1_sel; src1_sel_; //Out put of special Function Register //16 mode for ALU operation //Maybe not need wire [7:0] wire [7:0] dout; src1; // ALU output // ALU Source reg [2:0] wire out stat_bwe; // status bits we c_out, dc_out, z_out;//Carry reg reg reg reg reg reg pc_skz, pc_skz_; pc_bset, pc_bset_; pc_bclr, pc_bclr_; pc_call, pc_call_; pc_goto, pc_goto_; pc_retlw, pc_retlw_; wire invalidate_1; wire invalidate_0_; reg invalidate_0; // stage dst decode reg w_we_; out, //Write Enable digit carry out, zero 91 reg rf_we_; //Register File Write Enable reg sfr_we_; //Special Function Register Write Enable reg tris_we_; //Tris Write Enable // stage dst decode reg w_we; wire rf_we; reg rf_we1, rf_we2, rf_we3; reg reg reg reg opt_we; trisa_we; trisb_we; trisc_we; wire reg wire reg reg reg reg reg reg indf_we_; tmr0_we; pc_we_; pc_we; stat_we; fsr_we; porta_we; portb_we; portc_we; wire wire wire reg wire wire wire bit_sel; [7:0] tmr0_next, tmr0_next1, tmr0_plus_1; tmr0_cnt_en; wdt_clr; wdt_to; wdt_en; tcki; //status wire [7:0] sfr_rd_data_tmp1, sfr_rd_data_tmp2, sfr_rd_data_tmp3; // Register wire [1:0] wire [4:0] wire [7:0] File Connections rf_rd_bnk, rf_wr_bnk; rf_rd_addr, rf_wr_addr; rf_rd_data, rf_wr_data; // Program Counter reg [10:0] inst_addr; reg [10:0] pc; wire [10:0] pc_next; wire [10:0] pc_plus_1; wire [10:0] stack_out; reg [10:0] pc_r, pc_r2; wire [10:0] pc_next1, pc_next2, pc_next3; // W Register reg [7:0] w; // Working Register reg [7:0] status; // Status Register wire [7:0] status_next; reg [6:0] fsr; // fsr register ( addressing) file select register wire [6:0] fsr_next; reg [7:0] tmr0; // Timer reg [5:0] option; // Option Register for indirect 92 // Tristate reg [7:0] reg [7:0] reg [7:0] Control registers trisa; trisb; trisc; // I/O Port reg [7:0] reg [7:0] reg [7:0] reg [7:0] reg [7:0] reg [7:0] registers porta_r; portb_r; portc_r; portaout; portbout; portcout; // // // // // // PORTA PORTB PORTC PORTA PORTB PORTC input register input register input register output register output register output register /////////////////////////////////////////////////////////////////////// / // External Reset is Synchrounous to clock always @(posedge clk) rst

Ngày đăng: 05/12/2020, 11:41

Từ khóa liên quan

Mục lục

  • MỤC LỤC

  • DANH MỤC BẢNG BIỂU

  • DANH MỤC HÌNH VẼ

  • LỜI NÓI ĐẦU

  • Chương 1: TỔNG QUAN VỀ FPGA

  • 1.1. Giới thiệu chung

  • 1.2. Tổng quan về thiết bị logic khả trình - PLD

  • 1.3. Thiết bị logic khả trình đơn giản - Simple PLD

  • 1.3.1 Thiết bị PAL

  • 1.3.2 Thiết bị PLA

  • 1.3.3 Thiết bị GAL

  • 1.4 Thiết bị logic khả trình phức tạp - Complex PLD

  • 1.5. FPGA- Field Programmable Gate Arrays

  • 1.5.1. Giới thiệu về FPGA

  • 1.5.2. Kiến trúc của FPGA

  • 1.5.3. Các khối chức năng của FPGA và ứng dụng FPGA

  • Chương 2 THIẾT KẾ TẬP LỆNH

  • 2.1. Mô tả chung về tập lệnh.

  • 2.2. Thiết kế chi tiết tập lệnh

  • Chương 3 THIẾT KẾ KIẾN TRÚC VI XỬ LÍ

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan