Thông báo

Collapse
No announcement yet.

Sự khác nhau giữa biến và tín hiệu trong lập trình VHDL !

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

  • Sự khác nhau giữa biến và tín hiệu trong lập trình VHDL !

    Thông thường khi lập trình VHDL ,nhiều người rất hay nhầm lẫn giữa biến(variable) và tín hiệu (signal) .Mặc dù chưởng trình có thể viết đúng nhưng khi tổng hợp lại không được ?
    Xin mời các bạn cho ý kiến để phân biệt sự khác nhau giữa hai cách sử dụng này ?

  • #2
    Nguyên văn bởi lythanhthuan Xem bài viết
    Thông thường khi lập trình VHDL ,nhiều người rất hay nhầm lẫn giữa biến(variable) và tín hiệu (signal) .Mặc dù chưởng trình có thể viết đúng nhưng khi tổng hợp lại không được ?
    Xin mời các bạn cho ý kiến để phân biệt sự khác nhau giữa hai cách sử dụng này ?
    Đôi khi tổng hợp không được vì variable không phản ánh được bản chất vật lý của mạch điện,tốn tài nguyên,thậm chí đôi khi không thể tổng hợp.

    Khác nhau chủ yếu là : signal có thể xuất hiện toàn cục,có mặt trong danh sách nhạy,giá trị chỉ thay đổi trong tương lai sau một khoảng thời gian delta(lệnh after vô hiệu khi tổng hợp). Variable chỉ xuất hiện cục bộ trong 1 tiến trình,không thể có trong danh sách nhạy,giá trị thay đổi là tức thời.

    Dùng signal khả năng tổng hợp cao hơn,thiết kế sẽ được thể hiện mạch lạc hơn nếu dùng signal,variable hiệu quả hơn khi mô phỏng,kém hiệu quả khi muốn tổng hợp.

    Comment


    • #3
      ban chi co the su dung các biến trong các process
      còn các signal co the sử dụng toàn cục.
      điểm chú ý khi sử dụng biến (variable) và tín hiệu (signal) trong process là các có thể nhận ngay giá trị sau khi gán còn tín hiệu chỉ gán tín hiệu sau khi process dã kết thúc. Điều này nên đặc biệt chú ý khi sử dụng các biến và tín hiệu trong process.

      Comment


      • #4
        Tín hiệu (signal) được dùng để kết nối các componens với nhau còn biến (variable) được dùng để tính toán một vài giá trị cụ thể nào đó trong một tiến trình (process).

        Chú ý đến thời gian ghi và đọc tín hiệu khi thực hiện các thao tác !!!


        Comment


        • #5
          khi bạn khai báo sử dụng một tín hiệu, bạn đang nói với chương trình là bạn cần một thanh ghi để cất giá trị vào, còn nếu bạn khai báo nó là biến, nó chỉ là một đường nối trung gian giữa các component.

          Comment


          • #6
            Nguyên văn bởi neo Xem bài viết
            khi bạn khai báo sử dụng một tín hiệu, bạn đang nói với chương trình là bạn cần một thanh ghi để cất giá trị vào, còn nếu bạn khai báo nó là biến, nó chỉ là một đường nối trung gian giữa các component.
            ???mới nghe lần đầu,hình như u nói ngược thì phải .

            Comment


            • #7
              Nguyên văn bởi neo:
              khi bạn khai báo sử dụng một tín hiệu, bạn đang nói với chương trình là bạn cần một thanh ghi để cất giá trị vào, còn nếu bạn khai báo nó là biến, nó chỉ là một đường nối trung gian giữa các component.


              Nguyên văn bởi TheKing:
              ???mới nghe lần đầu,hình như u nói ngược thì phải


              vậy rốt cục thì ai đúng vậy, các bác có thể minh họa 1 cách cụ thể sự khác nhau giữa biến và tín hiệu ko vậy?. Em thì thấy nó hơi giống nhau, cái nào cũng cần tài nguyên cả (thanh ghi,cổng,...).

              Comment


              • #8
                xin gởi cái chỉ dẫn của tác giả Douglas L. Perry trong cuốn :"VHDL:Programming by Example" ,xin các bác góp ý.
                Signal Assignment Versus Variable Assignment

                The first statement inside of the process statement is a variable assignment
                that assigns a value to variable temp. In the previous chapter, we
                discussed how signals received values that were scheduled either after
                an amount of time or after a delta delay. A variable assignment happens
                immediately when the statement is executed. For instance, in this
                model, the first statement has to assign a value to variable temp for the
                second statement to use. Variable assignment has no delay; it happens
                immediately.
                sơ đồ khối (Dấu * thay cho khoảng trắng)

                **---------------
                --| I0********|
                **|********* |--Q
                --| I1******* |
                **|**********|
                --| I2********|
                **|**********|
                --| I3********|
                **|*********|
                **------A---B---
                Bảng trạng thái:

                A B Q
                0 0 I0
                1 0 I1
                0 1 I2
                1 1 I3
                (nói chung đây là con MUX 4 ngõ vào I0...I3, hai ngõ điều khiển A,B và ngõ ra Q )

                Let’s look at two examples that illustrate this point more clearly. Both
                examples are models of a 4 to 1 multiplexer device. The symbol and truth
                table for this device are shown in Figure 3-1. One of the four input signals
                is propagated to the output depending on the values of inputs A and B.
                The first model for the multiplexer is an incorrect model, and the second
                is a corrected version of the model.

                Incorrect Mux Example
                The incorrect model of the multiplexer has a flaw in it that causes the
                model to produce incorrect results. This is shown by the following model:

                Code:
                LIBRARY IEEE;
                USE IEEE.std_logic_1164.ALL;
                ENTITY mux IS
                PORT (i0, i1, i2, i3, a, b : IN std_logic;
                44 Chapter Three
                q : OUT std_logic);
                END mux;
                ARCHITECTURE wrong of mux IS
                SIGNAL muxval : INTEGER;
                BEGIN
                PROCESS ( i0, i1, i2, i3, a, b )
                BEGIN
                muxval <= 0;
                IF (a = ‘1’) THEN
                muxval <= muxval + 1;
                END IF;
                IF (b = ‘1’) THEN
                muxval <= muxval + 2;
                END IF;
                CASE muxval IS
                WHEN 0 =>
                q <= I0 AFTER 10 ns;
                WHEN 1 =>
                q <= I1 AFTER 10 ns;
                WHEN 2 =>
                q <= I2 AFTER 10 ns;
                WHEN 3 =>
                q <= I3 AFTER 10 ns;
                WHEN OTHERS =>
                NULL;
                END CASE;
                END PROCESS;
                END wrong;
                Whenever one of the input signals in the process sensitivity list changes
                value, the sequential statements in the process are executed. The process
                statement in the first example contains four sequential statements.The first
                statement initializes the local signal muxval to a known value (0).The subsequent
                statements add values to the local signal depending on the value
                of the a and b input signals. Finally, the case statement chooses an input
                to propagate to the output based on the value of signal muxval. This model
                has a significant flaw, however. The first statement:
                muxval <= 0;
                causes the value 0 to be scheduled as an event for signal muxval. In fact,
                the value 0 is scheduled in an event for the next simulation delta because
                no delay was specified. When the second statement:
                IF (a = ‘1’) THEN
                muxval <= muxval + 1;
                END IF;
                is executed, the value of signal muxval is whatever was last propagated
                to it. The new value scheduled from the first statement has not propagated
                yet. In fact, when multiple assignments to a signal occur within the
                same process statement, the last assigned value is the value propagated.
                The signal muxval has a garbage value when entering the process. Its
                value is not changed until the process has completed execution of all
                sequential statements contained in the process. In fact, if signal b is a ‘1’
                value, then whatever garbage value the signal had when entering the
                process will have the value 2 added to it.
                A better way to implement this example is shown in the next example.
                The only difference between the next model and the previous one is the
                declaration of muxval and the assignments to muxval. In the previous
                model, muxval was a signal, and signal assignment statements were used
                to assign values to it. In the next example, muxval is a variable, and
                variable assignments are used to assign to it.

                Correct Mux Example

                In this example, the incorrect model is rewritten to reflect a solution to
                the problems with the last model:
                Code:
                LIBRARY IEEE;
                USE IEEE.std_logic_1164ALL;
                ENTITY mux IS
                PORT (i0, i1, i2, i3, a, b : IN std_logic;
                PORT (q : OUT std_logic);
                END mux;
                ARCHITECTURE better OF mux IS
                BEGIN
                PROCESS ( i0, i1, i2, i3, a, b )
                VARIABLE muxval : INTEGER;
                BEGIN
                muxval := 0;
                IF (a = ‘1’) THEN
                muxval := muxval + 1;
                END IF;
                IF (b = ‘1’) THEN
                muxval := muxval + 2;
                END IF;
                CASE muxval IS
                WHEN 0 =>
                q <= I0 AFTER 10 ns;
                WHEN 1 =>
                q <= I1 AFTER 10 ns;
                WHEN 2 =>
                q <= I2 AFTER 10 ns;
                WHEN 3 =>
                q <= I3 AFTER 10 ns;
                WHEN OTHERS =>
                NULL;
                END CASE;
                END PROCESS;
                END better;
                This simple coding difference makes a tremendous operational difference.
                When the first statement:
                muxval := 0;
                is executed, the value 0 is placed in variable muxval immediately. The
                value is not scheduled because muxval, in this example, is a variable, not
                a signal. Variables represent local storage as opposed to signals, which
                represent circuit interconnect. The local storage is updated immediately,
                and the new value can be used later in the model for further computations.
                Because muxval is initialized to 0 immediately, the next two statements
                in the process use 0 as the initial value and add appropriate numbers,
                depending on the values of signals a and b. These assignments are also
                immediate, and therefore when the CASE statement executes, variable
                muxval contains the correct value. From this value, the correct input signal
                can be propagated to the output.


                Tui muốn hỏi là: Phần cứng nào sẽ được tạo ra bên trong chip đối với khai báo biến và khai báo tín hiệu. Vì theo tác giả thì khai báo dù là biến hay tín hiệu thì cũng sử dụng các component, sự khác nhau là việc cập nhật giá trị tức thời hay ko, nhưng vì sao lại có sự khác biệt như vậy nhỉ ?. chứ không như bác neo nói là : "tín hiệu chỉ là đường nối các component"
                Bác nào đã có kinh nghiệm xin giải đáp giúp với nhé. Cảm ơn
                Last edited by thavali; 08-05-2007, 18:00.

                Comment


                • #9
                  Tui muốn hỏi là: Phần cứng nào sẽ được tạo ra bên trong chip đối với khai báo biến và khai báo tín hiệu. Vì theo tác giả thì khai báo dù là biến hay tín hiệu thì cũng sử dụng các component, sự khác nhau là việc cập nhật giá trị tức thời hay ko, nhưng vì sao lại có sự khác biệt như vậy nhỉ ?. chứ không như bác neo nói là : "tín hiệu chỉ là đường nối các component"
                  Bác nào đã có kinh nghiệm xin giải đáp giúp với nhé. Cảm ơn
                  Bạn có thể lập trình theo nhiều mức khác nhau (behavior, data flow, RTL, gate level,...) để mô phỏng nhưng cuối cùng đều phải chuyển ra netlist (mức gate level) trước khi xây dựng phần cứng. Khi đến netlist thì không còn tồn tại các biến nữa mà chỉ còn tồn tại các components và các tín hiệu có dán nhãn (net).

                  Thông thường thì chúng ta lập trình ở mức behavior để mô phỏng và kiểm chứng phương pháp. Sau đó lập trình ở mức RTL và dùng công cụ synthesis (ví dụ, DC của Synopsys) để chuyển cái thiết kế của mình ra netlist.

                  Chú ý: chỉ những thiết kế ở mức RTL mới synthesizable.


                  Comment


                  • #10
                    Bạn có thể lập trình theo nhiều mức khác nhau (behavior, data flow, RTL, gate level,...) để mô phỏng nhưng cuối cùng đều phải chuyển ra netlist (mức gate level) trước khi xây dựng phần cứng. Khi đến netlist thì không còn tồn tại các biến nữa mà chỉ còn tồn tại các components và các tín hiệu có dán nhãn (net).
                    cảm ơn bác yesme@
                    Nhưng các components được tạo ra là nhờ nó được ánh xạ từ netlist, mà ở mức cao hơn chính là được ánh xạ từ các biến, tín hiệu, hằng,...Như thế phải có sự khác biệt khi một component có được do sự ánh xạ từ biến và một components có được do sự ánh xạ từ tín hiệu chứ bác ? Vì nếu giống nhau thì người ta sẽ ko cần phân biệt giữa gán biến và gán tín hiệu, và tui thật sự muốn biết sự khác biệt của hai quá trình này. Ta có thể kiểm chứng được quá trình này ko nhỉ ? chẳn hạn các design tool của nó, tui đang làm con CPLD dòng CoolRunner-II của xilinx.

                    Comment


                    • #11
                      Nguyên văn bởi thavali Xem bài viết
                      cảm ơn bác yesme@
                      Nhưng các components được tạo ra là nhờ nó được ánh xạ từ netlist, mà ở mức cao hơn chính là được ánh xạ từ các biến, tín hiệu, hằng,...Như thế phải có sự khác biệt khi một component có được do sự ánh xạ từ biến và một components có được do sự ánh xạ từ tín hiệu chứ bác ? Vì nếu giống nhau thì người ta sẽ ko cần phân biệt giữa gán biến và gán tín hiệu, và tui thật sự muốn biết sự khác biệt của hai quá trình này. Ta có thể kiểm chứng được quá trình này ko nhỉ ? chẳn hạn các design tool của nó, tui đang làm con CPLD dòng CoolRunner-II của xilinx.
                      Mình không hiểu ý của bạn.

                      Ở mức netlist thì chỉ có các components là các gate cụ thể theo thư viện (AND, OR, NAND, NOR, INV), và các dây nối có dán nhãn. Nếu xuống mức thấp hơn nữa thì sẽ có thêm các thông số vật lý về các gates và dây nối đó.

                      Biến chủ yếu chỉ dùng khi mô phỏng (để tính toán), đến lúc thực hiện phần cứng thì đâu còn biến.

                      Nếu để phân biệt biến và tín hiệu trong quá trình tính toán thì trong tài liệu đã nêu rõ.
                      - Khi ra khỏi process thì biến không còn tồn tại, trong khi tín hiệu thì vẫn tồn tại.
                      - Để nhận một giá trị thì tín hiệu phải được ghi giá trị và mất một khoảng thời gian trễ nhất định trong khi biến nhận tín hiệu ngay sau lệnh gán.
                      - ...


                      Comment


                      • #12
                        Cảm ơn bác. Do mới tìm hiểu nên tôi cũng chưa thật sự nắm về cái VHDL, nhưng ko bít thì phải hỏi nên tui muốn giải thích lại câu hỏi của mình:
                        Tôi lấy lại đoạn code của tác giả như sau:
                        ....
                        PROCESS ( i0, i1, i2, i3, a, b )
                        VARIABLE muxval : INTEGER;
                        BEGIN
                        muxval := 0;
                        IF (a = ‘1’) THEN
                        muxval := muxval + 1;
                        END IF;
                        IF (b = ‘1’) THEN
                        muxval := muxval + 2;
                        END IF;
                        ...

                        ở đoạn trên thì biến muxval được khai báo và sử dụng. Như vậy trong quá trình thực hiện chuỗi lệnh trên, thì tương ứng với phần cứng (ở mức thấp nhất) là các cổng (gate) hay các dây (net) phải được tạo ra, phải ko bác ? Và các cổng hay dây này phải ghép nối thế nào đó để thỏa mãn biểu thức trên. Tui nói "các components được tạo ra nhờ ánh xạ từ netlist" là ý chỉ phần cứng (mức thấp nhất :gate hay net) sẽ được tạo ra khi đoạn code trên được tổng hợp (synthesis), giống như ta biên dịch ra file hex từ C code (hay ASM code) để nạp cho vi điều khiển ấy mà. Còn theo tác giả thì các biến sẽ ko còn khi đi ra khỏi quá trình (process), theo ý tôi, là sau khi tạo ra các phần cứng (gate, net) tương ứng với đoạn code trên thì biến coi như đã hoàn thành nhiệm vụ (đã tạo ra các phần cứng tương ứng) nên khi ra khỏi process ta ko cần quan tâm đến biến nữa , còn các tín hiệu vẫn tồn tại xuyên suốt trong tất cả các tiến trình là vì thường thì ta cần dùng lại tín hiệu này trong các tiến trình khác. Nhưng tui còn chưa hiểu là: tại sao biến thì nhận được giá trị tức thời còn tín hiệu thì bị trì hoãn .
                        Những ý trên chỉ là chủ quan, có thể hổng đúng nên mong bác chỉ giáo.

                        Comment


                        • #13
                          Variables vs. Signals

                          Cho Tí ké theo chút:
                          Theo Tí thì sự khác nhau giữa biến và tín hiệu là vầy:
                          - Biến chỉ khai bao trong process, function, procedure. Tín hiệu thì không được khai báo ở mấy chỗ đó.
                          - Khi cập nhật biến là giá trị của biến thay đổi tức thì, tín hiệu chỉ được cập nhật sau một khoảng delay delta hoặc được chỉ ra bằng after.
                          - Tín hiệu thường được dùng để chỉ một thành phần hardware trong thiết kế (ví dụ wire, register) còn biến thường giống một biến trong các ngôn ngữ cấp cao, tức là hỗ trợ cho các tính toán trong các giải thuật, nó không thực sự được tổng hợp thành hadware (chỉ có toàn bộ giải thuật sẽ được suy luận để tổng hợp thành hardware tương ứng thực thi giải thuật đó). Bởi vậy nên biến chỉ dùng trong process hoặc chương trình con.
                          Chút xíu thông tin Tí biết.
                          Làm cái gì nữa đây?

                          Comment


                          • #14
                            Cảm ơn titeo, nhưng ngay trong ngôn ngữ cấp cao, C chẳn hạn, khi ta khai báo 1 biến thì biến đó sẽ chiếm 1 (hay nhiều) ô nhớ trong vùng nhớ dữ liệu chứ ạ ?. Bây giờ ta đọc lại phân tích của tác giả L.perry ở trên (trang 1) :
                            Variables represent local storage as opposed to signals, which
                            represent circuit interconnect. The local storage is updated immediately,
                            and the new value can be used later in the model for further computations.
                            Tạm dịch: các biến (variable) thể hiện sự lưu trữ cục bộ, như một sự đối nghịch với tín hiệu (signal), thể hiện sự kết nối trong mạch. Việc lưu trữ cục bộ của các biến được cập nhật ngay lập tức và giá trị mới có thể được sử dụng cho các mô hình tính toán tiếp đó.
                            vậy chữ: local storage có phải là quá trình tạo ra các phần cứng (net, gate) tương ứng ko ạ ?

                            Comment


                            • #15
                              1/ Biến được dùng để hỗ trợ tính toán trong quá trình mô phỏng thiết kế của bạn. Khi chuyển đổi (nêu bạn có công cụ chuyển đổi mức cao) thì công cụ chuyển đổi sẽ phải đổi process của bạn ra một mạch điện tương ứng ở mức netlist.
                              Đúng là khi bạn khai báo biến thì khi dịch và chạy chương trình thì máy tính sẽ phải cấp cho nó một vùng nhớ. Tuy nhiên, bạn chú ý rằng vùng nhớ được cấp ở đây chính là một hoặc một số ô nhớ của máy tính bạn đang dùng. Chứ không phải là ô nhớ trên FPGA hay trên chip.

                              2/ Tại sao việc gán tín hiệu là bị trễ
                              Với biến, cách gán tín hiệu giống như trong các ngôn ngữ bậc cao. Sau lệnh gán là biến nhận giá trị mới.
                              Với tín hiệu thì không thể như vậy được. Khi thực hiện một lệnh gán A<=B trong chương trình có nghĩa là bạn thực hiện một đường nối cố định giữa hai tín hiệu A và B. Nếu B thay đổi, A có thể thay đổi (chú ý, có những trường hợp A không thay đổi). Sự thay đổi của A diễn ra chậm hơn sự thay đổi của B vì lý do trễ tín hiệu trên đường dây.
                              Trên đây chỉ là một ví dụ cho thấy cách hành xử của phần cứng => nguyên tắc xây dựng khái niệm tín hiệu người ta phải tính đến thời gian trễ khi ghi một giá trị mới vào tín hiệu đó.


                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X