Thông báo

Collapse
No announcement yet.

VGA trên DE2

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

  • VGA trên DE2

    mình đang làm đề tài hiển thị ảnh lên monitor thông qua VGA của kit DE2 mà ko biết làm thế nào. mình đọc tài liệu mà cũng chưa hiểu lắm. bạn nào đã làm rồi có thể hướng dẫn cho mình được không? thanks nhiều nhiều

  • #2
    Câu hỏi khá thú vị. Chắc bạn học BK TpHCM nhỉ. Trong trường có nhiều đề tài này lắm. Bạn nên mượn đề tài LV ở phòng bộ môn điện tử (203B3). Có nhiều lắm. hihi

    Comment


    • #3
      Nguyên văn bởi ruaconb52 Xem bài viết
      mình đang làm đề tài hiển thị ảnh lên monitor thông qua VGA của kit DE2 mà ko biết làm thế nào. mình đọc tài liệu mà cũng chưa hiểu lắm. bạn nào đã làm rồi có thể hướng dẫn cho mình được không? thanks nhiều nhiều
      Chào ruacon, mình cũng đang thực hiện đề tài này, và mình cũng đang bí, có gì chúng ta cùng trao đổi để hoàn thành tốt nó nhé.
      Bạn có thể cho mình mail để tiện trao đổi không. Hoặc bạn liên lạc với mình qua email : a.nguyen.mh@gmail.com

      Comment


      • #4
        cảm ơn các bạn nhiều. mình học bên SPKT. bạn nào học BK có tài liệu về VGA của DE2 thì cho mình xin nha. tiếng việt càng tốt.

        Comment


        • #5
          mình có code này ko có lỗi nhưng gắn monitor thì ko chạy được. bạn nào phát hiện lỗi thì cho mình biết nha.

          LIBRARY ieee;
          USE ieee.std_logic_1164.ALL;
          USE ieee.numeric_std.ALL;
          ENTITY vga IS
          PORT (CLOCK_50 : IN std_logic; --50Mhz clock
          KEY : IN std_logic_vector(3 downto 0); --RESET
          VGA_B: OUT std_logic_vector(9 downto 0);
          VGA_R: OUT std_logic_vector(9 downto 0);
          VGA_G: OUT std_logic_vector(9 downto 0);
          VGA_CLK : OUT std_logic;
          VGA_BLANK :OUT std_logic; --active low
          VGA_SYNC : OUT std_logic;
          VGA_HS : OUT std_logic;
          VGA_VS : OUT std_logic);
          END vga;

          ARCHITECTURE vg OF vga IS
          SIGNAL line_fin : std_logic; --variable to determine if a line has finished drawing
          SIGNAL line_count : integer; --variable for counting the amount of lines drawn
          SIGNAL frame_fin : std_logic; --variable to determine if a frame had finished drawing
          SIGNAL CLOCK_25 : std_logic; --25Mhz clock
          CONSTANT P1 : integer := 24; --Front porch (horizontal)
          CONSTANT P2 : integer := 48; --Back porch (horizontal)
          CONSTANT HSYNC_TIME : integer := 95; -- H_Sync pulse lenght
          CONSTANT V1 : integer := 11250; --Front porch (vertical)
          CONSTANT V2 : integer := 25500; --Back porch (vertical)
          CONSTANT VSYNC_TIME : integer := 1600; -- V_Sync pulse lenght
          BEGIN
          VGA_SYNC<= '0';

          pixel_draw : PROCESS(CLOCK_25,KEY(0)) --for drawing pixels and generating blank pulses
          VARIABLE hcount : INTEGER := 0;
          VARIABLE vcount : INTEGER := 0;
          BEGIN
          IF KEY(0)= '0' THEN
          hcount := 0;
          vcount := 0;
          line_fin <= '0';
          frame_fin <= '0';
          line_count <= 0;
          VGA_BLANK <= '1';
          ELSIF rising_edge(CLOCK_25) THEN
          IF line_count < 480 THEN
          IF hcount < 640 THEN
          VGA_R <= "1111111111";--send pixel information each clock_cycle
          VGA_B <= "0000000000";
          VGA_G <= "0000000000";
          VGA_BLANK <= '1';
          hcount := hcount+1;
          line_fin <= '0';
          ELSIF hcount = 640 THEN
          line_fin <= '1'; --line finished, pulse line_fin and start blank pulse
          hcount := hcount+1;
          VGA_BLANK <= '0';
          ELSIF hcount >640 and hcount <= 640+P1+HSYNC_TIME+P2 THEN
          hcount := hcount+1;--keep blank pulse low for a set amount of time
          line_fin <= '0';
          VGA_BLANK <= '0';
          ELSE
          hcount := 1; --reset counters and increment line_counter
          line_count <= line_count+1;
          END IF;
          ELSIF line_count = 480 THEN
          IF vcount < 1 THEN --frame is finished; pulse frame_fin and initiate vertical blank pulse
          vcount := vcount+1;
          VGA_BLANK <= '0';
          frame_fin <= '1';
          ELSIF vcount >= 1 and vcount < V1+V2+VSYNC_TIME THEN
          vcount := vcount+1; --keep blank pulse low for a set amount of time
          frame_fin <= '0';
          VGA_BLANK <= '0';
          ELSE
          vcount := 0; -- reset counters and line_counter
          VGA_BLANK <= '1';
          line_count <= 0;
          END IF;
          END IF;
          END IF;
          END PROCESS;

          horizontal_synchronisation : PROCESS(CLOCK_25,KEY(0))
          VARIABLE hsync_counter : INTEGER := 0;
          VARIABLE hsync_started : INTEGER := 0;
          BEGIN
          IF KEY(0)= '0' THEN
          VGA_HS <= '1';
          hsync_counter := 0;
          hsync_started := 0;
          ELSIF rising_edge(CLOCK_25) THEN
          IF line_fin = '1' or hsync_started = 1 THEN
          hsync_started:= 1;
          IF hsync_counter <= P1 THEN
          hsync_counter := hsync_counter+1;--hsync stays high during front porch
          VGA_HS <= '1';
          ELSIF hsync_counter >= P1-1 and hsync_counter <= HSYNC_TIME+P1 THEN
          hsync_counter := hsync_counter+1;--hsync activated
          VGA_HS <= '0';
          ELSIF hsync_counter >= HSYNC_TIME+P1-1 and hsync_counter < HSYNC_TIME+P1+P2 THEN
          hsync_counter := hsync_counter+1;--hsync stays high during back porch
          VGA_HS <= '1';
          ELSE
          hsync_counter := 0;--reset variables and counters
          VGA_HS <= '1';
          hsync_started := 0;
          END IF;
          ELSE
          VGA_HS <= '1';
          END IF;
          END IF;
          END PROCESS;

          vertical_synchronisation : PROCESS(CLOCK_25,KEY(0))
          VARIABLE vsync_counter : INTEGER := 0;
          VARIABLE vsync_started : INTEGER := 0;
          BEGIN
          IF KEY(0) = '0' THEN
          VGA_VS <= '1';
          vsync_counter := 0;
          vsync_started := 0;
          ELSIF rising_edge(CLOCK_25) THEN
          IF frame_fin = '1' or vsync_started = 1 THEN
          vsync_started := 1;
          IF vsync_counter < V1-1 THEN
          vsync_counter := vsync_counter+1;
          VGA_VS <= '1';
          ELSIF vsync_counter >= V1-1 and vsync_counter < VSYNC_TIME+V1-1 THEN
          vsync_counter := vsync_counter+1;
          VGA_VS <= '0';
          ELSIF vsync_counter >= VSYNC_TIME+V1-1 and vsync_counter < VSYNC_TIME+V1+V2 THEN
          vsync_counter := vsync_counter+1;
          VGA_VS <= '1';
          ELSE
          vsync_counter := 0;
          VGA_VS <= '1';
          vsync_started := 0;
          END IF;
          ELSE
          VGA_VS <= '1';
          END IF;
          END IF;
          END PROCESS;

          vga_clk_gen : PROCESS(CLOCK_50,KEY(0))--devides 50MHz clock in 2, making it a 25MHz clock
          VARIABLE count : INTEGER := 0;
          BEGIN
          IF KEY(0)= '0' THEN
          CLOCK_25 <= '0';
          VGA_CLK <= '0';
          count := 0;
          ELSIF rising_edge(CLOCK_50) THEN
          IF count = 0 THEN
          CLOCK_25 <= '1'; --1 period of 50MHz high
          VGA_CLK <= '1';
          count := 1;
          ELSIF count = 1 THEN
          CLOCK_25 <= '0'; --1 period of 50MHz low
          VGA_CLK <= '0';
          count := 0;
          END IF;
          END IF;
          END PROCESS;
          END vg;

          Comment


          • #6
            mình có code này ko có lỗi nhưng gắn monitor thì ko chạy được. bạn nào phát hiện lỗi thì cho mình biết nha.

            LIBRARY ieee;
            USE ieee.std_logic_1164.ALL;
            USE ieee.numeric_std.ALL;
            ENTITY vga IS
            PORT (CLOCK_50 : IN std_logic; --50Mhz clock
            KEY : IN std_logic_vector(3 downto 0); --RESET
            VGA_B: OUT std_logic_vector(9 downto 0);
            VGA_R: OUT std_logic_vector(9 downto 0);
            VGA_G: OUT std_logic_vector(9 downto 0);
            VGA_CLK : OUT std_logic;
            VGA_BLANK :OUT std_logic; --active low
            VGA_SYNC : OUT std_logic;
            VGA_HS : OUT std_logic;
            VGA_VS : OUT std_logic);
            END vga;

            ARCHITECTURE vg OF vga IS
            SIGNAL line_fin : std_logic; --variable to determine if a line has finished drawing
            SIGNAL line_count : integer; --variable for counting the amount of lines drawn
            SIGNAL frame_fin : std_logic; --variable to determine if a frame had finished drawing
            SIGNAL CLOCK_25 : std_logic; --25Mhz clock
            CONSTANT P1 : integer := 24; --Front porch (horizontal)
            CONSTANT P2 : integer := 48; --Back porch (horizontal)
            CONSTANT HSYNC_TIME : integer := 95; -- H_Sync pulse lenght
            CONSTANT V1 : integer := 11250; --Front porch (vertical)
            CONSTANT V2 : integer := 25500; --Back porch (vertical)
            CONSTANT VSYNC_TIME : integer := 1600; -- V_Sync pulse lenght
            BEGIN
            VGA_SYNC<= '0';

            pixel_draw : PROCESS(CLOCK_25,KEY(0)) --for drawing pixels and generating blank pulses
            VARIABLE hcount : INTEGER := 0;
            VARIABLE vcount : INTEGER := 0;
            BEGIN
            IF KEY(0)= '0' THEN
            hcount := 0;
            vcount := 0;
            line_fin <= '0';
            frame_fin <= '0';
            line_count <= 0;
            VGA_BLANK <= '1';
            ELSIF rising_edge(CLOCK_25) THEN
            IF line_count < 480 THEN
            IF hcount < 640 THEN
            VGA_R <= "1111111111";--send pixel information each clock_cycle
            VGA_B <= "0000000000";
            VGA_G <= "0000000000";
            VGA_BLANK <= '1';
            hcount := hcount+1;
            line_fin <= '0';
            ELSIF hcount = 640 THEN
            line_fin <= '1'; --line finished, pulse line_fin and start blank pulse
            hcount := hcount+1;
            VGA_BLANK <= '0';
            ELSIF hcount >640 and hcount <= 640+P1+HSYNC_TIME+P2 THEN
            hcount := hcount+1;--keep blank pulse low for a set amount of time
            line_fin <= '0';
            VGA_BLANK <= '0';
            ELSE
            hcount := 1; --reset counters and increment line_counter
            line_count <= line_count+1;
            END IF;
            ELSIF line_count = 480 THEN
            IF vcount < 1 THEN --frame is finished; pulse frame_fin and initiate vertical blank pulse
            vcount := vcount+1;
            VGA_BLANK <= '0';
            frame_fin <= '1';
            ELSIF vcount >= 1 and vcount < V1+V2+VSYNC_TIME THEN
            vcount := vcount+1; --keep blank pulse low for a set amount of time
            frame_fin <= '0';
            VGA_BLANK <= '0';
            ELSE
            vcount := 0; -- reset counters and line_counter
            VGA_BLANK <= '1';
            line_count <= 0;
            END IF;
            END IF;
            END IF;
            END PROCESS;

            horizontal_synchronisation : PROCESS(CLOCK_25,KEY(0))
            VARIABLE hsync_counter : INTEGER := 0;
            VARIABLE hsync_started : INTEGER := 0;
            BEGIN
            IF KEY(0)= '0' THEN
            VGA_HS <= '1';
            hsync_counter := 0;
            hsync_started := 0;
            ELSIF rising_edge(CLOCK_25) THEN
            IF line_fin = '1' or hsync_started = 1 THEN
            hsync_started:= 1;
            IF hsync_counter <= P1 THEN
            hsync_counter := hsync_counter+1;--hsync stays high during front porch
            VGA_HS <= '1';
            ELSIF hsync_counter >= P1-1 and hsync_counter <= HSYNC_TIME+P1 THEN
            hsync_counter := hsync_counter+1;--hsync activated
            VGA_HS <= '0';
            ELSIF hsync_counter >= HSYNC_TIME+P1-1 and hsync_counter < HSYNC_TIME+P1+P2 THEN
            hsync_counter := hsync_counter+1;--hsync stays high during back porch
            VGA_HS <= '1';
            ELSE
            hsync_counter := 0;--reset variables and counters
            VGA_HS <= '1';
            hsync_started := 0;
            END IF;
            ELSE
            VGA_HS <= '1';
            END IF;
            END IF;
            END PROCESS;

            vertical_synchronisation : PROCESS(CLOCK_25,KEY(0))
            VARIABLE vsync_counter : INTEGER := 0;
            VARIABLE vsync_started : INTEGER := 0;
            BEGIN
            IF KEY(0) = '0' THEN
            VGA_VS <= '1';
            vsync_counter := 0;
            vsync_started := 0;
            ELSIF rising_edge(CLOCK_25) THEN
            IF frame_fin = '1' or vsync_started = 1 THEN
            vsync_started := 1;
            IF vsync_counter < V1-1 THEN
            vsync_counter := vsync_counter+1;
            VGA_VS <= '1';
            ELSIF vsync_counter >= V1-1 and vsync_counter < VSYNC_TIME+V1-1 THEN
            vsync_counter := vsync_counter+1;
            VGA_VS <= '0';
            ELSIF vsync_counter >= VSYNC_TIME+V1-1 and vsync_counter < VSYNC_TIME+V1+V2 THEN
            vsync_counter := vsync_counter+1;
            VGA_VS <= '1';
            ELSE
            vsync_counter := 0;
            VGA_VS <= '1';
            vsync_started := 0;
            END IF;
            ELSE
            VGA_VS <= '1';
            END IF;
            END IF;
            END PROCESS;

            vga_clk_gen : PROCESS(CLOCK_50,KEY(0))--devides 50MHz clock in 2, making it a 25MHz clock
            VARIABLE count : INTEGER := 0;
            BEGIN
            IF KEY(0)= '0' THEN
            CLOCK_25 <= '0';
            VGA_CLK <= '0';
            count := 0;
            ELSIF rising_edge(CLOCK_50) THEN
            IF count = 0 THEN
            CLOCK_25 <= '1'; --1 period of 50MHz high
            VGA_CLK <= '1';
            count := 1;
            ELSIF count = 1 THEN
            CLOCK_25 <= '0'; --1 period of 50MHz low
            VGA_CLK <= '0';
            count := 0;
            END IF;
            END IF;
            END PROCESS;
            END vg;

            Comment


            • #7
              Hi ruacon52,

              Khi bạn chạy trên KIT DE2, bạn có để ý đèn màng hình không? Thông thường nếu nó chớp tắt (Màng hình VGA, không phải LCD nha) thì phần đồng bộ có vấn đề. Trên đĩa DE2 system (đi kèm với KIT) có một số phần demo liên quan đến VGA (Không nhớ rõ là viết bằng VHDL hay Verilog HDL), bạn có thể tham khảo. Còn thông số để setup cho VGA thì bạn có thể tham khảo những trang web mà bạn ToanXT đã đưa ra trong http://dientuvietnam.net/forums/showthread.php?t=29283.

              Chúc bạn thành công.

              Comment


              • #8
                Mình cũng đang làm đề tài này nhưng chỉ dừng ở mức mới giao tiếp được với monitor.Hiện nay mình đang muốn hiển thị 1 ảnh RGB 256x256x24 từ SRAM lên VGA nhưng chưa được.Lúc hiển thị thì chỉ hiện ra được 1 khung hình 256x256 nhưng toàn nhiễu.Mình thực hiện theo cách sau,sai chỗ nào xin mọi người chỉ giúp.
                -Một pixel được lưu bằng 2 words (16bit) của SRAM.words có địa chỉ chẵn sẽ lưu giá trị của R và G,byte có địa chỉ lẻ lưu giá trị của B dưới dạn 00B.
                -Địa chỉ truy xuất Sram được cập nhật liên tục bằng xung clock 50mhz,dựa vào tọa độ của pixel cần hiển thị.Dùng thêm 1 clk 25mhz để xác định là địa chỉ lẻ hoặc địa chỉ chẵn.

                Comment


                • #9
                  Làm vậy hình bị nhiễu là đúng rồi. Vì yêu cầu bạn phải xuất đồng thời 24 bit màu. Chứ không phải xuất tùng màu như bạn. Mà SRAM thì chỉ có 16 bit. Vậy sao bây giờ???
                  Bạn dùng SRAM là đúng. Cái này sẽ hiển thị tốt cho ảnh 16 bit màu. Để hiển thị ảnh 24 bit màu bạn có thể kết hợp hai bộ RAM. Một bộ RAM có trong FPGA và một là SRAM.
                  SRAM chứa dữ liệu của RG.
                  FPGA RAM chứa dữ liệu B. (hoặc thay đổi khác đi chút cũng được). Vậy thì có thể xuất đồng thời cả ba màu rồi.
                  Cái này năm ngoái tôi làm rồi. Chạy good lắm. Nhưng hình như chỉ làm ở kích thước 100x100 thôi. Vì giớ hạn của bộ RAM trong FPGA.
                  Thân chào.

                  Comment


                  • #10
                    bạn phuongnhoc làm rồi có thể share chương trình cho mình được không? mình cũng đang làm về hiển thị ảnh chứa trong sdram ra màn hình. giờ vẫn chưa biết quy trình làm như thế nào? bạn có thể hướng dẫn kĩ hơn chút được không?
                    địa chỉ mail của mình là ngobaviet@gmail.com.
                    thanks bạn nhiều

                    Comment


                    • #11
                      Oh`. Bạn làm hiển thị ảnh tư` SDRAM à. Đã giao tiếp được với SDRAM chưa.
                      Sorry mình không thể cho bạn code được. Nếu bạn cần hướng dẫn làm đề tài LV này thì có thể liên hệ với mình. Mình đã làm thành công đề tài
                      + Trình diễn ảnh từ SD_card,.
                      + Xử lý ảnh (các phương pháp lọc ảnh)". Chuẩn ảnh 24 bit màu.
                      + Game with DE2 KIT
                      Nếu bạn nào cần hướng dẫn lv có thể liên hệ mình qua email: nguyentrungkien31111@yahoo.com
                      or 090 707 1167

                      Comment


                      • #12
                        Hi,

                        Dùng SRAM 256x16bit trên DE2 thì bạn cho chạy 50MHz. Do 1 pixel phải được xác định trong 1 chu kỳ 25MHz tức là 2 lần chu kỳ 50MHz. Như vậy 1 xung clock 25MHz thì bạn phải có 24bit màu (đúng hơn là 10x3 = 30 bit) => 1pixel phải dùng 2words <=> 32 bits hay truy xuất SRAM 2 lần và sử dụng chế độ 16bits. Như vậy màng hình rộng nhất có thể là 256x512 (RGB) (Còn vời ảnh mức xám thì đơn giản hơn nhiều vì R=G=B, như thế bạn sẽ giảm dụng lượng ô nhớ xuống 3 lần hay bạn có thể lưu ảnh lớn hơn). (Thật ra có thể rộng hơn chút nữa nhưng không cần thiết phải làm như thế). Cái mình nói trên đây chỉ là ảnh tỉnh thôi nha! Còn với Video thì làm cách khác. Nếu bạn muốn màng hình có độ phân giải cao hơn thì bạn có thể dùng SDRAM nhưng như thế bạn phải làm SDRAM Controller để giao tiếp với SDRAM, cái này thì không khó nhưng sẽ làm bạn mất thời gian đó.

                        Hi vong những thông tin này giúp ích cho các bạn muốn hiển thị ảnh tỉnh trên VGA dùng kit De2.

                        Comment


                        • #13
                          Làm như Danbeo85 thì mình chưa thử. Vì sợ các lý do sau:
                          + Cần chuẩn bị sẳn 24 bit màu trước khi có cạnh lên xung Clock để đưa vào VGA. Vì ngay cạnh lên của xung Clock 24bit dữ liệu sẽ được chuyển vào thanh ghi đệm của VGA chip.
                          + 24 bit cần được cấp đồng thời. Do vậy bạn cần có cách thanh ghi để chốt dữ liệu cho 2 byte cao và hai byte thấp.
                          + Tính toán timming và latency cẩn thận.
                          => có vẻ dùng tần số 100Mhz sẽ dễ điều khiẻn hơn vì có dư thời gian cho việc xuất dữ liệu.
                          Chỉ là lý thuyết thôi. Mình chưa thực hiện nên không chắc.

                          P/s Danbeo85: Hồi xưa làm SDRAM controller chưa vậy. Chỉ cho mình hướng giải quyết với. Sắp tậu được cái kit DE2 rồi.

                          Comment


                          • #14
                            cảm ơn các bạn đã hướng dẫn.
                            bạn danbeo85 có thể hướng dẫn rõ hơn về sdram controller được không? mình đang định làm về cái này

                            Comment


                            • #15
                              SDR SDRAM Controller (Mình không đề cập đến DDR nha!)là một đề tài khác bạn ơi! Nhưng thật ra nó không quá khó để làm.
                              1) Bạn tìm hiểu cấu tạo DRAM và SDRAM nói chung để biết được cái khác biệt với SRAM là gì!
                              2) Tham khảo chuẩn JDEC về SDRAM (nếu không thể tìm được thì bạn có thể xem datasheet của các hãng làm SDRAM như Micron, Samsung, ... Nếu bạn có tài datasheet của SDRAM trên KIT DE2 thì cũng OK) để biết:
                              a) Những chân dùng để giao tiếp với SDRAM
                              b) Sơ đồ máy trạng thái của SDRAM
                              c) Các độ trễ cần thiết giữa các lệnh
                              3) Khi mô phỏng bộ điều khiễn bạn nên dùng SDRAM model của MICRON để mô phỏng nha vì cái này miễn phí và không bị mã hóa (SAMSUNG bị mã hóa). Các model sẽ đi cùng datasheet của SDRAM. Một lưu ý nhỏ là các model này đã kèm độ trễ nên khi mô phỏng chức năng của bộ điều khiển, bạn nhớ bỏ qua các báo lỗi về vấn đề này, bạn chỉ nên để ý đến các báo lỗi về chức năng thôi.
                              4) Tổng hợp và mô phỏng timing (mô phỏng có độ trễ). Tại thời điểm này thì sẽ không còn bất cứ lỗi nào được phép xảy ra nha!
                              5) Lưu ý: Bạn nên dùng một chuẩn giao tiếp thông dụng để viết lớp vỏ ngoài cho bộ điều khiển (Avalon Memory Map, AMBA AHB, ...) như thế sẽ thuận tiện trong việc gắng bộ điều khiển vào hệ thống.

                              Hi vọng những điều trên sẽ có ích cho bạn. Chúc bạn thành công!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X