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

  • #46
    Nguyên văn bởi thavali Xem bài viết
    Xin hỏi Tiếp là mấy bác có biết dòng coolrunner-II ( con XC2C256 ) hoạt động ở tần số tối đa là bao nhiêu không ? Trong datasheet nó ghi tới 250 MHz , nhưng tui không tin tưởng lắm. ( ảnh )

    As fast as 5.7 ns pin-to-pin delays : nếu theo As fast as 5.7 ns pin-to-pin delays thì tần số phải khoảng chừng 150 MHz, hổng lẻ cao thể sao nhỉ, vi điều khiển thì chừng vài chục MHz là cùng, mà sao thằng này cao thế làm tui nghi nghi...
    Theo mình hiểu thì đấy là tần số hoạt động tối đa được tính giữa lối vào và lối ra của một gate.
    Hoạt động thực của mạch còn phụ thuộc vào cái thiết kế của bạn nữa.


    Comment


    • #47
      Nguyên văn bởi yesme@
      Theo mình hiểu thì đấy là tần số hoạt động tối đa được tính giữa lối vào và lối ra của một gate.
      Hoạt động thực của mạch còn phụ thuộc vào cái thiết kế của bạn nữa.
      vậy chữ gate ở đây là các cổng cơ bản ( AND, OR) bên trong chip hả bác, thế mà tui cứ nghĩ pin to pin là pin của con chip chứ. Như thế thì pin to pin delays = 5.7 ns chỉ là thông số tượng trưng thôi nhỉ. Vì ta đâu có biết chính xác là mình xài bao nhiêu cổng AND, OR cho cái project của mình, nên thời gian trì hoãn PIN to PIN (PIN của chip) cũng không tính được, nên cũng không biết chính xác tồi số tối đa là bao nhiêu ?
      Last edited by thavali; 09-06-2007, 17:56.

      Comment


      • #48
        Chào bác titeo, yesme@ , tui gặp một rắc rối như thế này:

        Tui viết một bộ đếm (xem ảnh) có chức năng như sau:
        Khi có clkcounter_enable = 1 bộ đếm sẽ bắt đầu đếm từ 0 tới 2 rồi dừng ( giữ nguyên giá trị 2), khi nào tín hiệu counter_enable = 0 thì bộ đếm bị đưa về 0 và khi counter_enable =1 thì bắt đầu đếm trở lại . Mạch phần cứng được tổng hợp tui thấy đúng với ý định của mình, nhưng khi chạy simulation thì trật lất, kết quả là ngõ ra counter_port (1:0) không đếm gì cả mà luôn bằng 0, (xem ảnh).
        Tui lấy mạch sau khi được synthesis (ảnh) vẽ lại trên schematic, rồi synthesis và simulation thì kết quả đúng (ảnh). Thế mới khó hiểu chứ. Mà cái mạch được tạo ra do synthesis từ code và synthesis từ schematic là giống hệt nhau (view technology schematic).
        Chú thích nhỏ: Dòng 29 đến dòng 34 là tui muốn OR ngõ ra counter_port(1) với clk , nhưng counter_port(1)và clk khác loại nên tui phải dùng biến temp để cùng loại bit với clk.

        Tui bị sai chỗ nào vậy bác ? Sao khi mình viết code rồi chạy simulate thì không đúng, còn lấy mạch tổng hợp được ( tổng hợp từ code) ,vẽ lại trên schematic rồi simulate thì lại đúng ???
        Attached Files
        Last edited by thavali; 15-06-2007, 18:57.

        Comment


        • #49
          Lỗi này rất thường gặp khi dùng ISE. Đó là do khai báo thư viện không chính xác. Bạn chỉ cần bỏ đi thư viện std_logic_arith la chạy tốt thôi. Còn để giải thích tại sao chi tiết thì bạn nên đọc thêm về package chuẩn của IEEE. Ở đây Tí chỉ xin nói vắn tắt là như vầy:
          1. Khi tính toán số học bạn phải chọn giữa 2 loại thư viện sau:
          - std_logic_arith
          - std_logic_signed hoặc std_logic_unsigned
          - Chỉ được dùng 1 trong 2 loại này, không được khai báo cả 2.
          2. Khi tính toán cho số không dấu thì dùng std_logic_unsigned với signal là kiểu std_logic_vector. Khi tính cho số có dấu thì dùng std_logic_signed với kiểu std_logic_vector.
          3. Khi tính toán có cả không dấu và có dấu thì dùng std_logic_arith với kiểu SIGNED hoặc UNSIGNED.
          Làm cái gì nữa đây?

          Comment


          • #50
            Chào bác titeo, tui đã bỏ đi thư viện std_logic_arith rồi mà sao kết quả mô phỏng vẫn không đúng , bác có thể xem qua đoạn code của tui (ảnh trên ) có chỗ nào không đúng không ạ. Các biến (count) và tín hiệu (clk,clock) tui đã thay đổi đủ kiểu từ bit đến std_logic, integer nhưng kết quả vẫn không đúng. Tui đoán là do sử sụng tín hiệu clock không đúng , vì bác pery có nói là tín hiệu sẽ được gán khi kết thúc process, như vậy lúc mô phỏng, khi có xung clk (rising) thì tín hiệu clock vẫn chưa có giá trị, vì clock bằng 0 nên counter_port(1:0) cũng bằng 0. Nhưng trong đoạn chương trình tôi đã nối : clock <= clk or temp ; với nhau rồi mà, Sai chỗ nào nhỉ ?
            Last edited by thavali; 16-06-2007, 15:07.

            Comment


            • #51
              Nguyên văn bởi thavali Xem bài viết
              Chào bác titeo, tui đã bỏ đi thư viện std_logic_arith rồi mà sao kết quả mô phỏng vẫn không đúng , bác có thể xem qua đoạn code của tui (ảnh trên ) có chỗ nào không đúng không ạ. Các biến (count) và tín hiệu (clk,clock) tui đã thay đổi đủ kiểu từ bit đến std_logic, integer nhưng kết quả vẫn không đúng. Tui đoán là do sử sụng tín hiệu clock không đúng , vì bác pery có nói là tín hiệu sẽ được gán khi kết thúc process, như vậy lúc mô phỏng, khi có xung clk (rising) thì tín hiệu clock vẫn chưa có giá trị, vì clock bằng 0 nên counter_port(1:0) cũng bằng 0. Nhưng trong đoạn chương trình tôi đã nối : clock <= clk or temp ; với nhau rồi mà, Sai chỗ nào nhỉ ?

              Vấn đề của bạn nằm ở chỗ tín hiệu clock. Mình chắc chắn với bạn sau hai chu kỳ thì tín hiệu clock luôn bằng '1' và do đó "counter_port" vẫn giữ nguyên giá trị vốn có của nó. Bạn view tất cả các tín hiệu có trong mạch để nhìn thấy rõ điều này (mình không có thời gian để gõ lại code của bạn).

              Ngoài ra cũng nên xem lại cách viết chương trình của bạn vì có vẻ không ổn.

              Chúc vui vẻ,


              Comment


              • #52
                Ngoài ra cũng nên xem lại cách viết chương trình của bạn vì có vẻ không ổn.
                cảm ơn bác yesme@, Lúc đầu tui viết khác , nhưng nó không chịu chạy, sửa riết nên nó ra như thế . Tui vừa tìm được chỗ sai rồi, đó là tui đã không khai báo tín hiệu clk trong danh sách nhạy.
                process(clock) --> hổng chạy.
                process(clock,clk) --> chạy ngon lành (simulation).
                còn những thứ khác trong chương trình vẫn giữ nguyên.
                về mô phỏng thì ok, để mai tui test lại trên board thử xem đúng không thì mới chắc chắn được
                chúc bác cuối tuần vui vẻ.

                Comment


                • #53
                  Nguyên văn bởi thavali Xem bài viết
                  cảm ơn bác yesme@, Lúc đầu tui viết khác , nhưng nó không chịu chạy, sửa riết nên nó ra như thế . Tui vừa tìm được chỗ sai rồi, đó là tui đã không khai báo tín hiệu clk trong danh sách nhạy.
                  process(clock) --> hổng chạy.
                  process(clock,clk) --> chạy ngon lành (simulation).
                  còn những thứ khác trong chương trình vẫn giữ nguyên.
                  về mô phỏng thì ok, để mai tui test lại trên board thử xem đúng không thì mới chắc chắn được
                  chúc bác cuối tuần vui vẻ.
                  Chính là vấn đề đó, clock sẽ không thay đổi giá trị sau 2 chu kỳ clk rong khi process dựa vào event của clock => counter_port chỉ nhận giá trị "00"

                  Mình chỉ suy luận như vậy thôi.


                  Comment


                  • #54
                    Chính là vấn đề đó, clock sẽ không thay đổi giá trị sau 2 chu kỳ clk rong khi process dựa vào event của clock => counter_port chỉ nhận giá trị "00"
                    Đúng là như vậy đó bác, tui đã test lại trên board và chạy ngon lành. Đoạn chương trình này là một module trong chương trình chính, nên chắc còn nhiều cái phải học hỏi từ các bác, lần đầu tiên làm về VHDL thật thú vị

                    Comment


                    • #55
                      library IEEE;
                      use IEEE.STD_LOGIC_1164.ALL;
                      use IEEE.STD_LOGIC_ARITH.ALL;
                      use IEEE.STD_LOGIC_UNSIGNED.ALL;

                      entity sensitize is
                      port (clk_RAM :in std_logic ;
                      counter_enable :in std_logic ;
                      output :out std_logic_vector(4 downto 0 ));
                      end sensitize;

                      architecture Behavioral of sensitize is

                      begin
                      process
                      (clk_RAM)
                      variable count : integer range 0 to 25 :=0 ;

                      begin

                      if counter_enable='0' then
                      count:= 0 ;
                      elsif clk_RAM='1' and clk_RAM'event then
                      count := count + 1 ;
                      end if;
                      if count = 25 then
                      count:= 0 ;
                      end if;
                      count :=count - 1 ;(hỏi chỗ này )
                      output <= conv_std_logic_vector(count,5);
                      end process ;

                      end Behavioral;



                      Bác yesme@,titeo cho hỏi là với đoạn code trên, khi có cạnh xuống (falling) của clk thì biến count có giảm giá trị không ? Từ đó có thể suy ra bộ counter này không đếm được (vì khi có cạnh lên (rissing) thì count đếm lên nhưng khi có cạnh xuống (falling) thì nó giảm xuống, nên kết quả là nó hổng đếm ), điều này đúng không bác ?. counter_enable chỉ là tín hiệu điều khiển , tui còn dùng hàm conv_std_logic_vector để chuyển từ integer sang std_logic_vector, hàm này trong thư viện STD_LOGIC_ARITH, nhưng khi mô phỏng nó báo lỗi là : ERROR:HDLCompilers:26 - "E:/Work/Xilinx/test_sensitive_list/test_tbw.tfw" line 44 expecting ';', found ')'
                      kết quả là tui không thể simulation xem có đúng như suy luận trên không .
                      (dạo này mạng chỗ tui chậm nên khó post bài quá, cả ngày trời mà tui cũng ko post được, xin lỗi vì đã spam

                      Comment


                      • #56
                        Cái source của bạn Tí mô phỏng lại được, dùng ISE 8.1. Nhưng mà kết quả không đúng như bạn nghĩ. Tí thấy là code của bạn viết rất tùy ý do đó kết quả cũng sẽ tùy thuộc vào chương trình mô phỏng nữa. Nếu bạn nên muốn thử một kiến thức nào đó thì Tí thấy là nên viết đoạn code để thử nhưng cũng nên tuân theo các qui tắc đề nghị của ngôn ngữ, nếu bạn viết lung tung để thử thì cũng không có tác dụng mấy đâu .
                        Làm cái gì nữa đây?

                        Comment


                        • #57
                          Nguyên văn bởi titeo Xem bài viết
                          Cái source của bạn Tí mô phỏng lại được, dùng ISE 8.1. Nhưng mà kết quả không đúng như bạn nghĩ. Tí thấy là code của bạn viết rất tùy ý do đó kết quả cũng sẽ tùy thuộc vào chương trình mô phỏng nữa. Nếu bạn nên muốn thử một kiến thức nào đó thì Tí thấy là nên viết đoạn code để thử nhưng cũng nên tuân theo các qui tắc đề nghị của ngôn ngữ, nếu bạn viết lung tung để thử thì cũng không có tác dụng mấy đâu .
                          Tui cũng đã mô phỏng được trên bản 9.1, kết quả gần đúng như dự đoán, mạch sẽ đếm xuống , vì khi có rising thì đồng thời count vừa tăng 1 (vì elsif clk_RAM='1' and clk_RAM'event then
                          count := count + 1 ; ) rồi lại giảm 1 (vì lại có: count :=count - 1; ), kết quả là count không thay đổi ở rising, khi có falling câu lệnh:
                          count :=count - 1 ; count lại được thực hiện giảm, nên kết quả là cứ 1 clk (gồm 1 rising và 1 falling) thì count giảm 1. Kết quả mô phỏng là như vậy, nhưng khi xem mạch synthesis ta thấy nó không tạo ra mạch như vậy, kết quả là khi nộp vào chip không thể chạy được. ===> Giữa mô phỏng và mạch synthesis không phải lúc nào cũng giống nhau. Bác titeo xem lại mạch synthesis có đúng như vậy không nhé , Mà tui thấy thằng ISE 9.1 này hay lỗi hơn thằng ISE 8 mới ghét chứ.
                          2. Trong ISE khi ta mô phỏng, ta chỉ nhận được dạng sóng của ngõ vào(in) hay ra(out), còn các tín hiệu bên trong chip (do chương trình ta viết ) thì không quan sát được dạng sóng, bác có biết cách nào để quan sát được dạng sóng của các tín hiệu này không ?

                          Comment


                          • #58
                            có thể dùng ModelSIm, nó cho phép quan sát các tín hiệu bên trong thiết kế.
                            Làm cái gì nữa đây?

                            Comment


                            • #59
                              Ngoài ModelSim của MG, bạn có thể dùng SimVision của Cadence.


                              Comment


                              • #60
                                Ngoài ModelSim của MG, bạn có thể dùng SimVision của Cadence.
                                Cách link SimVision với ISE như thế nào vậy bác ? ( Bác vui lòng chỉ vắn tắt cho tui vài dòng được không nhỉ, để tui mò cho nhanh ). Mà hình như SimVision chỉ là 1 tool (add-on) trong bộ Allegro Design của CADENCE thôi phải không bác ?
                                Last edited by thavali; 26-06-2007, 10:28.

                                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