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

Cara menggunakan Prosedur di VHDL

Prosedur adalah jenis subprogram dalam VHDL yang dapat membantu kita menghindari pengulangan kode. Terkadang muncul kebutuhan untuk melakukan operasi yang identik di beberapa tempat di seluruh desain. Meskipun membuat modul mungkin berlebihan untuk operasi kecil, seringkali prosedur yang Anda inginkan.

Prosedur dapat dideklarasikan dalam wilayah deklaratif mana pun. Ruang lingkup prosedur akan dibatasi di mana pun itu dideklarasikan, arsitektur, paket, atau proses. Setiap kali Anda memanggil prosedur, itu akan berperilaku seperti kode prosedur dimasukkan dari mana ia dipanggil.

Prosedur tidak mengembalikan nilai seperti fungsi, tetapi Anda dapat mengembalikan nilai dengan mendeklarasikan out atau inout sinyal dalam daftar parameter.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Sintaks dasar untuk membuat prosedur adalah:
procedure <procedure_name> (signal|variable|constant <name1> : in|out|inout <type>;
                            signal|variable|constant <name2> : in|out|inout <type>;
                            ... ) is
    <declarations_for_use_within_the_procedure>
begin
    <code_performed_by_the_procedure_here>
end procedure;

Daftar parameter prosedur mendefinisikan input dan outputnya, seperti modul mini. Ini bisa menjadi sinyal atau konstanta, tetapi tidak seperti modul, itu juga bisa menjadi variabel. Anda dapat mendeklarasikan objek antara kata kunci "adalah" dan "mulai" yang hanya valid di dalam prosedur. Ini mungkin termasuk konstanta, variabel, tipe, subtipe, dan alias, tetapi bukan sinyal.

Tidak seperti fungsi, prosedur mungkin berisi pernyataan tunggu. Oleh karena itu, mereka sering digunakan di meja uji seperti BFM sederhana untuk mensimulasikan antarmuka, atau untuk memeriksa keluaran dari perangkat yang sedang diuji (DUT).

Olahraga

Pada tutorial sebelumnya kita membuat modul timer menggunakan pernyataan If-then-else bersarang. Setiap level If-then-Else di dalam If-then-Else lainnya menambah kerumitan desain, dan menjadi kurang terbaca. Pada setiap level logika, pada dasarnya kita melakukan operasi yang sama pada sekumpulan sinyal yang berbeda. Tidakkah ada cara yang lebih baik untuk melakukan ini?

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

Kode terakhir untuk prosedur testbench :

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

entity T19_ProcedureTb is
end entity;

architecture sim of T19_ProcedureTb 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.T19_Timer(rtl)
    generic map(ClockFrequencyHz => ClockFrequencyHz)
    port map (
        Clk     => Clk,
        nRst    => nRst,
        Seconds => Seconds,
        Minutes => Minutes,
        Hours   => Hours);

    -- Process for generating 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 menggunakan prosedur:

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

entity T19_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 T19_Timer is

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

    procedure IncrementWrap(signal   Counter   : inout integer;
                            constant WrapValue : in    integer;
                            constant Enable    : in    boolean;
                            variable Wrapped   : out   boolean) is
    begin
        Wrapped := false;
        if Enable then
            if Counter = WrapValue - 1 then
                Wrapped := true;
                Counter <= 0;
            else
                Counter <= Counter + 1;
            end if;
        end if;
    end procedure;

begin

    process(Clk) is
        variable Wrap : boolean;
    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

                -- Cascade counters
                IncrementWrap(Ticks, ClockFrequencyHz, true, Wrap);
                IncrementWrap(Seconds,             60, Wrap, Wrap);
                IncrementWrap(Minutes,             60, Wrap, Wrap);
                IncrementWrap(Hours,               24, Wrap, Wrap);

            end if;
        end if;
    end process;

end architecture;

Jendela bentuk gelombang di ModelSim, memperbesar garis waktu di mana Minutes sinyal sedang membungkus:

Analisis

Kita dapat melihat dari bentuk gelombang bahwa pembungkus sinyal masih bekerja seperti pada tutorial sebelumnya. Itu karena kita belum benar-benar mengubah fungsi pada modul, hanya cara penerapannya.

Item pertama pada daftar parameter untuk IncrementWrap prosedurnya adalah Counter sinyal. Dideklarasikan menggunakan arah inout agar prosedur dapat membaca dan menyetel nilainya.

Item kedua dan ketiga pada daftar parameter adalah konstanta. Ini berarti bahwa nilai yang Anda masukkan di sini akan muncul sebagai konstanta di dalam dari prosedur. WrapValue masukan bersama dengan Enable input menentukan apakah Counter sinyal ditambah atau dibungkus.

Item terakhir pada daftar parameter adalah variabel dengan arah out . Tujuan dari keluaran ini adalah untuk menginformasikan pemanggil tentang prosedur yang dibungkus oleh penghitung. Kami menggunakannya di sini seperti nilai kembalian.

Dalam proses utama kami memiliki empat panggilan ke IncrementWrap prosedur. Setiap panggilan berikutnya menggunakan Wrap variabel untuk mengaktifkan penghitungan. Ini tidak akan berhasil jika kita menggunakan sinyal alih-alih variabel, karena nilai sinyal hanya diperbarui saat proses tidur. Kami membutuhkan nilai output dari satu panggilan prosedur untuk digunakan sebagai input untuk panggilan di baris berikutnya. Jadi, itu harus berupa variabel.

Bawa Pulang

Pergi ke tutorial berikutnya »


VHDL

  1. Pernyataan Prosedur - Contoh VHDL
  2. Bagaimana Kami Menggunakan Molibdenum?
  3. Cara membuat daftar string di VHDL
  4. Bagaimana menghentikan simulasi di testbench VHDL
  5. Cara membuat pengontrol PWM di VHDL
  6. Cara menghasilkan angka acak di VHDL
  7. Cara menggunakan Prosedur dalam Proses di VHDL
  8. Cara menggunakan Fungsi Tidak Murni di VHDL
  9. Cara menggunakan Fungsi di VHDL
  10. Cara Menggunakan Penggiling Pemotong