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

  • #91
    Về mặt phần cứng ta không thể thu được kết quả như tui mong đợi : chẳn hạn, lấy ví dụ trên của bác. Khi tổng hợp ta thu được tín hiệu c = "0000". Nhưng sau đó ta đổi thư viện thành Use ieee.std_logic_unsigned.all; thì kết quả c vẫn là "0000" vì giá trị 13 + 3 = 16 ="10000" nên c bị tràn.
    ..........................
    Vì nghĩ là chú cần một ví dụ signed nên anh mới đưa một ví dụ để chú hiểu bản chất khi dùng std_logic_signed. Anh không biết là chú cần ví dụ để so sánh với unsigned. => Lần sau phải nói rõ từ đầu nhé!

    ====> Bây giờ chú thử dùng lại ví dụ 3 + (-3) = 0 và khai báo lại tín hiệu c
    Signal c : OUT std_logic_vector (7 downto 0);

    Kết quả chú sẽ thấy sự khác nhau.


    Comment


    • #92
      Đúng rồi đó bác yesme@, tui muốn phân biệt sự khác nhau của hai thư viện ieee.std_logic_unsigned.all và ieee.std_logic_signed.all.
      Tui đã sửa :
      Signal c : OUT std_logic_vector (7 downto 0);
      như bác nói.
      nhưng tổng hợp vẫn là "00000000" , còn mô phỏng thì không được. Ở hình tổng hợp, các bit của c điều bị kéo xuống GND hết. Hay là ISE nó không thích tui.
      Là sao nhỉ.
      Attached Files
      Last edited by thavali; 24-07-2007, 19:08.

      Comment


      • #93
        Nguyên văn bởi thavali Xem bài viết
        Đúng rồi đó bác yesme@, tui muốn phân biệt sự khác nhau của hai thư viện ieee.std_logic_unsigned.all và ieee.std_logic_signed.all.
        Tui đã sửa :
        Signal c : OUT std_logic_vector (7 downto 0);
        như bác nói.
        nhưng tổng hợp vẫn là "00000000" , còn mô phỏng thì không được. Ở hình tổng hợp, các bit của c điều bị kéo xuống GND hết. Hay là ISE nó không thích tui.
        Là sao nhỉ.
        Sao không compare a và b cho dễ thấy?

        Trong trường hợp (a+b), a và b đều là (3 downto 0), cho nên kết quả (a+b) cũng chỉ là (3 downto 0). c có nhiều bit hơn vẫn không ăn thua gì. Vì a và b đều là "constants", cho nên output c vẫn sẽ luôn luôn là 0.

        Nếu bạn muốn tạo một adder với carry out, bạn nên tham khảo ISE XST User Guide (http://toolbox.xilinx.com/docsan/xil...s/xst/xst.pdf), phần HDL coding techniques.

        =======

        std_logic_arith vẫn là của Synopsis. Thường tôi dùng std_logic_1164 và numeric_std. Nói chung thì mỗi thư viện có pro & con. Bây giờ bạn đang tìm hiểu thì cứ thử, nhưng declare thẳng unsigned / signed vẫn hay hơn. Nếu module của bạn cần dùng cả toán unsigned và signed, dùng cả hai thư viện std_logic_unsigned và std_logic_signed sẽ có conflict.

        Comment


        • #94
          vâng cảm ơn bác. Có lẻ tui sẽ thử lại với bộ full adder signed xem sao, vì mấy cách trên không hiệu quả. Ở tài liệu ISE XST User Guide, xilinx họ có example về đủ các kiểu adder, cả full adder unsigned chỉ trừ mỗi cái full adder signed là hổng có, lại làm khó nhau rồi . Điều này làm tui thấy một điều thú vị là : Chuyện tưởng chừng đơn giản nhưng lại không phải thế.

          Comment


          • #95
            Thực ra chúng ta mải lo việc tìm ra sự khác nhau mà quên đi nguyên lý cơ bản khi biểu diễn âm dương dưới dạng số nhị phân (số âm là phần bù 2 của số dương).

            Thực ra máy tính chỉ biết thực hiện phép cộng nhị phân. Khi chúng ta muốn cộng hai số thập phân có dấu thì chúng ta đã sử dụng nguyên lý bù 2 để biểu diễn chúng dưới dạng nhị phân => giúp máy tính có thể thực hiện được.

            Và do đó, khi bạn đổi kiểu thì giá trị thập phân thay đổi nhưng giá trị nhị phân vẫn từng ấy số 0 và số 1 (không có sự thay đổi) nên kết quả vẫn vậy.

            => Bạn có thể kiểm chứng điều này !!!

            Để có thể view được kết quả thì bạn view chúng dưới dạng số nguyên trong chương trình mô phỏng. Bạn có thể thực hiện lại với hai số bất kỳ với độ dài vector cho phép không tràn.

            Thử một ví dụ:
            Signed: 3 + (-4) = -1 (biểu diễn dưới dạng nhị phân 1111)
            Unsigned: 3 + 12 = 15 (biểu diễn dưới dạng nhị phân là 1111). Chú ý khi này giá trị của toán hạng thứ hai không còn là -4 nữa mà là 12
            Last edited by yesme@; 25-07-2007, 21:44.


            Comment


            • #96
              Cuối cùng thì cũng ra được như ý rồi mấy bác .
              Đây là ví dụ của xilinx (tui sửa lại một chút):
              ---------------------------------
              library ieee;
              use ieee.std_logic_1164.all;
              use ieee.std_logic_arith.all;
              use ieee.std_logic_signed.all;

              entity adders_4 is
              port( A,B : in std_logic_vector(3 downto 0);
              CI : in std_logic;
              SUM : out std_logic_vector(3 downto 0);
              CO : out std_logic);
              end adders_4;

              architecture archi of adders_4 is
              signal tmp: std_logic_vector(4 downto 0);
              begin
              tmp <= conv_std_logic_vector((conv_integer(A) + conv_integer(B) +
              conv_integer(CI)),5);
              SUM <= tmp(3 downto 0);
              CO <= tmp(4);
              end archi;
              -------------------------
              Ở ví dụ này nếu chọn :
              A = "0011" (là + 3 )
              B = "1101" (là -3 )
              thì tmp là "00000"
              Ngược lại nếu đổi thành:
              use ieee.std_logic_arith.all;
              use ieee.std_logic_unsigned.all;

              thì tmp là "10000"
              nên SUM vẫn là "0000" nhưng cờ tràn Co là 1.
              Mạch tổng hợp cho 2 kiểu khai báo thư viện cũng khác nhau. Vậy là OK rồi.
              Cảm ơn mấy bác đã hỗ trợ.

              @ nemesic21 :
              std_logic_arith vẫn là của Synopsis. Thường tôi dùng std_logic_1164 và numeric_std. Nói chung thì mỗi thư viện có pro & con. Bây giờ bạn đang tìm hiểu thì cứ thử, nhưng declare thẳng unsigned / signed vẫn hay hơn. Nếu module của bạn cần dùng cả toán unsigned và signed, dùng cả hai thư viện std_logic_unsigned và std_logic_signed sẽ có conflict.
              Synopsis là cái gì vậy bác ?

              Comment


              • #97
                Đấy chỉ là những trường hợp bị tràn số thì bạn mới có cờ tràn chứ với những giá trị khác thì kết quả vẫn giống nhau.


                Comment


                • #98
                  Nguyên văn bởi yesme@ Xem bài viết
                  Vì nghĩ là chú cần một ví dụ signed nên anh mới đưa một ví dụ để chú hiểu bản chất khi dùng std_logic_signed. Anh không biết là chú cần ví dụ để so sánh với unsigned. => Lần sau phải nói rõ từ đầu nhé!

                  ====> Bây giờ chú thử dùng lại ví dụ 3 + (-3) = 0 và khai báo lại tín hiệu c
                  Signal c : OUT std_logic_vector (7 downto 0);
                  Kết quả chú sẽ thấy sự khác nhau.
                  Nếu chỉ để lấy cái bít tràn thì chú quay lại cái ví dụ này với cái khai báo c như trên thì sẽ nhìn thấy kết quả 0001 0000. (Không hiểu tại sao chú lại ra kết quả là 0000 0000)
                  Kết luận cuối cùng là chúng ta vẫn không hiểu nhau lắm !!
                  Chú muốn một đường, anh hiểu ý chú một nẻo.

                  Post lên đây cái code mà nói:
                  PHP Code:
                  library ieee;
                  use 
                  ieee.std_logic_1164.all;
                  use 
                  ieee.std_logic_arith.all;
                  use 
                  ieee.std_logic_unsigned.all;

                  entity data_type is 
                  port 
                  (
                      
                  output out std_logic_vector(7 downto 0)
                  );
                  end data_type;

                  architecture behavioral of data_type is
                  signal a 
                  std_logic_vector(3 downto 0);
                  signal b std_logic_vector(3 downto 0);
                  signal c std_logic_vector(7 downto 0);
                  begin
                  <= "0011";
                  <= "1101";
                  <= conv_std_logic_vector(conv_integer(a) + conv_integer(b),8);
                  output <= c after 50 ns;
                  end behavioral
                  Lần sau thảo luận anh em mình post code lên để đỡ mất công ngồi gõ lại (dùng thẻ PHP). Đừng post code dưới dạng ảnh nhé !


                  Comment


                  • #99
                    vâng. Nếu không có tràn thì ta không nhận biết được sự khác nhau của hai thư viện trên. Nhưng chỉ cần một cái ví dụ như vậy thôi cũng là đủ để kiểm tra rồi. . Mà tui có được hỏi tiếp không nhỉ, vì còn nhiều thứ muốn hỏi lắm

                    Comment


                    • Nguyên văn bởi yesme@ Xem bài viết
                      Nếu chỉ để lấy cái bít tràn thì chú quay lại cái ví dụ này với cái khai báo c như trên thì sẽ nhìn thấy kết quả 0001 0000. (Không hiểu tại sao chú lại ra kết quả là 0000 0000)
                      Kết luận cuối cùng là chúng ta vẫn không hiểu nhau lắm !!
                      Chú muốn một đường, anh hiểu ý chú một nẻo.

                      Post lên đây cái code mà nói:
                      PHP Code:
                      library ieee;
                      use 
                      ieee.std_logic_1164.all;
                      use 
                      ieee.std_logic_arith.all;
                      use 
                      ieee.std_logic_unsigned.all;

                      entity data_type is 
                      port 
                      (
                          
                      output out std_logic_vector(7 downto 0)
                      );
                      end data_type;

                      architecture behavioral of data_type is
                      signal a 
                      std_logic_vector(3 downto 0);
                      signal b std_logic_vector(3 downto 0);
                      signal c std_logic_vector(7 downto 0);
                      begin
                      <= "0011";
                      <= "1101";
                      <= conv_std_logic_vector(conv_integer(a) + conv_integer(b),8);
                      output <= c after 50 ns;
                      end behavioral
                      Lần sau thảo luận anh em mình post code lên để đỡ mất công ngồi gõ lại (dùng thẻ PHP). Đừng post code dưới dạng ảnh nhé !
                      Vâng, sở dĩ nó ra khác nhau là vì cái code của tui (ảnh trên) là :
                      c = a + b ;
                      nên nó ra toàn 0000, mà như bác nemsic21 nói là tại vì a,b là hằng số nên cộng trực tiếp như thế làm cho c cũng là hằng nên không có lấy tràn được.
                      còn nếu viết như code của bác :
                      c <= conv_std_logic_vector(conv_integer(a) + conv_integer(b),8);
                      thì nó mới ra đúng ý .

                      2. Tui thích post ảnh là vì ảnh nó sinh động, nếu xài code mình lại mất công tô vẽ cho nó giống với cái ISE thì mất công. Nhưng bác muốn text hơn thì tui cũng condom lun .

                      Comment


                      • Topic này dài quá rồi, mình sẽ đóng topic này lại trong một vài ngày tới.


                        Comment


                        • Nguyên văn bởi thavali Xem bài viết

                          Synopsis là cái gì vậy bác ?
                          Synopsis chuyên về EDA tools, vào synopsis.com xem thử. Còn về thư viện numeric_std vs. std_logic_arith, thì vào http://dz.ee.ethz.ch/support/ic/vhdl...ources.en.html. Thư viện của IEEE là official standard, nhiều người sẽ dùng nó hơn, nhất là ở các hãng.

                          Comment


                          • Bây giờ chuyển sang FPGA (Spatan 3e) nên lại thêm cái phần Placing and Routing, theo mấy bác thì mình nên để ISE nó Placing and Routing tự động hay là mình phải chỉnh sửa trước khi cho nó Placing and Routing. Bác nào có tài liệu về Placing and Routing không giới thiệu cho tui với. xilinx nó nói khá vắn tắc về phần này, nên tui cũng chưa biết xài cái Placing and Routing như thế nào .

                            Comment


                            • Nguyên văn bởi thavali Xem bài viết
                              Bây giờ chuyển sang FPGA (Spatan 3e) nên lại thêm cái phần Placing and Routing, theo mấy bác thì mình nên để ISE nó Placing and Routing tự động hay là mình phải chỉnh sửa trước khi cho nó Placing and Routing. Bác nào có tài liệu về Placing and Routing không giới thiệu cho tui với. xilinx nó nói khá vắn tắc về phần này, nên tui cũng chưa biết xài cái Placing and Routing như thế nào .
                              Nếu bạn implement trên FPGA thì P&R được thực hiện tự động và được thông số hóa theo công nghệ của chip FPGA mà bạn đang dùng. Bạn chỉ việc định nghĩa chân vào/ra và sau đó phần mềm sẽ làm cho bạn từ A->Z (theo mình biết là như vậy).

                              Chỉ khi bạn làm ASIC thì bạn phải ngồi viết script và định nghĩa các constraints cho quá trình P&R. Cái này phụ thuộc nhiều vào công nghệ bạn nhắm tới (được cung cấp bởi foundry). Bọn mình dùng Cadence để thực hiện P&R cho ASIC.


                              Comment


                              • su khac nhau giua khai bao bien va tin hieu trong lap trinh vhdl

                                ve co ban la khong co gia khac nhau ca,.
                                chi khac la vi trí khai bao và gan tin hieu ra ma thoi. ban thu chu y trong mot so chuong trinh co su dụng 2 khai bao nay la biet ngay ma.

                                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