Thông báo

Collapse
No announcement yet.

[VHDL] Xử lý ảnh

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Uh, nhưng mà mình chưa tách được màu nên lấy đâu tín hiệu đưa vào RGB của VGA T.T. RAM này cũng trên Kit SRAM 256K 16bits, kit de2 đó mà. Verilog với VHDL mình nghĩ như nhau thôi, chủ yếu là giải thuật, VHDL nó đòi hỏi hơi chặt chẽ hơn 1 chút, với lại, source kiếm hok ra , hì. Chứ nói chung là như nhau thôi ^_^.
    @NEO3F: FSM mình hok wen viết, viết ra nó cũng y chang cái code cũ, nên cũng pó tay ùi ^^

    Code:
    Library ieee;
    Use ieee.std_logic_1164.all;
    Use ieee.std_logic_arith.all;
    Use ieee.std_logic_unsigned.all;
    
    entity Color_split is port
    
     (	CK: in std_logic;
    	indata: in std_logic_vector ( 15 downto 0);
    	g1: out std_logic_vector (7 downto 0);
    	b1: out std_logic_vector (7 downto 0);
    	r1: out std_logic_vector (7 downto 0);
    	g2: out std_logic_vector (7 downto 0);
    	b2: out std_logic_vector (7 downto 0);
    	r2: out std_logic_vector (7 downto 0);
    	add_read: out std_logic_vector ( 17 downto 0);
    	CEn: out std_logic);
    	
    end Color_split;
    
    architecture behav of Color_split is
     
     type state is(state1,state2,state3,state4); 
     signal current_state,next_state:state; 
    
    begin
    		process(CK) 
    			begin 
    			if CK'event and CK='1' then 
    				  current_state<=next_state; 
    			end if; 
    			end process; 
    		
    
    		process(current_state,next_state) 
    variable x: integer;
    variable i: integer:=0;
    variable data1: std_logic_vector ( 15 downto 0);
    variable data2: std_logic_vector ( 15 downto 0);
    variable data3: std_logic_vector ( 15 downto 0);
    
    		
    	begin 
    		x:= 3*i;
    		If ( x < 16200) then 
    		case current_state is 
    		when state1=> 
    
    			CEn <= '0';
    			add_read<= CONV_STD_LOGIC_VECTOR(x,18);
    			data1 := indata;
    			b1 <= data1 ( 15 downto 8);
    			g1 <= data1 ( 7 downto 0);
    			next_state<=state2; 
    			
    		when state2=>
    			CEn <= '0';
    			add_read<= CONV_STD_LOGIC_VECTOR(x+1,18);
    			data2 := indata;
    			r1 <= data2 ( 15 downto 8);
    			b2 <= data2 ( 7 downto 0);
    			next_state<=state3; 
    
    		when state3=>
    			CEn <= '0';
    			add_read<= CONV_STD_LOGIC_VECTOR(x+2,18);
    			data3 := indata;
    			g2 <= data3 ( 15 downto 8);
    			r2 <= data3 ( 7 downto 0);
    
    			next_state<=state4; 
    			
    		when state4=> 
    		       next_state<=state1; 
    		when others=> 
    		        next_state<=state1; 		
    
    		end case;
    		i := i + 1;
    		else CEn <= '1';	
    		end if;
    
    
    	end process;
    
    end behav;
    Last edited by Milano; 31-03-2009, 00:18.

    Comment


    • #17
      Không rõ thông số kit de2 bạn đang dùng là như thế nào nhưng nếu còn thừa tài nguyên thì dùng RAM 24 bits tự tạo cũng được mà .

      Còn nếu vẫn dùng SRAM ngoài trên kit thì với đoạn code trên mình thấy một số vấn đề sau (mình chưa dùng VHDL nên không rõ đây có phải là vấn đề không):
      1. Bạn thực hiện việc đọc dữ liệu RAM dựa trên current_state nhưng không rõ mục đích của state 4 để làm gì. Có lẽ từ state 3 chuyển thẳng về state 1 sẽ hợp lý hơn? (Lúc đó có thể gán chân CE của SRAM luôn tích cực trong quá trình đọc)
      2. Bạn có viết rằng cần đọc 16200 lần (mỗi lần 2 diểm ảnh <-> 6 bytes <-> một lượt 3 trạng thái state 1, 2, 3). Ở trong code If ( x < 16200) có vẻ như bạn dùng x để chỉ số lần đọc nêu trên. Vậy thì với x:= 3*i;i := i + 1; với mỗi biến đổi của current_state và next_state, có lẽ là không đúng mong muốn?
      3. Xét đoạn code data1 := indata; b1 <= data1 ( 15 downto 8); g1 <= data1 ( 7 downto 0);. Mình không rõ lắm về việc thực hiện của các phép gán :=<= cũng như sự khác biệt của signal, variable,... nên không biết ở đây b1, g1 có cho ra đúng giá trị cần đọc từ RAM hay ko? (việc đọc bộ nhớ hay thiết lập giá trị luôn có độ trễ nên thông thường ở cuối chu kỳ đồng hồ mới có dữ liệu đảm bảo). Hơn nữa khi bạn đã qui ước chia ra làm 16200 lần đọc (mỗi lần cho 2 điểm ảnh) thì nên xuất dữ liệu màu đã tách sau khi đọc xong cả 2 điểm ảnh? (hiện tại bạn đọc được gì xuất ra cái đó lại không có thông báo cho các module khác biết bạn đang xuất gì nên rất khó tích hợp với các phần khác :-D)
      4. Một số vấn đề khác vẫn liên quan tới cách tư duy lập trình phần mềm và phần cứng có hơi khác biệt...

      Trên đây chỉ là góp ý cuả mình thôi!
      P/S: Có vẻ như VHDL gần gũi với tư duy "mềm" còn Verilog thì "cứng" hơn

      Comment


      • #18
        hi cả nhà! vấn đề của bạn Milano khá khó... nhưng không phải không có cách giải quyết.
        Theo ý kiến của mình, bạn nên sử dụng các hệ thống nhúng trên FPGA để xử lý, kết hợp các biện pháp gia tốc ứng dụng bằng các khối xử lý cứng trên FPGA. Với Xilinx có thể sử dụng Systemgen for DSP và EDK để thực hiện bài toán của bạn. Nếu bạn làm với đồ của Altera ...( hì hì mình chưa làm Altera bao giờ) .. nhưng mình nhận thấy trong Altium cho phép thiết kế hệ thống nhúng và cho phép thiết kế các ngoại vi sử dụng mã C ( C hardware compiler ). Bạn có thể dựa vào các thuật toán phầm mềm xử lý ảnh đã có để thực hiện cứng hóa trên FPGA như vậy sẽ nhẹ nhàng và linh hoạt hơn...
        Cung cấp kít FPGA giá sinh viên!
        Nhận thiết kế và phát triển các mạch ARM và FPGA theo yêu cầu.
        Email:

        Comment


        • #19
          Nguyên văn bởi FPGA_newbie Xem bài viết
          Không rõ thông số kit de2 bạn đang dùng là như thế nào nhưng nếu còn thừa tài nguyên thì dùng RAM 24 bits tự tạo cũng được mà .

          Còn nếu vẫn dùng SRAM ngoài trên kit thì với đoạn code trên mình thấy một số vấn đề sau (mình chưa dùng VHDL nên không rõ đây có phải là vấn đề không):
          1. Bạn thực hiện việc đọc dữ liệu RAM dựa trên current_state nhưng không rõ mục đích của state 4 để làm gì. Có lẽ từ state 3 chuyển thẳng về state 1 sẽ hợp lý hơn? (Lúc đó có thể gán chân CE của SRAM luôn tích cực trong quá trình đọc)
          2. Bạn có viết rằng cần đọc 16200 lần (mỗi lần 2 diểm ảnh <-> 6 bytes <-> một lượt 3 trạng thái state 1, 2, 3). Ở trong code If ( x < 16200) có vẻ như bạn dùng x để chỉ số lần đọc nêu trên. Vậy thì với x:= 3*i;i := i + 1; với mỗi biến đổi của current_state và next_state, có lẽ là không đúng mong muốn?
          3. Xét đoạn code data1 := indata; b1 <= data1 ( 15 downto 8); g1 <= data1 ( 7 downto 0);. Mình không rõ lắm về việc thực hiện của các phép gán :=<= cũng như sự khác biệt của signal, variable,... nên không biết ở đây b1, g1 có cho ra đúng giá trị cần đọc từ RAM hay ko? (việc đọc bộ nhớ hay thiết lập giá trị luôn có độ trễ nên thông thường ở cuối chu kỳ đồng hồ mới có dữ liệu đảm bảo). Hơn nữa khi bạn đã qui ước chia ra làm 16200 lần đọc (mỗi lần cho 2 điểm ảnh) thì nên xuất dữ liệu màu đã tách sau khi đọc xong cả 2 điểm ảnh? (hiện tại bạn đọc được gì xuất ra cái đó lại không có thông báo cho các module khác biết bạn đang xuất gì nên rất khó tích hợp với các phần khác :-D)
          4. Một số vấn đề khác vẫn liên quan tới cách tư duy lập trình phần mềm và phần cứng có hơi khác biệt...

          Trên đây chỉ là góp ý cuả mình thôi!
          P/S: Có vẻ như VHDL gần gũi với tư duy "mềm" còn Verilog thì "cứng" hơn
          À, state 4 là do mới chuyển từ code cũ wa code mới, có lẽ nên bỏ state đó vì làm mất thêm 1 chu kỳ xung clock.
          Code cũ mình có viết xuất 1 lúc 2 điểm ảnh nhưng code mới viết bằng FSM nên không chờ xuất được. Mình đang suy nghĩ làm sao module bik nhận được 3 lần datain rồi, có lẽ phải thêm 1 bộ FIFO O_O
          @TL138: ALtera cũng cho phép thiết kế hệ thống nhúng Nios, cũng lập trình bằng code C, nhưng rất tiếc, đề tài mình thuần FPGA... ^^". Thx bạn.

          Comment


          • #20
            anh Milano lam đến đâu rùi. Em cũng đang làm về vấn đề xữ lí ảnh. chụp và lưu ảnh vào thẻ nhớ MMC. dùng Sparta 3AN và ADC kết nối. anh co thể chia sẻ cho em với. cám ơn anh.

            Comment


            • #21
              À, code viết rất nhiều nhưng chưa cái nào chạy ^^", ngoại trừ cái SRAM interface. Mấy hôm nay bận mid-term exam nên chưa viết típ được. Mình đang chú trọng chỗ xử lý trước, còn việc nó lấy từ đâu thì kit DE2 của Altera tạm thời có cái panel để đổ thẳng xuống RAM, chắc làm xong rồi mới way lại truyền bằng cổng nối tiếp hay gì đó ^^"

              Comment


              • #22
                @Milano: cậu viết thế là cũng đã có theo kiểu FSM rồi đấy nhưng mà còn chưa chuẩn. Thứ nhất state của cậu ko có mốc khởi tạo. Thứ 2 nó quá "tự nhiên" theo lối suy nghĩ mong muốn. Cậu cần có một thuật toán cụ thể, được thể hiện bằng 1 sơ đồ thuật toán rõ ràng rồi từ đó brake nó ra thành các trạng thái để mà code. Thứ 3, code của cậu chưa tính tới vấn đề tốc độ đáp ứng của mạch điều khiển FSM và timing của RAM...

                Thực ra, nói trên này sẽ rất dài dòng nên cậu cứ đọc quyển "RTL Hardware Design Using VHDL" của Wiley đi rồi code, có j lại post lên đây. Quyển này rất đầy đủ và rõ ràng lại nổi tiếng, Google phát là ra.

                Ngoài ra có một cách khá đơn giản để đọc cái này đó là cậu dùng An...A1 để làm địa chỉ đọc RAM. Với mỗi địa chỉ này cậu đọc được 1 word ~ 2 giá trị màu. Dùng nốt Ao để chọn byte cao, byte thấp tương ứng . Cách này dễ thực hiện, tốn ít thanh ghi hơn nhưng có nhược điểm là mất nhiều lần đọc RAM hơn.

                PS: nếu cậu đọc dữ liệu từ file bmp thì cần chú ý việc dữ liệu lôn ngược và mỗi dòng ảnh đều bắt đầu từ địa chỉ n*32bit hay n*4 byte hay n*2 word chứ không phải tại địa chỉ kế tiếp của dòng trước đó.

                Comment


                • #23
                  giúp mình với.Mình đang làm project liên wan tới IC TV decoder.Không hiểu sao cái ví dụ DE2_TV của altera không hoạt động. Mình đã nạp vào kit de2 ma ko đọc được tín hiệu từ đầu ra VCD hay DVD.
                  Hiện mình dùng nios mà không biết đọc xung đồng bộ thế nào (clock từ bên ngoài đưa vào để xử lý). Ai đó biết giúp mình được không?
                  Cám ơn nhé!

                  Comment


                  • #24
                    Code:
                    Library ieee;
                    Use ieee.std_logic_1164.all;
                    Use ieee.std_logic_arith.all;
                    Use ieee.std_logic_unsigned.all;
                    
                    entity test1_colorsplit is port
                    
                     (	CK: in std_logic;
                    		g1: out std_logic_vector (7 downto 0);
                    	b1: out std_logic_vector (7 downto 0);
                    	r1: out std_logic_vector (7 downto 0);
                    	g2: out std_logic_vector (7 downto 0);
                    	b2: out std_logic_vector (7 downto 0);
                    	r2: out std_logic_vector (7 downto 0);
                    	indata: in std_logic_vector ( 15 downto 0);
                    	temp1: out std_logic_vector (47 downto 0);
                    	count1: out natural);
                    
                    	
                    end test1_colorsplit;
                    
                    architecture behave of test1_colorsplit is
                    subtype counter is std_logic_vector(1 downto 0);
                    signal temp: std_logic_vector (47 downto 0);
                    signal count: natural := 0;
                    begin
                    
                    	process (CK)
                    		begin
                    			If rising_edge (CK) then
                    				count <= count + 1;
                    				If count = 3 then 
                    				count<= 1 ;
                    				end if;
                    			 temp (15 downto 0) <= indata;
                    			 temp (31 downto 16)<= temp (15 downto 0);
                    			 temp (47 downto 32)<= temp  (31 downto 16);			  
                    			 end if;
                    		end process;
                    		
                    		
                    			process 
                    		begin
                    		wait until count = 3;
                    			b1 <= temp ( 47 downto 40);
                    			g1 <= temp ( 39 downto 32);
                    			r1 <= temp ( 31 downto 24);
                    			b2 <= temp ( 23 downto 16);
                    			g2 <= temp ( 15 downto 8);
                    			r2 <= temp ( 7 downto 0);
                    
                    	end process;
                    	
                    			count1 <= count;
                    			temp1 <= temp;
                    	
                    end behave;


                    Mila có viết lại rồi nè, NEO zới mọi người ai rảnh coi dùm, đây là cái gần zới cái Mila mong muốn nhất, o biết có vấn đề gì về timing ko, vì Mila tự gán data in đúng từ rising_edge này đến rising_edge kia [Nghĩ là thực tế nó o thể được như vậy vì address tăng data từ RAM chuyển về chắc sẽ có delay]

                    Comment


                    • #25
                      Alo !!! ... Milano nên lấy viết chì + tờ giấy trắng ... rồi vẽ sơ đồ khối hệ thống của bạn ra. Vẽ càng chi tiết càng tốt, chi tiết từng tín hiệu càng hay ... Vẽ được thì sẽ không code sai linh tinh nữa.

                      Comment


                      • #26
                        Alo !!! ... Milano nên lấy viết chì + tờ giấy trắng ... rồi vẽ sơ đồ khối hệ thống của bạn ra. Vẽ càng chi tiết càng tốt, chi tiết từng tín hiệu càng hay ... Vẽ được thì sẽ không code sai linh tinh nữa.
                        Hì, mình có vẽ rồi, giờ vẽ ra thấy có 1 số vấn đề ko bik phải làm sao. Sau khi mình đọc 2 điểm ảnh liên tiếp, tách ra được RBG của 2 điểm như cái hình trên


                        Như các bạn thấy, trung bình 3 clock 50M thì mình tách ra được 2 bộ RGB riêng biệt, bây giờ cần ghi ngược vào SRAM, nhưng SRAM thì hoạt động theo xung clock 50M. indata của Sram là 16 bits, mình đã dùng 1 đoạn code ghép R1-R2, G1-G2, B1-B2 thành 16bits. Hiện giờ chỉ ghi thẳng vào SRAM, address tăng được, nhưng vd mình cần ghi từ địa chỉ 0000 đến 1000 chẳng hạn, cần 1 cái địa chỉ cuối để so sánh theo mỗi 3 xung thì o bik phài xử lý sao

                        Code:
                        library ieee;
                        use ieee.std_logic_1164.all;
                        use ieee.std_logic_arith.all;
                        use ieee.std_logic_unsigned.all;
                        
                        --------------------------------------------------------------
                        entity Readram1 is
                        port(	clk : in std_logic;
                        		in_data: in std_logic_vector (15 downto 0);
                        		out_data:  out std_logic_vector ( 15 downto 0);
                        		rd_or_wr: out std_logic;
                        		address_receive: in std_logic_vector ( 17 downto 0);
                        		--address_end: in std_logic_vector (17 downto 0);
                        		address_read: out std_logic_vector ( 17 downto 0));
                        		
                        end Readram1;
                        
                        --------------------------------------------------------------
                        
                        architecture behav of Readram1 is
                        signal count: natural := 0;
                        signal temp: std_logic_vector ( 17 downto 0);
                        
                        begin
                        	process (clk)
                        		begin
                        			If rising_edge (clk) then
                        				count <= count + 1;
                        				If count = 3 then 
                        				count<= 1 ;
                        				end if;
                        			 end if;
                        		end process;
                        	
                        	process 
                        		begin
                        				temp <= address_receive;
                        		wait until count = 1;
                        				rd_or_wr <= '1';
                        				out_data <= in_data;
                        				temp <= temp +1;
                        --			if (temp = address_end) then
                        --			temp <= (others=>'0');
                        --				else
                        --				temp <=temp + 1;
                        --			end if;
                        
                        	end process;
                        		address_read <=temp;
                        end behav;
                        ------------------------------------


                        Mà như vậy, nếu được, thì cũng có phải là đã làm giảm tốc độ ghi của SRAM không nhỉ

                        Comment


                        • #27
                          @Milano: Ko hiểu ý bạn lắm

                          Comment


                          • #28
                            Ax, là vầy, cái hình tách màu nhá, coi như xung đó là xung hoạt động của cả hệ thống luôn. Cứ 3 xung thì mình mới tách được 2 điểm ảnh, ít nhất là phải xong 3 xung thì mới bắt đầu ghi SRAM được. Bên cạnh đó, SRAM cũng hoạt động theo xung đó, cứ mỗi xung là tự ghi vào 1 address, như vậy thì có phải là trong 3 xung đó sram sẽ ghi 3 lần dữ liệu giống nhau vào 3 ô address liên tiếp không??? Chưa kể là mình còn thắc mắc, do nhận 1 lúc là 3 yếu tố RGB của 2 điểm ảnh, nên buộc phải ghi liền cả 3 loại, mà trong khi minh đang tính lưu 3 dữ liệu vào 3 vùng địa chỉ riêng, vậy phải giải quyết sao đây >"<.
                            Tương tự, khi đưa vào VGA yêu cầu 3 chân RGB đồng thời, vậy làm sao SRAM có thể trong 1 xung mà cấp 3 địa chỉ của 3 vùng khác nhau mà lấy dữ liệu??
                            [Đây là hướng theo Mila nghĩ, nên có lẽ gặp khó khăn, NEO nếu có hướng xử lý khác thì cũng có thể chỉ dùm ^^]

                            Còn đoạn code này
                            Code:
                            library ieee;
                            use ieee.std_logic_1164.all;
                            use ieee.std_logic_arith.all;
                            use ieee.std_logic_unsigned.all;
                            
                            --------------------------------------------------------------
                            entity Readram1 is
                            port(	clk : in std_logic;
                            		in_data: in std_logic_vector (15 downto 0);
                            		out_data:  out std_logic_vector ( 15 downto 0);
                            		rd_or_wr: out std_logic;
                            		address_receive: in std_logic_vector ( 17 downto 0);
                            		--address_end: in std_logic_vector (17 downto 0);
                            		address_read: out std_logic_vector ( 17 downto 0));
                            		
                            end Readram1;
                            
                            --------------------------------------------------------------
                            
                            architecture behav of Readram1 is
                            signal count: natural := 0;
                            signal temp: std_logic_vector ( 17 downto 0);
                            
                            begin
                            	process (clk)
                            		begin
                            			If rising_edge (clk) then
                            				count <= count + 1;
                            				If count = 3 then 
                            				count<= 1 ;
                            				end if;
                            			 end if;
                            		end process;
                            	
                            	process 
                            		begin
                            				temp <= address_receive;
                            		wait until count = 1;
                            				rd_or_wr <= '1';
                            				out_data <= in_data;
                            				temp <= temp +1;
                            --			if (temp = address_end) then
                            --			temp <= (others=>'0');
                            --				else
                            --				temp <=temp + 1;
                            --			end if;
                            
                            	end process;
                            		address_read <=temp;
                            end behav;
                            Code này cũng là gán data và address tăng theo mỗi 3 xung clock, nhưng vd mình cần đọc khối Red chẳng hạn, được lưu từ địa chỉ 0000 đến 1000, thì khi address tăng đến 1000 (address_end) thì ngưng đọc, nếu đọc theo cạnh của clk bt thì không vấn đề gì,đơn giản chỉ là bộ đếm có giá trị cuối, nhưng giờ phải đọc theo từng 3 cạnh 1 nên viết quài mà vẫn o chạy đúng T.T

                            Comment


                            • #29
                              Cảm thấy là bạn bị lỗi gì đó trong thiết kế ... bạn vẽ thử hệ thống rồi up lên thử ..
                              ....
                              Ko nen xai wait until vì wait until có thể gặp lỗi khi tổng hợp để chạy trên board mạch.
                              ...
                              Nếu muốn tăng address mỗi 3 xung:
                              process(rst, clk)
                              if(rst='1') then
                              count <= (others=>'0'); elsif(rising_edge(clk)) then
                              if(count="10") then
                              count <= "00";
                              if(addr /= addr_end) addr <= addr+1; end if;
                              else
                              count <= count + '1';
                              end if;
                              end if;
                              end process;

                              Comment


                              • #30
                                Ax, ờ nhỉ >"<, đơn giản vầy mà Mila cứ viết vòng vòng. Viết riết rồi điên ^^"
                                Cái code Mila lại zầy
                                Code:
                                library ieee;
                                use ieee.std_logic_1164.all;
                                use ieee.std_logic_arith.all;
                                use ieee.std_logic_unsigned.all;
                                
                                --------------------------------------------------------------
                                entity Readram1 is
                                port(	clk : in std_logic;
                                		in_data: in std_logic_vector (15 downto 0);
                                		out_data:  out std_logic_vector ( 15 downto 0);
                                		rd_or_wr: out std_logic;
                                		address_receive: in std_logic_vector ( 17 downto 0);
                                		address_end: in std_logic_vector (17 downto 0);
                                		address_read: out std_logic_vector ( 17 downto 0));
                                		
                                end Readram1;
                                
                                --------------------------------------------------------------
                                
                                architecture behav of Readram1 is
                                signal count: natural := 0;
                                signal temp: std_logic_vector ( 17 downto 0):= address_receive;
                                
                                begin
                                
                                
                                	process (clk)
                                		begin
                                
                                			If rising_edge (clk) then
                                
                                				count <= count + 1;
                                				If count = 3 then 
                                				count<= 1 ;
                                				rd_or_wr <= '1';
                                				out_data <= in_data;
                                				If temp /= address_end then
                                				temp <= temp+ 1;
                                				else rd_or_wr <= '0';
                                				end if;
                                				end if;
                                			 end if;
                                		end process;
                                
                                		address_read <=temp;
                                end behav;
                                ------------------------------------
                                Mà, sao mà nhiều warning zậy hok bik, Mila viết ít khi nào 1 đoạn code đúng mà nhiều warning zậy ^^". (Mô phỏng thì không vấn đề gì)
                                Cái này nghĩa là gì nhỉ
                                Warning: No exact pin location assignment(s) for 88 pins of 88 total pins
                                Info: Pin out_data[0] not assigned to an exact location on the device
                                Info: Pin out_data[1] not assigned to an exact location on the device
                                ..
                                À mà có cách nào chia tần mà lẻ không, vd 60Hz mà chia xuống còn 20Hz chẳng hạn. Mila chỉ chia chẵn được thôi, chủ yếu là đếm cạnh xung lên rồi set mức 1, mức 0, nên chia lẻ thì không được (nó rớt ngay cạnh xuống, mà o thể xét 1 lúc 2 cạnh rising và falling 1 lúc được)

                                Comment

                                Về tác giả

                                Collapse

                                Milano Tìm hiểu thêm về Milano

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X