Thông báo

Collapse
No announcement yet.

trễ khi mô phỏng timing

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

  • trễ khi mô phỏng timing

    Cho mình hỏi tại sao khi mình mô phỏng timing trong quatus thì lại xảy ra trễ giữa tín hiệu vào và tín hiệu ra.Và trễ này la do những nguyên nhân nào???

    2.Theo mình được biết thì khi sử dụng 1 signal bên trong process thi khi thực hiện hết process đó thi signal mới được thực thi(điều này khác với variable).Vậy thì sẽ mất khoảng bao lâu để thực hiện xong process này.Các process khác nhau thì có thời gian thực hiện là như nhau hay khác nhau.
    Mong được giải đáp.Thân!!

  • #2
    Nguyên văn bởi nam_bkfet Xem bài viết
    Cho mình hỏi tại sao khi mình mô phỏng timing trong quatus thì lại xảy ra trễ giữa tín hiệu vào và tín hiệu ra.Và trễ này la do những nguyên nhân nào???
    Khi mô phỏng, trễ đó được tạo ra do người viết code . Trễ đó bắt chước phần cứng thật. Phần cứng thật có trễ là do điện tích ở đầu ra di chuyển chậm hơn điện tích ở đầu vào của mạch điện.
    Bạn có thể tìm hiểu thêm về 2 loại trễ và cách mô phỏng chúng: inertial delay (trễ quán tính) và transport delay (trễ vận chuyển).


    2.Theo mình được biết thì khi sử dụng 1 signal bên trong process thi khi thực hiện hết process đó thi signal mới được thực thi(điều này khác với variable).Vậy thì sẽ mất khoảng bao lâu để thực hiện xong process này.Các process khác nhau thì có thời gian thực hiện là như nhau hay khác nhau.
    Mong được giải đáp.Thân!!
    Khái niệm thời gian trong process là khái niệm "ảo". Không phải thời gian thật nên ko nói được 1 process mất bao lâu để thực hiện.

    process(clk)
    begin
    if(rising_edge(clk)) then
    a1 <= b1;
    a2 <= b2;
    end if;
    end process;

    câu lệnh 1 sẽ được thực hiện "trước" câu lệnh 2, "trước" ở đây là chương trình mô phỏng thực hiện trước. Khi tạo thành phần cứng thật, 2 thanh ghi a1 và a2 sẽ thay đổi thời gian cùng lúc ngay tại sườn lên của clock.

    process(clk)
    begin
    if(rising_edge(clk)) then
    a1 <= b1;
    if(cond='1') then a1 <= b2; end if; //A1 ko phai a2
    end if;

    Trong trường hợp này: nếu cond == 1 thì câu lệnh thứ 2 sẽ được thực hiện sau câu lệnh thứ 1, như vậy a1 sẽ có giá trị của b2. Nói cách khác, tại cùng 1 sườn của clock, câu lệnh 1 thực hiện trước, câu lệnh 2 viết đè lên a1 với giá trị b2.

    Process trên sẽ tạo ra 1 thanh ghi a1, ở cổng vào của thanh ghi a1 là 1 multiplexer, có 2 input : b1 và b2. multiplexer này điểu khiển bởi tín hiệu cond: cond = 1 thì b2 sẽ vào
    thanh ghi, cond = 0 thì b1 sẽ vào thanh ghi.

    Đây là khái niệm quan trọng, bạn nên học kĩ. VHDL ko phải lập trình, mà là mô tả phần cứng.

    Comment


    • #3
      process(clk)
      begin
      if(rising_edge(clk)) then
      b2 <= b1;
      a1 <= b2;
      end if;
      end process;
      Cái này tạo ra 2 thanh ghi, a1 và b2 nối tiếp nhau.

      process(clk)
      variable b2: std_logic;
      begin
      if(rising_edge(clk)) then
      b2 := b1 and c1;
      a1 <= b2;
      end if;
      end process;
      Cái này tạo ra 1 thanh ghi a1, b2 là đầu ra của cổng and. Thay vì viết như vậy, mình chỉ toàn dùng signal thôi, hiếm khi dùng variable

      signal b2: std_logic;
      process(clk)
      begin
      if(rising_edge(clk)) then
      a1 <= b2;
      end if;
      end process;
      b2 <= b1 and c1;
      Các sách hay giải thích là tín hiệu thì cuối process mới thực hiện :-s. Mình nghĩ hiểu mạch điện trước rồi học VHDL thì dễ hơn.

      Comment


      • #4
        bạn có thể nói cho mình rõ hơn về "thời gian ảo" trong process được ko.thanks so much!!!
        Nếu mình có 1 đoạn code như sau:

        signal a,b,c:std_logic;
        process(clk)
        if(rising_edge(clk)) then
        b<=a;
        c<=b;
        end if;
        end process;

        Comment


        • #5
          Nguyên văn bởi nam_bkfet Xem bài viết
          bạn có thể nói cho mình rõ hơn về "thời gian ảo" trong process được ko.thanks so much!!!
          Nếu mình có 1 đoạn code như sau:

          signal a,b,c:std_logic;
          process(clk)
          if(rising_edge(clk)) then
          b<=a;
          c<=b;
          end if;
          end process;
          Sẽ có 2 chương trình đọc code của ban:
          - Chương trình tổng hợp (synthesis tool). Chương trình này sẽ dịch ra 2 thanh ghi, b và c. Vì đó là cách mô tả một D-flipflop. Chương trình tổng hợp làm theo kiểu template. Nó sẽ có sẵn các định dạng trong library, và sẽ khớp code bạn viết vào library để hiểu xem bạn muốn mô tả cái gì.

          - Chương trình mô phỏng. Chương trình mô phỏng phải mô phỏng sao cho có kết quả đúng như mạch điện được tổng hợp. Nó sẽ chạy như sau: Ngay khi phát hiên được clock thay đổi (vì clk nằm trong sensitivity list) nó sẽ chạy process này. Nếu đúng là clock đang lên, nó sẽ thực hiện các statement b<= a và c <= b cùng một lúc nhưng mà là từ trên xuống dưới.
          ++++ cùng một lúc: nghĩa là b và c sẽ thay đổi giá trị cùng 1 lúc ngay tại sườn lên của clock
          ++++ từ trên xuống dưới: các statement trong process là tuần tự, được mô phỏng từ trên xuống dưới.

          Do đó không có khái niệm thời gian của process. Process sẽ được kích hoạt khi các tín hiệu trong sensitivity list thay đổi giá trị và thực hiện 1 lần rồi nằm chờ.

          Bạn thấy gì ko hợp lý thì cứ hỏi tiếp hoặc lấy ví dụ để làm rõ thêm

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X