Thông báo

Collapse
No announcement yet.

Thiết kế cổng COM (UART) bằng Verilog

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

  • #16
    Extend khối TX để gửi 2 bytes

    Nguyên văn bởi quachtinh83 Xem bài viết
    Một bye thì truyền khá dễ rồi. Giờ em muốn truyền số liệu từ FPGA vào máy tính và số liệu của em là 2 byte. Mong bác chỉ giáo giúp.
    Vì tôi có bài sẵn về khối TX trước đây cho nên để giản tiện trong vấn đề giải thích về cách thay đổi để gửi 2 bytes như bạn quachtinh đã đề cập. Tôi sửa lại cái state machine để đặt thêm 3 states nữa cho byte thứ nhì. Code tôi sửa lại cho vấn đề đó ở dưới đây. Tôi chưa chạy thử, hy vọng các bạn giúp để thử giùm.

    Code:
    module uart_tx (
      clk, reset, tx_tick, tx_rdy, tx_reg1, tx_reg2, tx_done_o, tx_sdata_o
    );
      input clk;
      input reset;
      input tx_tick;
      input tx_rdy;
      input [7:0] tx_reg;
      output tx_done_o;
      output tx_sdata_o;
    
      parameter IDLE = 6'b000001, START1 = 6'b000010, DATA1 = 6'b000100;
      parameter STOP1 = 6'b001000, START2 = 6'b010000, DATA2 = 6'b100000;
      
      reg [5:0] st;
      reg tx_done, tx_sdata;
      reg [2:0] cnt;
      
      assign tx_done_o = tx_done;
      assign tx_sdata_o = tx_sdata;
      
      always @ (posedge clk or reset) begin
        if (reset) begin
          tx_done = 1;
          st = IDLE;
          tx_sdata = 1;
        end 
        else begin
          if (tx_tick) begin
            case (st)
              IDLE: begin
                tx_sdata = 1;
                if (tx_rdy) begin
                  st = START1;
                  tx_done = 0;
                end
              end
              START1: begin
                tx_sdata = 0;
                cnt = 0;
                st = DATA1;
              end
              DATA1: begin
                tx_sdata = tx_reg1[cnt];
                if (cnt == 7)
                  st = STOP1;
                else
                  cnt = cnt + 1;
              end
              STOP1: begin
                tx_sdata = 1;
                st = START2;
              end
              START2: begin
                tx_sdata = 0;
                cnt = 0;
                st = DATA2;
              end
              DATA2: begin
                tx_sdata = tx_reg2[cnt];
                if (cnt == 7) begin
                  st = IDLE;
                  tx_done = 1;
                end 
                else
                  cnt = cnt + 1;
              end
              default : st = IDLE;
            endcase
          end
        end
      end
    endmodule
    Chúc một ngày vui vẻ
    Tony
    email : dientu_vip@yahoo.com

    Comment


    • #17
      Cho em hỏi tí
      em cần truyền và nhận 1 file từ sram của kit DE2 lên mà hình và ngược lại
      Vậy em cần thiết kế bộ uart cho kit DE2 phải không ạ?
      còn máy tính mình dùng chương trình Hyper terminal đúng không ạ?
      cảm ơn các anh đã đọc
      mong nhận được sự trợ giúp
      vì em cần gấp

      Comment


      • #18
        hix! mình đang phải truyền xuống FPGA 13 bytes đây. Hổng lẻ mình phải viết 13 cái START, 13 cái DATA, 13 cái STOP. hix. à nhân tiện. Khi mình truyền 13 byte mà lược đồ trạng thái của mình có 13 cái START, 13 cái DATA, 13 cái STOP... thì mình có phải chỉnh lại cái output [7:0] rx_reg thành [103:0] không nhỉ?

        Comment


        • #19
          về kit spartan 3E cua xilinx em muốn dùng uart làm bộ nhận data từ máy tính rồi sẽ làm một giao tiếp lấp data từ bộ đệm của uart thực hiện các giao tiếp như i2c hoặc spi... được không mọi người, hoặc giao tiếp với một mcu qua spi hoặc i2c
          trên kit spartan 3e chỉ thấy mỗi cổng com là nối được với pc(em làm giao tiếp uart mà bị trùng với mấy anh khóa trước)

          Comment

          Về tác giả

          Collapse

          tonyvandinh A high tech engineer Tìm hiểu thêm về tonyvandinh

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

          Collapse

          Đang tải...
          X