Thông báo

Collapse
No announcement yet.

Liên kết các files .vhd trong một project (VHDL)

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

  • Liên kết các files .vhd trong một project (VHDL)

    Phần cấu hình coniguration có lẻ để hậu xét, vì tui cố đọc thì càng thấy rối.
    Tui lại gặp một vấn đề như sau:
    Trong một số project tui thấy trong cùng một project có nhiều file .vhd được add cùng với nhau. Chẳn hạn project một con vi xử lí (uP) thì có các file .vhd như ALU.vhd, math.vhd,...Mấy bác cho hỏi là giả sử tui muốn tạo ra nhiều file .vhd trong cùng một project, mỗi file là một khối chức năng riêng (như một module con ), và 1 file .vhd chính ( tạm gọi là main.vhd) sẽ sử dụng các file con này để tạo ra một thiết kế hoàn chỉnh thì phải làm như thế nào ? Ta có thể mô phỏng từng file con riêng lẻ trước khi mô phỏng cả thiết kế lớn không, cách làm như thế nào ? Từ file chính (main.vhd) ta có thể gọi các hàm (function), thủ tục (procedure) đã được viết sẵn trong các file .vhd con có được không, có cần khái báo thêm gì không, chẳn hạn tên của một tín hiệu (signal) khai báo trong các file con khi ta sử dung lại trong file chính thì nó có hiểu không ?
    Tui đang làm tới chỗ này và bắt đầu bí, mong các bác chỉ dẫn.

  • #2
    Bạn có thể mô phỏng từng modul riêng lẻ. Để mô phỏng thì thông thường có hai phương pháp:
    - Phương pháp 1: bạn viết scripts định dạng các tín hiệu lối vào (hoặc dùng tính năng khai báo tín hiệu lối vào của phần mềm mô phỏng). Phương pháp này dùng cho các modul /thiết kế nhỏ.
    - Phương pháp 2: bạn xây dựng một testbench cho mô đun cần kiểm tra.

    Về việc liên kết các files .vhd của một dự án cũng có nhiều cách để liên kết:
    - Bạn có thể khai báo các module dưới dạng các components trong file mẹ (trong trường hợp của bạn là main.vhd). Sau đó bạn chỉ việc gọi nó ra và mapping là xong.
    - Một cách khác là bạn có thể tạo gói (package). Nếu bạn muốn sử dụng các thành phần trong gói thì bạn phải khai báo gói và gọi tên từng thành phần khi sử dụng.


    Comment


    • #3
      cảm ơn anh yesme@. Sao anh không để thảo luận của chúng ta trong cái thread cũ cho đủ tập, sau này mình có bộ sưu tập các câu hỏi luôn...
      Ý câu hỏi của em có phần khác với anh trả lời :
      Nếu ta sử dụng các components hay package thì các components hay package này phải viết chung trong một file thôi (file main.vhd). Ở đây em muốn nói là mình có nhiều file .vhd riêng biệt. Ví dụ cái project em up lên đây là một con CPU 32 bit, cái project này có nhiều file .vhd lắm. Và em muốn hỏi cách thức mình tạo ra nhiều file con như vậy, đương nhiên là em ko có ý định làm cả con CPU như zậy đâu
      (file đính kem: Design CPU 32 bit by VHDL)
      Attached Files

      Comment


      • #4
        Bạn có thể tạo bao nhiêu file .vhd cũng được. Số file .vhd chỉ thuộc về vấn đề tổ chức thiết kế của bạn mà thôi. Tổ chức làm sao cho khoa học và tiện lợi khi tái sử dụng.
        Về việc liên kết thì mình đã nói ở trên.


        Comment


        • #5
          Nguyên văn bởi yesme@ Xem bài viết
          Bạn có thể tạo bao nhiêu file .vhd cũng được. Số file .vhd chỉ thuộc về vấn đề tổ chức thiết kế của bạn mà thôi. Tổ chức làm sao cho khoa học và tiện lợi khi tái sử dụng.
          Về việc liên kết thì mình đã nói ở trên.
          Nhưng theo tui được biết (tức không chắc lắm ) thì chỉ có mỗi cách PORT MAP là có thể dùng để liên kết các file vhd trong 1 project lại với nhau thôi, trong cái project về CPU 32 bit họ cũng dùng PORT MAP thôi.
          Bác yesme@ thấy có đúng không nhỉ ?

          Comment


          • #6
            Thay vì khai báo component và instantiate: U_pcimem: pcimem port map, bạn cũng có thể instantiate thẳng: U_pcimem: entity work.pcimem(rtl) port map. Work = default library, thay đổi cho phù hợp với tên library của bạn (nếu bạn để module vào library).

            Signal chỉ dùng trong module của nó thôi.

            Comment


            • #7
              Nguyên văn bởi nemesis21 Xem bài viết
              Thay vì khai báo component và instantiate: U_pcimem: pcimem port map, bạn cũng có thể instantiate thẳng: U_pcimem: entity work.pcimem(rtl) port map. Work = default library, thay đổi cho phù hợp với tên library của bạn (nếu bạn để module vào library).

              Signal chỉ dùng trong module của nó thôi.
              Tui chưa hiểu ý này cho lắm, bác có thể minh họa bằng ví dụ cụ thể được không ạ ?

              Bác cho hỏi là chúng ta có thể đặt PORT MAP vào bên trong process được không vậy,
              chẳn hạn như:
              process
              begin

              U1 : my_work PORT MAP (x,y,z) ;
              ...
              end process ;
              Last edited by thavali; 27-06-2007, 14:51.

              Comment


              • #8
                Nguyên văn bởi thavali Xem bài viết
                Tui chưa hiểu ý này cho lắm, bác có thể minh họa bằng ví dụ cụ thể được không ạ ?

                Bác cho hỏi là chúng ta có thể đặt PORT MAP vào bên trong process được không vậy,
                chẳn hạn như:
                process
                begin

                U1 : my_work PORT MAP (x,y,z) ;
                ...
                end process ;
                Đó chỉ là 2 cách port map với một mục đích như nhau thôi. Người nào thích dùng cách nào thì dùng. Dùng components thì phải khai báo, còn dùng instantiate thì không cần vì mình chỉ rõ nó ở đâu rồi.(U1: entity work.grabber_image(rtl) port map( ...))

                Ví dụ với components
                Trước tiên phải khai báo:
                COMPONENT sramctl
                PORT(
                clk_i : IN std_logic;
                rst_i : IN std_logic;
                adr_i : IN std_logic_vector(31 downto 0);
                dat_i : IN std_logic_vector(31 downto 0);
                stb_i : IN std_logic;
                we_i : IN std_logic;

                ......
                );
                END COMPONENT;
                Sau đó thì port map nó trong phần BEGIN ... END của architecture:
                Inst_sramctl: sramctl PORT MAP(
                clk_i => ,
                rst_i => ,
                adr_i => ,
                dat_i => ,
                dat_o => ,
                ack_o => ,
                stb_i => ,
                we_i => ,

                ....
                );

                Còn nếu bạn dùng cách kia thì dùng luôn trong phần BEGIN ... END của architecture, không cần khai báo với điều kiện thực thể này ở trong thư viện work)
                sramctl : entity work.sramctl
                generic map( num_write_waits => 0, num_read_waits => 0 )
                port map ( clk_i => clk,
                rst_i => rst,
                adr_i => adr_i_s,
                dat_i => dwr,
                dat_o => dat_o_s0,
                ...
                );

                Mình không hiểu bạn đang làm gì mà lại cho một component vào trong process vậy?? Theo mình đuợc biết thì không được!
                It's not a BUG, it's a FEATURE!

                Comment


                • #9
                  Nguyên văn bởi thavali Xem bài viết
                  Phần cấu hình coniguration có lẻ để hậu xét, vì tui cố đọc thì càng thấy rối.
                  Tui lại gặp một vấn đề như sau:
                  Trong một số project tui thấy trong cùng một project có nhiều file .vhd được add cùng với nhau. Chẳn hạn project một con vi xử lí (uP) thì có các file .vhd như ALU.vhd, math.vhd,...Mấy bác cho hỏi là giả sử tui muốn tạo ra nhiều file .vhd trong cùng một project, mỗi file là một khối chức năng riêng (như một module con ), và 1 file .vhd chính ( tạm gọi là main.vhd) sẽ sử dụng các file con này để tạo ra một thiết kế hoàn chỉnh thì phải làm như thế nào ? Ta có thể mô phỏng từng file con riêng lẻ trước khi mô phỏng cả thiết kế lớn không, cách làm như thế nào ? Từ file chính (main.vhd) ta có thể gọi các hàm (function), thủ tục (procedure) đã được viết sẵn trong các file .vhd con có được không, có cần khái báo thêm gì không, chẳn hạn tên của một tín hiệu (signal) khai báo trong các file con khi ta sử dung lại trong file chính thì nó có hiểu không ?
                  Tui đang làm tới chỗ này và bắt đầu bí, mong các bác chỉ dẫn.

                  Tốt nhất bạn lên đọc hoàn chỉnh một cuốn sách về VHDL đi. Nếu đọc rồi thì bạn sẽ hiều ngay thôi. Vì đây là các quy tắc cơ bản của VHDL.

                  Nếu bạn cần tài liệu thì mình sẽ gửi cho.
                  It's not a BUG, it's a FEATURE!

                  Comment


                  • #10
                    Còn nếu bạn dùng cách kia thì dùng luôn trong phần BEGIN ... END của architecture, không cần khai báo với điều kiện thực thể này ở trong thư viện work)
                    sramctl : entity work.sramctl
                    generic map( num_write_waits => 0, num_read_waits => 0 )
                    port map ( clk_i => clk,
                    rst_i => rst,
                    adr_i => adr_i_s,
                    dat_i => dwr,
                    dat_o => dat_o_s0,
                    ...
                    );
                    "thực thể này ở trong thư viện work" là thế nào vậy bác, bác có thể giải thích rõ hơn không ?
                    generic map( num_write_waits => 0, num_read_waits => 0 )
                    : cái generic map có ý nghĩa như thế nào vậy bác, tui chưa hiểu genericgeneric map là gì mặc dù đã đọc sách rồi . Bác giải thích giúp nhé .

                    Comment


                    • #11
                      Nguyên văn bởi thavali Xem bài viết
                      "thực thể này ở trong thư viện work" là thế nào vậy bác, bác có thể giải thích rõ hơn không ?
                      generic map( num_write_waits => 0, num_read_waits => 0 )
                      : cái generic map có ý nghĩa như thế nào vậy bác, tui chưa hiểu genericgeneric map là gì mặc dù đã đọc sách rồi . Bác giải thích giúp nhé .
                      Nếu bạn dùng ISE thì khi thêm một file mới vào thì file này đã thuộc trong thư viện mặc định của project.

                      Generic là các thông số được sử dụng để chuyển thông tin vào trong các thực thể.
                      Last edited by traidot; 29-06-2007, 17:06.
                      It's not a BUG, it's a FEATURE!

                      Comment


                      • #12
                        Nguyên văn bởi thavali Xem bài viết
                        generic map( num_write_waits => 0, num_read_waits => 0 )
                        : cái generic map có ý nghĩa như thế nào vậy bác, tui chưa hiểu genericgeneric map là gì mặc dù đã đọc sách rồi . Bác giải thích giúp nhé .
                        Generic map là một cú pháp của VHDL thực hiện việc mapping các thông số cụ thể vào một design dạng generic của bạn.
                        Ví dụ, bạn đã design một thanh ghi N bits. Bây giờ bạn muốn sử dụng design đó để tạo một thanh ghi 8 bit thì bạn cần map thông số độ dài của thanh ghi N = 8.


                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X