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

  • #16
    Bác yesme@ có thể cho ý kiến về ý kiến của bạn titeo ko ạ:
    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.

    Giả sử tui có code sau của con FF:

    entity flop is
    port (reset, din, clk: in bit; qout: bufer bit:='0');
    end flop ;

    achitecture behavioral OF flop IS
    process (clk)
    begin
    IF (clk='0' and clk'event) then
    IF reset ='1' Then
    qout<='0' ;
    else
    qout <= din ;
    end if;
    end process;
    end behavioral ;

    trong đoạn này ko có khai báo tín hiệu trong process, như vậy tín hiệu chính là các chân reset, clk, din, dout đã khai báo ở phần entity phải ko bác ?
    Tui giả định là trong cả chương trình tui ko dùng tín hiệu mà chỉ dùng biến không thôi thì có tổng hợp được kô, tức có tạo được phần cứng tương ứng trong chip ko ?

    Comment


    • #17
      trong đoạn này ko có khai báo tín hiệu trong process, như vậy tín hiệu chính là các chân reset, clk, din, dout đã khai báo ở phần entity phải ko bác ?
      Tui giả định là trong cả chương trình tui ko dùng tín hiệu mà chỉ dùng biến không thôi thì có tổng hợp được kô, tức có tạo được phần cứng tương ứng trong chip ko ?
      Tín hiệu và cổng có những đặc điểm tương tự nhau nhưng không giống nhau. Bạn chú ý rằng cổng có định hướng, cổng vào, cổng ra, cổng vào & ra.
      Ví dụ: bạn có thể gán cổng ra qout <= tín hiệu X nhưng không thể gán X <= qout
      Trong khi nếu nếu A & B là hai tín hiệu thì các câu lệnh A <= B và B <=A đều đúng cả.

      Liên quan đến câu hỏi về synthesizable : bạn có thể tổng hợp được nếu tool của bạn cho phép. Ví dụ, những chương trình viết bằng C++ với hàng loạt biến vẫn có thể tổng hợp được nếu bạn dùng Catapult.
      Tuy nhiên, hầu hết các tool thiết kế phổ biến hiện nay chỉ cho phép bạn tổng hợp được những process đơn giản.


      Comment


      • #18
        1.
        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.
        Tác giả nói là tín hiệu sẽ chỉ thay đổi giá trị khi chuỗi lệnh trong tiến trình được thực thi xong (kết thúc tiến trình).
        Đồng Thời:
        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
        Vậy hai câu này có gì mâu thuẫn không vậy bác ?

        2.
        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.
        Đoạn code của tác giả perry (trang 1) là được viết ở mức behavior phải ko bác ? Như thế là ko thể tổng hợp được sao bác ? Bác có thể cho ví dụ đoạn code tương ứng với đoạn code trên ở mức RTL được ko ạ , vì tui cứ nghĩ là viết như trên là có thể tổng hợp được rồi chứ ?

        Đây là đoạn 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;
        Last edited by thavali; 14-05-2007, 16:34.

        Comment


        • #19
          1. Nếu bạn viết toàn bộ bằng biến thì vẫn được, lúc đó phần architecture sẽ chỉ chứa process, và biến được khai báo trong process này. Khi tổng hợp thì toàn bộ process sẽ được chuyển thành hardware tùy theo giải thuật bạn viết và phần mềm tổng hợp bạn dùng.
          2. Hai câu đó không có gì mâu thuẫn.
          3. Đoạn code đó viết dạng behavior. Viết ở mức nào cũng có thể tổng hợp được hết, nhưng mức càng thấp thì sẽ càng dễ quản lý cấu trúc và tối ưu thiết kế nếu cần. Thông thường mức RTL là đủ dễ để viết và cũng đủ thấp để có thể biết trước cấu trúc của thiết kế sẽ như thế nào.
          Làm cái gì nữa đây?

          Comment


          • #20
            làm gì nữa đây ?
            Bác giúp tôi tiếp mấy cái nữa nhé
            of titeo
            2. Hai câu đó không có gì mâu thuẫn.
            Bác giải thích cụ thể hơn được ko ?
            -------------------------
            Giả sử tui có được code như trên (của bác perry ấy mà). Bây giờ tui muốn mô phỏng dạng sóng rồi sau đó nộp vào chip (tui dùng con CPLD XC2C256 của xilinx, kit của tụi digilent, tool ISE webpack 9.1, ko biết có cần cái ModelSim hay ko ? ) để ra được con MUX.
            mấy bác có thể chỉ cụ thể cách làm được ko vậy ? Cái này bác Douglas perry ko chỉ . Tui muốn có chút kết quả để có khí thế

            Comment


            • #21
              "2. Hai câu đó không có gì mâu thuẫn:" vì trong khi thực thi process thì các biến ứng với câu lệnh gán biến sẽ không được cập nhật giá trị, việc cập nhật này chỉ xảy ra sau một delay delta, đó cũng là khi process kết thúc.
              Nếu bạn muốn thử nghiệm thì rất dễ. Trước tiên viết code cho con MUX, mô phỏng nếu cần (có thể dùng ModelSim để mô phỏng). Dùng Webpack để tạo một project và add file nguồn vừa viết xong vào. Trong Webpack có một panel phía bên tay trái, nhấn đôi vào chỗ tạo ta file lập trình, Webpack sẽ tự động chạy các bước tổng hợp, floorplan, place&route... và cuối cùng sẽ mở một cửa sổ. Nếu bạn có kết nối kit của bạn đến máy tính thì con CPLD sẽ hiện ra trong cái hình trên cửa sổ đó. Nhấn phải vào con CPLD và chọn file vừa tạo ra để cấu hình cho CPLD bạn sẽ có kết quả.
              Để biết cách sử dụng ISE bạn có thể đọc thêm trên Web, có rất nhiều bài dạng tutorial.
              Chúc thành công như tui
              Làm cái gì nữa đây?

              Comment


              • #22
                1.
                "2. Hai câu đó không có gì mâu thuẫn:" vì trong khi thực thi process thì các biến ứng với câu lệnh gán biến sẽ không được cập nhật giá trị, việc cập nhật này chỉ xảy ra sau một delay delta, đó cũng là khi process kết thúc.
                Nếu như thế thì nếu như cái process của ta nó quá dài (có nhiều dòng lệnh), như thế sự dài ngắn khoảng thời gian trì hoãn delta sẽ phụ thuộc vào chiều dài của cái process sao bác ?

                2. Tui có đoạn code sau:
                a.
                entity MEMMO_ONE is
                port (data: in bit_vector(1down0);
                clock: in bit;
                Z: out bit);
                constant K1: bit_vector:="01" ;
                constant K2: bit_vector:="10" ;
                end MEMO_ONE ;
                achitecture A of MEMO_ONE is
                begin
                process (clock)
                variable A1, A2: bit_vector(data'range);
                variable A3: bit ;
                begin
                if clock ='1' and clock'event then
                A1:= data and K1 ;
                A2:= data and K2 ;
                A3:= A1(0) and A2(1) ;
                Z<=A3 ;
                end if
                end process
                end A;


                (trích từ sách :Ngôn nhữ VHDL để thiết kế vi mạch - Nguyễn quốc Tuấn )
                Tác giả đưa ra kết quả của phần cứng được tạo thành khi tổng hợp là hình A(hình kèm theo)

                sau đó ta dùng đoạn code như sau:
                b.

                entity MEMMO_ONE is
                port (data: in bit_vector(1down0);
                clock: in bit;
                Z: out bit);
                constant K1: bit_vector:="01" ;
                constant K2: bit_vector:="10" ;
                end MEMO_ONE ;
                achitecture B of MEMO_ONE is

                signal A1, A2: bit_vector(data'range);
                signal A3: bit ;
                begin
                A1<= data and K1 ;
                A2<= data and K2 ;

                process (clock)
                begin
                if clock ='1' and clock'event then
                A3<= A1(0) and A2(1) ;
                Z<=A3 ;
                end if
                end process
                end B;


                và phần cứng tạo ra là hình B.(hình kèm theo)

                Tác giả N.Q.Tuấn giải thích là : ở kiến trúc A (ví dụ a) thì biến A3 được tạo như một cấu trúc chương trình trung gian, còn tín hiệu A3 tạo ra một phần cứng bộ nhớ trung gian. Nghĩa là biến A3 không tạo ra phần cứng nào, còn tín hiệu A3 sẽ tạo ra phần cứng tương ứng nên kết quả là tạo thêm 1 cái mạch lật như ở hình B
                Nhưng nếu ta suy luận theo như tác giả perry thì ở ví dụ b, (kiến trúc b) giá trị của A3 sẽ được lập lịch và chưa cập nhật ngay, do đó biểu thức Z<= A3 sẽ không nhận được giá trị của A1(0) and A2(1)Z phải nhận giá trị không biết trước. Như thế thì làm sao ra được hình B, chỗ này tui chưa hiểu ?. Bác nào bit giải thích giúp

                3.
                Làm thế nào có thể biết được kết quả phần cứng được tạo thành từ VHDL. Chẳn hạn như với hai ví dụ trên, làm sao để biết là phần cứng tương ứng tạo ra là hai cái hình (A,B) bên dưới ?
                Attached Files
                Last edited by thavali; 17-05-2007, 11:41.

                Comment


                • #23
                  "Nếu như thế thì nếu như cái process của ta nó quá dài (có nhiều dòng lệnh), như thế sự dài ngắn khoảng thời gian trì hoãn delta sẽ phụ thuộc vào chiều dài của cái process sao bác ?"
                  Không đúng, lập trình HDL khác với lập trình cho MCU ở chỗ không phải mỗi câu lệnh là sẽ mất một khoảng thời gian, nhiều câu lệnh thì sẽ mất nhiều thời gian đâu. Trong một process, mặc dù các câu lệnh được thực thi tuần tự từng dòng một nhưng toàn bộ process chỉ được xem tương đương với một câu lệnh (concurrent), do đó, tất cả các phép gán tín hiệu chỉ xảy ra tại cùng một thời điểm là khi process kết thúc.
                  2. Hai kết quả tổng hợp đó là đúng rồi. Trong hình A, phép gán biến := cho kết quả tức thời, chỉ có câu lệnh Z <= A3 là câu lệnh gán tín hiệu theo clock nên được tổng hợp thành 1 FF.
                  Trong hình B xuất hiện hai câu lệnh gán biến A3 và Z. Ở clk đầu tiên thì A3 sẽ lấy A1 and A2 (lưu ý là sự thay đổi giá trị chỉ xảy ra sau delay delta) và Z sẽ lấy giá trị của A3 tại thời điểm trước khi có clk (do tại thời điểm có cạnh clk thì A3 vẫn chưa cập nhật giá trị mới). Sự thay đổi giá trị của Z cũng chỉ xảy ra sau một delay (về mặt hardware thì delay này chính là delay của FF, clk xảy ra thì sau một khoảng thời gian thì ngõ Q mới thay đổi, delay này được gọi là delay delta). Như vậy rõ ràng là phải có 2 FF mắc nối tiếp.
                  Khó hiểu quá hả?
                  Làm cái gì nữa đây?

                  Comment


                  • #24
                    1.
                    Khó hiểu quá hả? => hì, tui đang rán hỉu đây .
                    Tất cả các phép gán tín hiệu chỉ xảy ra tại cùng một thời điểm là khi process kết thúc.
                    Vậy còn trong trường hợp phép gán tín hiệu được thực hiện bên ngoài process thì quá trình tổng hợp sẽ diễn ra như thế nào vậy bác ? ( ở ví dụ b, hai tín hiệu A1, A2 được gán bên ngoài process). Bác có thể nói cụ thể hơn về ý nghĩa của việc: vừa đồng thời (concurrent) lại vừa tuần tự (sequential) trong một tiến trình (process), tui thấy khó hiểu quá ?.

                    2.
                    Làm thế nào có thể biết được kết quả phần cứng được tạo thành từ VHDL. Chẳn hạn như với hai ví dụ trên, làm sao để biết là phần cứng tương ứng tạo ra là hai cái hình (A,B) bên dưới , ý tui là làm sao để chuyển từ cái vhdl sang schematic tương ứng, cái ISE webpack có hỗ trợ không ?

                    3.

                    nếu tui thay đổi đoạn code b:
                    begin
                    A1<= data and K1 ;
                    A2<= data and K2 ;
                    process (clock)
                    begin
                    if clock ='1' and clock'event then
                    A3<= A1(0) and A2(1) ;
                    Z<=A3 ;
                    end if
                    end process
                    end
                    B;

                    thành:

                    begin
                    A1<= data and K1 ;
                    wait for 0 ns ;
                    A2<= data and K2 ;
                    wait for 0 ns ;
                    process (clock)
                    begin
                    if clock ='1' and clock'event then
                    A3<= A1(0) and A2(1) ;
                    wait for 0 ns ;
                    Z<=A3 ;
                    end if
                    end process
                    end
                    B;

                    thì nó có tương đương với đoạn code a không bác ?

                    Dưới đây là đoạn code a:

                    ...
                    begin
                    if clock ='1' and clock'event then
                    A1:= data and K1 ;
                    A2:= data and K2 ;
                    A3:= A1(0) and A2(1) ;
                    Z<=A3 ;
                    end if
                    end process


                    vì bác Douglas L. perry nói như thế.
                    Last edited by thavali; 17-05-2007, 17:00.

                    Comment


                    • #25
                      Trao đổi với bạn thú vị đấy
                      Điểm trước tiên mà bạn cần nhớ đó là lập trình HDL khác về cơ bản với lập trình cho vi xử lý ở chỗ HDL mô hình được sự thực thi song song của phần cứng (bằng các câu lệnh concurrent).
                      Các câu lệnh gán "<=" ngoài process được gọi là concurrent (không biết dịch là cái gì ). Các câu lệnh concurrent luôn được thực thi đồng thời, tức là về mặt mô phỏng là kết quả được cập nhật tại cùng một thời điểm. Bản thân câu lệnh process cũng là một câu lệnh concurrent (thân process được thực thi tuần tự sequential). Bạn có thể hình dung mỗi câu lệnh concurrent sẽ được chuyển thành một hardware tương ứng. Như vậy process cũng sẽ chuyển thành một hardware thực hiện một hàm nào đó.
                      Khi bạn tìm hiểu HDL bạn nên viết lại các vi mạch MSI như decoder, mũ, demux, latch, FF thì sẽ hiểu được viết như thế nào sẽ tổng hợp ra mạch nào (vì tất cả đều có khuôn mẫu viết). Tuy nhiên, việc tổng hợp còn tùy thuộc vào công cụ bạn dùng, thường thì công cụ nào cũng có một số guidelines cho các trường hợp đặc biệt, thường là phân biệt cách viết giữa latch và FF.
                      2. Làm sao biết được nó sẽ có mạch hình a, b hả?
                      Đó là do process có tín hiệu trong sensitive list là clk (chứng tỏ nó là FF, bạn có thể xem một đoạn code FF mẫu để thấy rõ). Còn tại sao biết là hình b có 2 FF mắc nối tiếp, đó là vì code có hai câu lệnh gán tín hiệu nên tín hiệu muốn đến được Z thì phải mất 2 clock, mỗi clk thì data đi qua 1 FF.
                      Bạn cứ tổng hợp mạch, sau đó view dưới dạng schematic thì sẽ thấy mạch tổng hợp ra sao.
                      Làm cái gì nữa đây?

                      Comment


                      • #26
                        Bravo titeo !
                        Mình không có thời gian để theo dõi các thảo luận của các bạn. Hôm nay mới ngồi đọc.
                        Đúng là như titeo nói, lập trình mô tả phần cứng nên nhìn thiết kế theo quan điểm phần cứng.

                        concurrent = xảy ra đồng thời

                        Ngôn ngữ mô tả phần cứng khác với các ngôn ngữ lập trình bậc cao ở chỗ nó hỗ trợ các tiến trình xảy ra đồng thời (cùng lúc).


                        Comment


                        • #27
                          thank bác titeo nhé. Do mới tìm hiểu nên hỏi hơi nhiều
                          Còn câu số 3, Bác giúp luôn nhé:
                          3.

                          nếu tui thay đổi đoạn code b:

                          begin
                          A1<= data and K1 ;
                          A2<= data and K2 ;
                          process (clock)
                          begin
                          if clock ='1' and clock'event then
                          A3<= A1(0) and A2(1) ;
                          Z<=A3 ;
                          end if
                          end process
                          end
                          B;

                          thành:

                          begin
                          A1<= data and K1 ;
                          wait for 0 ns ;
                          A2<= data and K2 ;
                          wait for 0 ns ;
                          process (clock)
                          begin
                          if clock ='1' and clock'event then
                          A3<= A1(0) and A2(1) ;
                          wait for 0 ns ;
                          Z<=A3 ;
                          end if
                          end process
                          end
                          B;

                          thì nó có tương đương với đoạn code a không bác ?

                          Dưới đây là đoạn code a:

                          ...
                          begin
                          if clock ='1' and clock'event then
                          A1:= data and K1 ;
                          A2:= data and K2 ;
                          A3:= A1(0) and A2(1) ;
                          Z<=A3 ;
                          end if
                          end process


                          vì bác Douglas L. perry nói như thế.
                          thực ra bác perry lấy đoạn ví dụ khác, nhưng tui thấy nó giống với cái này nên thêm thoắt vào thôi. Bác perry có nói là nếu ta thêm lệnh wait for 0 ns ; thì giá trị của lệnh gán tín hiệu trước nó (ở ví dụ b thì lệnh đó là A3<= A1(0) and A2(1) ) sẽ được cập nhật tức thời (immediate). Nếu đúng như vậy thì đoạn code sau khi sữa, khi tổng hợp sẽ mất đi 1 cái FF, vậy trong trường hợp này, ta dùng 2 phép gán tín hiệu nhưng chỉ có 1 phần cứng (1 FF) được tạo ra, chứ không phải cứ mỗi một phép gán tín hiệu thì sẽ tạo ra 1 phần cứng (hardware) tương ứng .
                          Bác cho xin ý kiến nhé

                          2.

                          Trong sách của tác giả Nguyễn Quốc Tuấn có trình bày 2 phần: lệnh tuần tự (trang 81) và lệnh đồng thời (trang 93). Trong hai kiểu lệnh này, tác giả điều có trình bày về phép gán tín hiệu trong lệnh tuần tự và gán tín hiệu trong lệnh đồng thời. Nhưng có điều tác giả ko giải thích lệnh tuần tự là gì, lệnh đồng thời là gì. Trong phần lệnh đồng thời tác giả lại nói tới lệnh quá trình lệnh đồng bộ nhưng cũng ko giải thích, nên khi đọc thấy rối vô cùng, có lẻ tác giả chỉ dịch là chính, bác có thể giải thích giúp tui mấy cái lệnh đó với ? Có phải khi muốn viết các lệnh tuần tự thì phải bỏ chúng vào trong một process không ?
                          Last edited by thavali; 18-05-2007, 13:21.

                          Comment


                          • #28
                            1. Việc dùng "wait for 0ns" kết quả ra sao thì Tí cũng không rõ nhưng có điều là vầy: câu lệnh wait này sẽ không tổng hợp được. Do đó khi bạn viết thì cũng chỉ để mô phỏng thôi, chứ không thể đưa vào hardware được. Trong khi đó thì phần cứng luôn luôn có trễ. Do đó, nếu bạn viết là delay 0ns thì nó sẽ không có ý nghĩa thực tế. Hai đoạn code đó có giống nhau hay không thì Tí cũng không rõ vì chưa bao giờ Tí dùng dạng này.
                            2. lệnh tuần tự (sequential) hoạt động giống như các lệnh trong các ngôn ngữ lập trình trên PC. Các lệnh này thường xuất hiện trong process (có lẽ được dịch là lệnh quá trình), chương trình con (function, procedure).
                            Lệnh đồng thời (concurrent) là các lệnh nằm trong phần thân architecture và ngoài process. Các lệnh đồng thời mặc dù viết tuần tự nhưng luôn được thực thi đồng thời.
                            Cố gắng lên
                            Last edited by titeo; 18-05-2007, 23:17.
                            Làm cái gì nữa đây?

                            Comment


                            • #29
                              Trước mắt là cảm ơn titeo và yesme@ cái đã
                              Bây giờ ta cùng đọc sách của bác perry nhé ( sợ sách tiếng việt rồi ).
                              sách thì có rồi, nhưng vẫn phải up lên mới thảo luận được.

                              Concurrent Assignment Problem

                              One of the problems that most designers using sequential signal assignment
                              statements encounter is that the value assigned in the last statement
                              does not appear immediately. This can cause erroneous behavior in the
                              model if the designer is depending on the new value. An example of this
                              problem is shown here:

                              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 mux_behave OF mux IS
                              SIGNAL sel : INTEGER RANGE 0 TO 3;
                              BEGIN
                              B : PROCESS(A, B, I0, I1, I2, I3)
                              BEGIN
                              sel <= 0;
                              IF (A = ‘1’) THEN sel <= sel + 1; END IF;
                              IF (B = ‘1’) THEN sel <= sel + 2; END IF;
                              CASE sel IS
                              WHEN 0 =>
                              Q <= I0;
                              WHEN 1 =>
                              Q <= I1;
                              WHEN 2 =>
                              Q <= I2;
                              WHEN 3 =>
                              Q <= I3;
                              END CASE;
                              END PROCESS;
                              END mux_behave;

                              bác perry bảo viết vậy trật rùi. bởi vì :

                              This model is for a 4 to 1 multiplexer. Depending on the values of A and
                              B, one of the four inputs (I0 to I3) is transferred to output Q.
                              The architecture starts processing by initializing internal signal sel to
                              the value 0. Then, based on the values of A and B, the values 1 or 2 are
                              added to sel to select the correct input. Finally, a CASE statement selected by the value of sel transfers the value of the input to output Q.
                              This architecture does not work as presently implemented. The value
                              of signal sel will never be initialized by the first line in the architecture:
                              sel <= 0;

                              This statement inside of a process statement schedules an event for
                              signal sel on the next delta time point, with the value 0. However, processing
                              continues in the process statement with the next sequential statement.
                              The value of sel remains at whatever value it had at the entry to
                              the process. Only when the process has completed is this current delta
                              finished and the next delta time point started. Only then is the new value of sel reflected. By this time, however, the rest of the process has already been processed using the wrong value of sel.

                              rồi bác đưa ra hai giải pháp khắc phục hậu quả

                              There are two ways to fix this problem. The first is to insert WAIT statements after each sequential signal assignment statement as shown here:

                              ARCHITECTURE mux_fix1 OF mux IS
                              SIGNAL sel : INTEGER RANGE 0 TO 3;
                              BEGIN
                              PROCESS
                              BEGIN

                              sel <= 0;
                              WAIT FOR 0 ns; -- or wait on sel
                              IF (a = ‘1’) THEN sel <= sel + 1; END IF;
                              WAIT for 0 ns;
                              IF (b = ‘1’) THEN sel <= sel + 2; END IF;
                              WAIT FOR 0 ns;
                              CASE sel IS
                              WHEN 0 =>
                              Q <= I0;
                              WHEN 1 =>
                              Q <= I1;
                              WHEN 2 =>
                              Q <= I2;
                              WHEN 3 =>
                              Q <= I3;
                              END CASE;
                              WAIT ON A, B, I0, I1, I2, I3;

                              --cái Wait on này được đặt ở cuối thì tui vẫn chưa hiểu, dù bác perry đã giải thích, xin mấy bác giải đáp giúp.

                              END PROCESS;
                              END
                              mux_fix1;

                              The WAIT statements after each signal assignment cause the process to wait for one delta time point before continuing with the execution. By
                              waiting for one delta time point, the new value has a chance to propagate.
                              Therefore, when execution continues after the WAIT statement, signal sel has the new value.
                              One consequence of the WAIT statements, however, is that the process can no longer have a sensitivity list. A process with WAIT statements contained within it or within a subprogram called from within the process cannot have a sensitivity list. A sensitivity list implies that execution starts from the beginning of the procedure, while a WAIT statement allows suspending a process at a particular point. The two are mutually exclusive.
                              Because the process can no longer have a sensitivity list, a WAIT statement has been added to the end of the process that exactly imitates the behavior of the sensitivity list. This is the following statement:
                              WAIT ON A, B, I0, I1, I2, I3;
                              The WAIT statement proceeds whenever any of the signals on the right
                              side of the keyword ON have an event upon them.

                              Nhưng rồi bác cũng bảo là dùng biến (variable) vẫn hơn.


                              This method of solving the sequential signal assignment problem causes
                              the process to work, but a better solution is to use an internal variable instead of the internal signal, as shown here:

                              ARCHITECTURE mux_fix2 OF mux IS
                              BEGIN
                              PROCESS
                              (A, B, I0, I1, I2, I3)
                              VARIABLE sel : INTEGER RANGE 0 TO 3;
                              BEGIN
                              sel := 0;
                              IF (A = ‘1’) THEN sel := sel + 1; END IF;
                              IF (B = ‘1’) THEN sel := sel + 2; END IF;
                              CASE sel IS
                              WHEN 0 =>
                              Q <= I0;
                              WHEN 1 =>
                              Q <= I1;
                              WHEN 2 =>
                              Q <= I2;
                              WHEN 3 =>
                              Q <= I3;
                              END CASE;
                              END PROCESS;
                              END
                              mux_fix2;

                              The signal sel from the preceding example has been converted from
                              an internal signal to an internal variable. This was accomplished by
                              moving the declaration from the architecture declaration section to the
                              process declaration section. Variables can only be declared in the process
                              or subprogram declaration section.
                              Also, the signal assignments to sel have been changed to variable
                              assignment statements. Now, when the first assignment to sel is executed,
                              the value is updated immediately. Each successive assignment is also executed immediately so that the correct value of sel is available in
                              each statement of the process.

                              Như vậy là bác perry đã đưa ra 2 giải pháp, cho cùng một kết quả như nhau, một cái vẫn dùng phép gán tín hiệu nhưng phải có thêm wait on 0 ns, cái kia thì dùng biến. theo ý kiến bác titeo thì cái dùng phép gán tín hiệu không thể tổng hợp (synthesis) được . ý kiến của bác yesme@ và người khác thì sao nhỉ ?, riêng tui vì mới học nên chỉ... nghe ý kiến thôi
                              Last edited by thavali; 19-05-2007, 10:22.

                              Comment


                              • #30
                                Dùng wait trong chương trình => không thể tổng hợp tự động được.
                                Tuy nhiên, trong một số trường hợp người ta vẫn phải làm như vậy và họ phải tổng hợp tự động, sau đó phải thực hiện trễ đó khi làm layout.
                                (đang bận nên không trả lời bạn nhiều hơn, mong thông cảm)


                                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