Trang 1/2 12 cuốicuối
kết quả từ 1 tới 10 trên 13
  1. #1
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    ho chi minh city
    Bài viết
    8
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Mặc định hỏi cách tạo trễ trong verilog

    em đang quen làm kit DE1,định lập trình hiển thị ra led 7 đoạn,đoạn code em thế này:
    module dem_mp7doan(s1,reset,clk,led,digit);
    input s1,reset,clk;
    output[7:0]led;
    output digit;
    reg [7:0]led;
    reg [3:0]bcd;
    wire digit;
    assign digit=1'b1;
    always @(posedge clk)
    begin
    if(reset==1'b1) bcd<=4'b1001;
    else if (s1==1'b1)bcd <= bcd-1'b1;
    if (bcd==4'b0) bcd<=4'b1001;

    end
    always @(posedge clk) begin
    case(bcd)
    4'b0000:led=8'b1000000;
    4'b0001:led=8'b1111001;
    4'b0010:led=8'b0100100;
    4'b0011:led=8'b0110000;
    4'b0100:led=8'b0011001;
    4'b0101:led=8'b0010010;
    4'b0110:led=8'b0000010;
    4'b0111:led=8'b1111000;
    4'b1000:led=8'b0000000;
    4'b1001:led=8'b0010000;
    default:led=8'b1111111;
    endcase
    end
    endmodule
    (còn thiếu phần tạo trễ để thấy hiển thị trên led), em chưa bit thêm vào đâu, trong quartus thì trong mô phỏng trễ thì dùng #(t), còn để hiển thị thực thì sao hả các huynh, em có nghe nói dùng vòng đếm nhưng chưa bit sao....mong các huynh chỉ giáo ...em chân thành cảm ơn.

  2. #2
    Tham gia
    Oct 2009
    Nơi Cư Ngụ
    Hà Nội
    Bài viết
    25
    Thanks
    4
    Thanked 0 Times in 0 Posts

    Mặc định

    Mình gần 3 năm rồi không động tới verilog nên không nhớ lắm nhưng muốn tạo trễ thì bạn làm thêm 1 module clk, delay hoàn toàn theo clk này, và gán clk này với clock của board (vì bạn hiển thị led theo posedge clk)

  3. #3
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    HCM
    Bài viết
    22
    Thanks
    42
    Thanked 1 Time in 1 Post

    Mặc định

    mỉnh nghĩ rằng #t cũng có tác động đến mạch thực tế hóa ra chỉ trong mô phỏng thoy ah? Xung clk bạn nhập bằng key hay dùng clk của broad, clk ngoài?

  4. #4
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    ho chi minh city
    Bài viết
    8
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Mặc định

    Trích Nguyên văn bởi sirapple Xem bài viết
    Mình gần 3 năm rồi không động tới verilog nên không nhớ lắm nhưng muốn tạo trễ thì bạn làm thêm 1 module clk, delay hoàn toàn theo clk này, và gán clk này với clock của board (vì bạn hiển thị led theo posedge clk)
    huynh có thể hướng dẫn rõ hơn cho em ko, em mới làm cũng còn gà lắm(cách gán clk mình tạo ra với cuacuar board). cảm ơn huynh nhiều.

  5. #5
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    ho chi minh city
    Bài viết
    8
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Mặc định

    Trích Nguyên văn bởi phamhiepst Xem bài viết
    mỉnh nghĩ rằng #t cũng có tác động đến mạch thực tế hóa ra chỉ trong mô phỏng thoy ah? Xung clk bạn nhập bằng key hay dùng clk của broad, clk ngoài?
    thì tại #t chỉ cho mô phỏng nên mình cần tạo trễ thực ko thể dùng được.
    mình cho clk bằng clk board. nghe nói cần tạo chương ttrinhf trễ bằng cách cho đếm(như delay trong ASSEMBLER ấy) bằng cách dùng for hay while, nhưng mình chưa biết thêm vào đâu trong đoạn code trên,

  6. #6
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    Vietnam
    Bài viết
    37
    Thanks
    0
    Thanked 29 Times in 18 Posts

    Mặc định

    Trích Nguyên văn bởi hoc_hoi Xem bài viết
    thì tại #t chỉ cho mô phỏng nên mình cần tạo trễ thực ko thể dùng được.
    mình cho clk bằng clk board. nghe nói cần tạo chương ttrinhf trễ bằng cách cho đếm(như delay trong ASSEMBLER ấy) bằng cách dùng for hay while, nhưng mình chưa biết thêm vào đâu trong đoạn code trên,
    Lâu rồi không code verilog nên mình dùng pseudo-code, nhưng giả sử nếu như phần code của bạn là đúng thì bạn chỉ cần thêm thế này

    alway @(clk_board)
    begin
    if reset then
    count =0
    clk = '0'
    else
    count ++
    end

    if count = max_count
    clk = not clk
    count = 0
    end

    ở đây clk_board là tần số max(chu kì nhỏ nhất) mà board cung cấp, bạn thay đổi max_count để có được độ trễ cần thiết, trong các đoạn always còn lại thì clk chỉ nên coi là tín hiệu bình thường (mình không nhớ Quatus mới có hỗ trợ multiple clock synthesis hay không).

    Phưong pháp đơn giản hơn là bạn put cái clk_board vào đầu của 1 chuỗi nối tiếp DFF, dùng đầu ra của chuỗi này định thời cho hiển thị LED, cách này chỉ tạo được clk = (2^N)*clk_board. N là số DFF. Dùng vòng for và generate để tổng hợp chuỗi DFF

  7. #7
    Tham gia
    Oct 2009
    Nơi Cư Ngụ
    Hà Nội
    Bài viết
    25
    Thanks
    4
    Thanked 0 Times in 0 Posts

    Mặc định

    quả thật là mình không nhớ lắm để giúp bạn và cũng đang ko có tool cũng như board.
    bạn làm theo mtcmos, tạo clk_board để lấy clock của board (xem trên board xem bao nhiêu Mhz để đổi ra ms)
    dùng một biến đếm, như trên là max_count (có thể tính được thời gian delay = max_count x clk_board = a (s)
    a là delay bạn cần

  8. #8
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    ho chi minh city
    Bài viết
    8
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Mặc định

    cảm ơn các bác đã quan tâm đến em,
    em đã giải quyết xong vấn đề này rồi các bác ạ. em cho đếm để delay, chạy oke rùi. sau đây là code em cho đếm từ 0000--->9999 (vì mới tập viết nên còn gà lém)các bác tham khảo rùi cho em ý kiến nhé, thank các bác.

    http://www.mediafire.com/?1cct7t1rayz7i0i

  9. #9
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    HCM
    Bài viết
    22
    Thanks
    42
    Thanked 1 Time in 1 Post

    Mặc định

    vậy hóa ra vấn đề của bạn là làm cho xung clock chậm lại thoy chứ gì? vậy chỉ vc dùng 1 biến COUNT n bít để đếm lên theo xung CLOCK_50, oy từ đó lấy ra 1 xung clk mới clk=COUNT[n], với T(clk)=T(CLOCK_50)*2^(n-1)
    cũng ko cần phải đếm từng số thành phần phần như code của bạn, như thế sẽ không đồng bộ. bạn có thể dùng 1 biến đủ để đếm tới 9999 sau đó xem cách chuyển đổi BCD tại đậy http://www.google.com.vn/search?sour..._BCD_Converter
    Còn nếu làm theo cách của bạn thì mỗi bcd phải reset khi bcd=9 chứ ko thể là 10 như khi ta làm trong C đc.

  10. #10
    Tham gia
    Sep 2010
    Nơi Cư Ngụ
    ho chi minh city
    Bài viết
    8
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Mặc định

    Trích Nguyên văn bởi phamhiepst Xem bài viết
    vậy hóa ra vấn đề của bạn là làm cho xung clock chậm lại thoy chứ gì? vậy chỉ vc dùng 1 biến COUNT n bít để đếm lên theo xung CLOCK_50, oy từ đó lấy ra 1 xung clk mới clk=COUNT[n], với T(clk)=T(CLOCK_50)*2^(n-1)
    cũng ko cần phải đếm từng số thành phần phần như code của bạn, như thế sẽ không đồng bộ. bạn có thể dùng 1 biến đủ để đếm tới 9999 sau đó xem cách chuyển đổi BCD tại đậy http://www.google.com.vn/search?sour..._BCD_Converter
    Còn nếu làm theo cách của bạn thì mỗi bcd phải reset khi bcd=9 chứ ko thể là 10 như khi ta làm trong C đc.
    mình thấy code của mình đếm đồng bộ đó chứ. còn nói như bạn reset khi bcd=1001 thì mới ko đồng bộ vừa lên 8 đã về 0 ngay không hiển thị giá trị 9(vì khi bcd vừa =9 thì đã reset rùi nên ko thấy), vậy nên mình mới reset ở bcd=10.
    còn đây là code mình mới vết thêm cho đếm ngược hay xuôi điều được ko cần reset lại (mong các bác xem rùi cho ý kiến , em chân thành cảm ơn):
    http://www.mediafire.com/?30thdru197pe9l4

Trang 1/2 12 cuốicuối

Quyền Sử Dụng Ở Diễn Ðàn

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •