Thông báo

Collapse
No announcement yet.

STOP_WATCH code VHDL

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

  • STOP_WATCH code VHDL

    share cho các tập viết phần cứng bằng vhdl như mình. Đã test thành công trên kit DE2-115
    Bài toán như sau:
    1. đếm từ 0 đến 5p.
    2. hiển thị giá trị lên LED 7 đoạn

    CODE :
    -- Thiet ke dong ho dem den 5p
    -- hien thi gia tri len 4 LED 7 doan tren KIT DE2-115
    -- Разработан: Н. Д. Ч.
    -- data: 17/06/2013

    Library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;

    entity STOP_WATCH_5P is

    port( clk: in std_logic; -- xung clock 50MHz pin Y2
    clr, go: in std_logic; -- xoa hoac cho phep bat dau dem giay -- SW1, SW0
    d3,d2,d1,d0: buffer std_logic_vector(3 downto 0); --d3 = kim phut, d2 chuc giay, d1 giay, d0 0.1s --gan vao pin LEDR14..0
    HEX3, HEX2, HEX1, HEX0: out std_logic_vector(0 to 6) -- hien thi gia tri tuong ung cua d3 d2 d1 d0
    );
    end STOP_WATCH_5P;

    architecture arch of STOP_WATCH_5P is

    constant Divider: integer := 5000_000;
    signal d3_reg, d2_reg, d1_reg, d0_reg: std_logic_vector(3 downto 0):=(others => '0');
    signal d3_next, d2_next, d1_next, d0_next: std_logic_vector(3 downto 0):= (others => '0');
    signal ms_tick: std_logic;
    begin

    process(clk, go, clr) -- dem den 5tr thi tang 0.1s
    variable count : integer := 0;
    begin
    if clr = '1' then
    count := 0;
    elsif rising_edge(clk) then
    d3_reg <= d3_next;
    d2_reg <= d2_next;
    d1_reg <= d1_next;
    d0_reg <= d0_next;
    if go = '1' then
    count := count + 1;
    if count = divider then -- dem den 5tr = x"4C4B40"
    ms_tick <= '1';
    count := 0;
    else
    ms_tick <= '0';
    end if;
    end if;
    end if;
    end process;

    process(d0_reg, d1_reg, d2_reg, d3_reg, ms_tick, clr)

    begin
    d0_next <= d0_reg;
    d1_next <= d1_reg;
    d2_next <= d2_reg;
    d3_next <= d3_reg;
    if clr = '1' then
    d0_next <= (others => '0');
    d1_next <= (others => '0');
    d2_next <= (others => '0');
    d3_next <= (others => '0');
    elsif ms_tick = '1' then
    if d0_reg /= "1001" then
    d0_next <= d0_reg + 1;
    else
    d0_next <= "0000";
    if d1_reg /= "1001" then
    d1_next <= d1_reg + 1;
    else
    d1_next <= "0000";
    if d2_reg /= "0101" then
    d2_next <= d2_reg + 1;
    else
    d2_next <= "0000";
    if d3_reg /= "0100" then
    d3_next <= d3_reg + 1;
    else
    d3_next <= "0000";
    end if;
    end if;
    end if;
    end if;
    end if;
    end process;
    d0 <= d0_reg;
    d1 <= d1_reg;
    d2 <= d2_reg;
    d3 <= d3_reg;

    with d3 select
    HEX3 <= "0000001" when "0000",-- so 0
    "1001111" when "0001",--1
    "0010010" when "0010",--2
    "0000110" when "0011",--3
    "1001100" when "0100",--4
    "0100100" when "0101",--5
    "0100000" when "0110",--6
    "0001111" when "0111",--7
    "0000000" when "1000",--8
    "0000100" when "1001",--9
    "1111111" when others; -- LED toi
    with d2 select
    HEX2 <= "0000001" when "0000",-- so 0
    "1001111" when "0001",--1
    "0010010" when "0010",--2
    "0000110" when "0011",--3
    "1001100" when "0100",--4
    "0100100" when "0101",--5
    "0100000" when "0110",--6
    "0001111" when "0111",--7
    "0000000" when "1000",--8
    "0000100" when "1001",--9
    "1111111" when others; -- LED toi
    with d1 select
    HEX1 <= "0000001" when "0000",-- so 0
    "1001111" when "0001",--1
    "0010010" when "0010",--2
    "0000110" when "0011",--3
    "1001100" when "0100",--4
    "0100100" when "0101",--5
    "0100000" when "0110",--6
    "0001111" when "0111",--7
    "0000000" when "1000",--8
    "0000100" when "1001",--9
    "1111111" when others; -- LED toi
    with d0 select
    HEX0 <= "0000001" when "0000",-- so 0
    "1001111" when "0001",--1
    "0010010" when "0010",--2
    "0000110" when "0011",--3
    "1001100" when "0100",--4
    "0100100" when "0101",--5
    "0100000" when "0110",--6
    "0001111" when "0111",--7
    "0000000" when "1000",--8
    "0000100" when "1001",--9
    "1111111" when others; -- LED toi


    end arch;

  • #2
    Bạn có gặp vấn đề khi xóa không?
    Bạn thư nhấp nhấp nút clr nhanh thật nhanh xem có chuyện gì xảy ra không?

    Comment


    • #3
      nếu dùng nút nhấn (vd : KEY0) trên kit thì fai viết lệnh chống rung phím ấn nữa. Nên mình dùng SW để chuyển mức logic 1 và 0.

      Comment


      • #4
        Nguyên văn bởi zhounguyen Xem bài viết
        nếu dùng nút nhấn (vd : KEY0) trên kit thì fai viết lệnh chống rung phím ấn nữa. Nên mình dùng SW để chuyển mức logic 1 và 0.
        Bạn thử bật "go" và "clr" cùng lúc ... rối thả clr ra ... Mính nghĩ sẽ có đôi lúc đồng hồ của bạn không clear về 0 hoàn toàn ...

        Comment


        • #5
          anh Jeffieu comment kinh nhỉ, kinh nghiệm đầy mình, đọc code thôi mà như thấy được cả mạch.

          Comment


          • #6
            Nguyên văn bởi klong19 Xem bài viết
            anh Jeffieu comment kinh nhỉ, kinh nghiệm đầy mình, đọc code thôi mà như thấy được cả mạch.
            Ực, không dám.
            50% kinh nghiệm, 50% đoán mò ...

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            • nguyendinhvan
              Trả lời cho Vấn đề về tốc độ quay
              bởi nguyendinhvan
              Sử dụng động cơ servor, hoặc lắp thêm một cái encoder vào động cơ bước. Encoder sẽ kiểm soát động cơ có quay hoặc đứng im.
              14-12-2025, 19:50
            • Andrea14
              Vấn đề về tốc độ quay
              bởi Andrea14
              Chào mọi người,

              Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
              12-12-2025, 12:42
            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            Đang tải...
            X