Thông báo

Collapse
No announcement yet.

Mô phỏng ModelSim được nhưng đổ trên kit không như ý muốn

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

  • #16
    Nguyên văn bởi danbeo85 Xem bài viết
    Hi strangepheno,

    Bạn có thể cho mình biết giá trị dữ liệu và địa chỉ bạn dùng trong quá trình ghi là như thế nào và kết quả đọc ra sao không?

    ^_^
    Chào annh,
    Như anh đã biết để ghi dữ liệu vào 1 RAM ta cầu 3 yếu tố: data, address và cạnh lên của xung clock. Data được em đưa vào kit De0 thông qua port của MCU. Address để tiết kiệm port em đã thiết kế 1 khối như khối counter - đếm lên mỗi khi có cạnh xuống của MCUstrobe. Xung strobe này cũng được dùng làm write clock cho RAM. Ngoài ra, MCU còn điều khiển tín hiệu reset bộ đếm address để cho việc thực hiện ghi RAM.

    Như vậy, hoạt động của hệ thống của em gồm có. Tại cạnh xuống của MCUstrobe, giá trị address được tăng lên 1 đơn vị và đưa đến RAM cùng với tín hiệu data. Tại cạnh lên của xung strobe, data sẽ được ghi vào address tại cạnh xuống ban nãy.

    Em đổ mô phỏng được kết quả như mong muốn và tiến hành đổ lên kit nhưng thực tế các data được ghi vào 1 cách ngẫu nhiên, không theo sự kiểm soát của em. Sau đó em dùng Signal Tap để kiểm tra. Em đặt probe tại address out của khối counter, address in của RAM và Clock in của RAM (em muốn kiểm tra xem address có được đưa đến RAM đúng theo yêu cầu hay không). Em thu được kết quả 2 tín hiệu address tại probe giống nhau và tăng lên khi có cạnh xuống của strobe - đúng theo như mong muốn đồng thời trên kit kết quả cũng theo như ý muốn của em.

    Em disable file Signal Tap và đổ lên kit theo kiểu thông thường (tool -> Programing) thì kết quả vẫn không như mong đợi như ban đầu.

    Thân chào.

    Comment


    • #17
      Nguyên văn bởi strangepheno Xem bài viết
      Cám ơn anh về tài liệu. Em đã đọc và hiểu thêm 1 số vấn đề về clock. Tài liệu anh đưa hình như chưa hoàn chỉnh thì phải? Em đọc thấy thiếu vài hình và phần sau.

      Cho em hỏi vì sao ta có thể biết được các thời gian truyền mà tính toán và thiết lập cho thích hợp được vậy anh. Vd em dùng 1 đường bus để kết nối từ MCU và FPGA, em làm sao biết được tín hiệu truyền trên đường bus đó mất thời gian bao lâu để tính tần số cho phù hợp được vậy anh?

      Thiết lập contraint anh nói có phải là dùng file.sdc không anh?
      Tài liệu mình viết chưa hoàn chỉnh, bạn hiểu sơ sơ khái niệm rồi tra cứu thêm các tài liệu của Xilinx và Altera, người ta có đủ.

      Thiết lập constraint là dùng file SDC.
      Bạn mở chương trình TimeQuest sau khi compile 1 lần và thiết lập các constraint.

      Nếu bus của bạn chạy tốc độ cao ~ 100MHz. Lấy ví dụ kết nối MCU tời FPGA của bạn. Bạn cần phải làm như sau:

      - Đường truyền từ MCU tới FPGA.
      1) Bạn mở datasheet của MCU sẽ thấy có thông số delay cua Data và Address so với clock (Tcko - clock to output valid)
      2) Khi thiết kế board in-house, sẽ có chương trình mô phỏng, tính được trễ tín hiệu của bus (gọi là fly-time). Còn không có, bạn cho giá trị 1-2ns là được
      Last edited by jefflieu; 23-04-2013, 18:45.

      Comment


      • #18
        Bus của ban châm thì chưa cần constraint gì đâu.
        Danbeo85 nói đúng đó, bạn đang gặp vấn đề về thiết kế. Bạn nên code lại mạch đơn giản, dùng clock @ (posedge clock) cho đúng, chứ không phải @( ... or ...) toàn sinh ra mạch latch ...
        bạn làm đơn giản thôi

        1) Lo chỗ interface trước
        @(posedge strobe)
        reg_output <= address;//hoặc data
        Xuất output ra LED
        2) @(posedge strobe)
        address <= address + 1;
        xuất address ra các LED.

        Bạn dùng code C điều khiển công strobe của MCU ...
        ...

        Comment


        • #19
          Hi strangepheno,

          Theo như mô tả thiết kế của bạn thì bạn có thể làm cách sau:
          1) Công việc đầu tiên là đệm lại dữ liệu thông qua tín hiệu strobe
          reg [7 : 0] data_reg; // Ví dụ như data của bạn là 8 bit
          reg write_reg; // Lệnh write = 1 là ghi
          always @(posedge strobe, negedge reset_n) // nên có tín hiệu reset_n ( = 0 là tích cực) để khởi tạo các giá trị thanh ghi về 0 hay một giá trị nào đó mà bạn muốn
          begin
          if (reset_n == 1'b0)
          begin
          data_reg <= 8'd0;
          write_reg <= 1'b0;
          end
          else
          begin
          data_reg <= data_in;
          write_reg <= write_in;
          end
          end
          2) Sau khi đã đệm dữ liệu và lệnh write lại rồi thì điều khiển address tương tự như jefflieu đã gợi ý ở phần trên. Nhưng lưu ý: giá trị của address chỉ thay đổi khi có lệnh write. Do đó bạn nên dùng write_reg làm tín hiệu cho phép address counter hoạt động.

          3) Như jefflieu đã nói như trên, bạn nên kiểm tra bằng led với từng lệnh ghi đơn, dùng switch như một tín hiệu chọn address hay data_reg được xuất ra led.

          Bạn thử làm như thế xem có vấn đề gì nữa hay không?

          Chúc bạn thành công,
          ^_^

          Comment


          • #20
            Hi strangepheno,

            Do các ký tự khoảng trắng bị xóa đi trong lúc gửi bài trả lời bên code mình viết trông không được tốt. Khi bạn soạn thảo các bạn nên để ý với "coding style" nha.

            ^_^

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X