Thông báo

Collapse
No announcement yet.

Cần giúp đỡ về đoạn code Verilog sau(write & read sram trên kit DE2)

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

  • Cần giúp đỡ về đoạn code Verilog sau(write & read sram trên kit DE2)

    Mình có tham khảo 1 vài đoạn code tham khảo về việc lưu và đọc giá trị vào SRAM trên kit DE2 . Sau đó mình đã thực hiện đoạn code sau để test thử - nhưng vẫn chưa thực hiện dc!!Mong anh em xem giúp và chỉ giáo thêm dùm!! Ý tưởng của đoạn code này như sau : Ta dùng KEY[3] để tăng 1 biến lên (Y4 và Y5 -mỗi lần nhấn KEY[3] biến tăng thêm 1) . Khi bấm KEY[0] cũng sẽ tăng 1 biến thêm 1(biến Y0 và Y1) nhưng với điều kiện là giá trị biến do KEY[0] điều khiển phải nhỏ hơn giá trị của KEY[3] thì biến mới dc tăng lên. Khi giá trị biến do KEY[0] điều khiển lớn hơn giá trị biến KEY[3] thì việc tăng KEY[0] sẽ dc thay bằng việc xuất giá trị từ SRAM ra . Khi KEY[1] dc nhấn thì giá trị của biến KEY[0] sẽ dc lưu vào SRAM . Và sau đây là đoạn code chi tiết mình làm , mời anh em tham khảo :
    module test(CLOCK_50,SRAM_CE_N,SRAM_WE_N,SRAM_OE_N,SRAM_A DDR,SRAM_DQ,KEY,SRAM_UB_N,SRAM_LB_N);
    input CLOCK_50;
    input [3:0]KEY;
    output SRAM_UB_N;
    output SRAM_LB_N;
    output SRAM_CE_N;
    output SRAM_WE_N;
    output SRAM_OE_N;
    output [17:0]SRAM_ADDR;
    inout [15:0]SRAM_DQ;
    reg [17:0]add,add1;
    reg [3:0]Y1,Y0,Y2,Y3,Y4,Y5,Y6,Y7;
    reg [17:0]addr_reg;
    reg [15:0]data_reg;
    reg we;
    reg [7:0]dataout1,dataout2;
    assign SRAM_CE_N = 0;
    assign SRAM_0E_N = 0;
    assign SRAM_UB_N = 0;
    assign SRAM_LB_N = 0;
    assign SRAM_WE_N = we;
    assign SRAM_ADDR = addr_reg;
    assign SRAM_DQ = data_reg;
    // KEY[0] goi so
    // KEY[1] cancel
    // KEY[3] lay so thu tu
    always @(negedge KEY[1])
    begin
    add1=add1+1;
    end
    always @(negedge KEY[3])
    begin
    Y4=Y4+1;
    if(Y4>9)
    begin
    Y4=0;
    Y5=Y5+1;
    end
    end
    always @(posedge CLOCK_50)
    begin
    if(KEY[0]==1'b0)
    begin
    Y6=Y5*10+Y4;
    Y7=Y3*10+Y2;
    if(Y6>Y7)
    begin
    we=0;
    addr_reg=18'b000000000000010000;
    Y0=Y0+1;
    if(Y0>9)
    begin
    Y0=0;
    Y1=Y1+1;
    end
    data_reg={4'b0,Y0,4'b0,Y1};
    Y2=SRAM_DQ[11:8];
    Y3=SRAM_DQ[3:0];
    end
    else
    begin
    we=1;
    addr_reg=add;
    Y0=SRAM_DQ[11:8];
    Y1=SRAM_DQ[3:0];
    end
    end
    if(KEY[1]==1'b0)
    begin
    we=0;
    addr_reg=add1;
    data_reg={4'b0,Y0,4'b0,Y1};
    end
    end
    always @(negedge KEY[0])
    begin
    if(Y6<Y7)
    begin
    add=add+1;
    end
    else
    add=add;
    end

    endmodule

    Ví dụ : Khi nhấn KEY[3] cho Y4Y5 đến giá trị 13 chẳng hạn . Ta bắt đầu bấm KEY[0] để cho Y0Y1 tăng lên. Nếu tại giá trị Y0Y1 bằng 04 ta bấm KEY[1] thì 04 dc lưu vào SRAM tại địa chỉ đầu , bấm tiếp KEY[0] tăng Y0Y1 lên tiếp , giả sử tại Y0Y1 = 08 ta lại bấm KEY[1] thì 08 lại dc lưu vào SRAM tại địa chỉ kế tiếp . Ta tiếp tục bấm KEY[0] lên , khi Y0Y1 vượt qua giá trị 13 ta bấm KEY[0] thì sẽ xuất SRAM ra cho Y0Y1=4 , nhấn tiếp sẽ xuất tiếp giá trị 8 và ngừng . Đó là ý tưởng mình muốn thực hiện . Tuy nhiên vẫn chưa làm dc . Rất mong nhận dc sự giúp đỡ của anh em . Xin chân thành cảm ơn anh em . .
    Last edited by achilles86; 20-05-2009, 21:24.

  • #2
    ờ,mình thì chuyên code VHDL thôi,nhưng giao tiếp Sram trên DE1 và DE2 thì mình làm rồi.Mình nghĩ là để giao tiếp với Sram đúng thì bạn cần phải có một khối Sram_ctroller làm giao diện giữa FPGA và Sram.Vì Sram hoạt động không đồng bộ,không cần xung đồng hồ,và nó có cái timing riêng,nên nếu tín hiệu bạn đưa ra không đáp ứng đúng cái timing diagram của nó thì nó...chạy sai.

    Về việc địa chỉ đưa ra Sram,nếu muốn test,bạn có thể tạo ra một bộ đếm 18 bit cho...đơn giản,chia tần đưa vào bộ đếm đấy cho nó chạy chậm thôi.

    Chúc bạn thành công,có thời gian mình phải xem qua cú pháp Verilog mới đc,nhìn thì hiểu,nhưng để debug thì...hơi khó

    Comment


    • #3
      Giao tiếp với SRAM có phải là trọng điểm của bài tập này? Nếu phải thì trước tiên bạn nên đơn giản hóa như sadmind đã gợi ý để làm quen với SRAM interface.


      Nếu không, thì như đã từng gợi ý, bạn nên dùng coregen để tạo FIFO core, hoặc nếu bạn muốn, tự code FIFO. Nếu bạn tìm hiểu kỹ, những gì bạn muốn và nên làm hoàn toàn tương ứng với design của một FIFO.


      Chẳng hạn như, bạn muốn
      write SRAM[0] = 4 (write address = 0)
      write SRAM[1] = 8 (write address = 1)

      read SRAM[0] = 4 (read address = 0)
      read SRAM[1] = 8 (read address = 1)

      nhưng lỡ như chúng ta bấm để đọc read addr = 2 trước khi trước khi data được viết đến write addr = 2, chúng ta phải làm như thế nào? ==> tương ứng với trường hợp checking for FIFO underflow ... và một số vấn đề khác mình đã gợi ý lần trước.


      Nếu assumption của bài tập / sản phẩm là người sử dụng sẽ không bao giờ thao tác lầm lẫn, thì đương nhiên là FIFO (với error checking) là không cần thiết.

      Comment

      Về tác giả

      Collapse

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

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

      Collapse

      Đang tải...
      X