Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

Cara membuat pengatur waktu di VHDL

Dalam tutorial sebelumnya kita telah menggunakan wait for pernyataan untuk menunda waktu dalam simulasi. Tapi bagaimana dengan modul produksi? wait for pernyataan tidak dapat digunakan untuk itu. Itu hanya berfungsi dalam simulasi karena kita tidak bisa begitu saja memberi tahu elektron di sirkuit untuk berhenti selama waktu tertentu. Jadi bagaimana kita bisa melacak waktu dalam modul desain?

Jawabannya hanyalah menghitung siklus clock. Setiap desain digital memiliki akses ke sinyal clock yang berosilasi pada frekuensi tetap yang diketahui. Oleh karena itu, jika kita mengetahui bahwa frekuensi clock adalah 100 MHz, kita dapat mengukur satu detik dengan menghitung seratus juta siklus clock.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Untuk menghitung detik dalam VHDL, kita dapat mengimplementasikan pencacah yang menghitung jumlah periode jam yang lewat. Ketika penghitung ini mencapai nilai frekuensi clock, 100 juta misalnya, kita tahu bahwa satu detik telah berlalu dan saatnya untuk menambah penghitung lain. Sebut saja ini penghitung Detik.

Untuk menghitung menit, kita dapat menerapkan penghitung Menit lain yang bertambah ketika 60 detik telah berlalu. Demikian pula, kita dapat membuat penghitung Jam untuk menghitung jam, bertambah ketika 60 menit telah berlalu.

Kita dapat melanjutkan pendekatan ini untuk menghitung hari, minggu, dan bulan juga. Kami dibatasi oleh sumber daya fisik yang tersedia dalam teknologi yang mendasarinya serta panjang penghitung versus frekuensi clock.

Seiring bertambahnya panjang penghitung, jelas itu menghabiskan lebih banyak sumber daya. Namun reaksinya juga akan lebih lambat karena rantai kejadiannya menjadi lebih panjang.

Olahraga

Dalam video tutorial ini kita akan belajar cara membuat modul timer di VHDL:

Kode terakhir untuk timer testbench :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T18_TimerTb is
end entity;

architecture sim of T18_TimerTb is

    -- We're slowing down the clock to speed up simulation time
    constant ClockFrequencyHz : integer := 10; -- 10 Hz
    constant ClockPeriod      : time := 1000 ms / ClockFrequencyHz;

    signal Clk     : std_logic := '1';
    signal nRst    : std_logic := '0';
    signal Seconds : integer;
    signal Minutes : integer;
    signal Hours   : integer;

begin

    -- The Device Under Test (DUT)
    i_Timer : entity work.T18_Timer(rtl)
    generic map(ClockFrequencyHz => ClockFrequencyHz)
    port map (
        Clk     => Clk,
        nRst    => nRst,
        Seconds => Seconds,
        Minutes => Minutes,
        Hours   => Hours);

    -- Process for generating the clock
    Clk <= not Clk after ClockPeriod / 2;

    -- Testbench sequence
    process is
    begin
        wait until rising_edge(Clk);
        wait until rising_edge(Clk);

        -- Take the DUT out of reset
        nRst <= '1';

        wait;
    end process;

end architecture;

Kode terakhir untuk modul pengatur waktu :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T18_Timer is
generic(ClockFrequencyHz : integer);
port(
    Clk     : in std_logic;
    nRst    : in std_logic; -- Negative reset
    Seconds : inout integer;
    Minutes : inout integer;
    Hours   : inout integer);
end entity;

architecture rtl of T18_Timer is

    -- Signal for counting clock periods
    signal Ticks : integer;

begin

    process(Clk) is
    begin
        if rising_edge(Clk) then

            -- If the negative reset signal is active
            if nRst = '0' then
                Ticks   <= 0;
                Seconds <= 0;
                Minutes <= 0;
                Hours   <= 0;
            else

                -- True once every second
                if Ticks = ClockFrequencyHz - 1 then
                    Ticks <= 0;

                    -- True once every minute
                    if Seconds = 59 then
                        Seconds <= 0;

                        -- True once every hour
                        if Minutes = 59 then
                            Minutes <= 0;

                            -- True once a day
                            if Hours = 23 then
                                Hours <= 0;
                            else
                                Hours <= Hours + 1;
                            end if;

                        else
                            Minutes <= Minutes + 1;
                        end if;

                    else
                        Seconds <= Seconds + 1;
                    end if;

                else
                    Ticks <= Ticks + 1;
                end if;

            end if;
        end if;
    end process;

end architecture;

Bentuk gelombang memperbesar Seconds sinyal:

Bentuk gelombang memperbesar Minutes sinyal:

Bentuk gelombang memperbesar Hours sinyal:

Analisis

Untuk menjalankan simulasi 50 jam kami memberikan perintah run 50 hr di konsol ModelSim. Lima puluh jam adalah simulasi yang sangat panjang, dan oleh karena itu kami harus menurunkan frekuensi jam di meja uji menjadi 10 Hz. Jika kita membiarkannya pada 100 MHz, simulasi akan memakan waktu berhari-hari. Adaptasi semacam itu terkadang diperlukan untuk memungkinkan kita mensimulasikan desain.

Kami mengklik kanan timeline dalam bentuk gelombang dan memilih "Grid, Timeline &Cursor Control". Saat mengubah satuan waktu dari ns ke detik, menit, dan jam, kita dapat melihat bahwa timer memang bekerja secara real-time.

Waktu timer sedikit diimbangi dari waktu simulasi karena reset modul pada awal simulasi. Ini terlihat dalam bentuk gelombang pertama di mana tanda 60 detik pada garis waktu sedikit lebih awal ketika sinyal Detik ditutup ke 0.

Perhatikan bahwa dalam simulasi, nilai penghitung diperbarui dalam waktu nol di tepi naik jam. Di dunia nyata, nilai penghitung akan membutuhkan waktu untuk menyebar dari bit pertama penghitung ke yang terakhir. Saat kami menambah panjang penghitung, kami menggunakan waktu yang tersedia dari periode jam.

Jika panjang akumulasi dari semua penghitung bertingkat menjadi terlalu panjang, kesalahan akan dihasilkan di langkah tempat dan rute setelah kompilasi. Berapa lama penghitung yang dapat Anda terapkan sebelum menggunakan seluruh periode jam tergantung pada arsitektur FPGA atau ASIC dan kecepatan jam.

Peningkatan kecepatan clock berarti bahwa rantai counter akan lebih panjang. Ini juga berarti bahwa waktu periode jam akan lebih pendek, memberikan rantai penghitung lebih sedikit waktu untuk diselesaikan.

Bawa Pulang

Pergi ke tutorial berikutnya »


VHDL

  1. Cara membuat daftar string di VHDL
  2. Cara membuat testbench berbasis Tcl untuk modul kunci kode VHDL
  3. Bagaimana menghentikan simulasi di testbench VHDL
  4. Cara membuat pengontrol PWM di VHDL
  5. Cara menghasilkan angka acak di VHDL
  6. Cara membuat penyangga cincin FIFO di VHDL
  7. Cara membuat testbench pemeriksaan mandiri
  8. Cara membuat Daftar Tertaut di VHDL
  9. Cara menggunakan Prosedur dalam Proses di VHDL
  10. Cara menggunakan Fungsi di VHDL