WebElektronika

PWM modul készítése VHDL nyelven

person access_time 2015.12.15.
Elkészítünk most VHDL nyelven egy PWM modult. Természetesen digitális úton állítunk elő PWM jelet.


Megvalósítunk most egy PWM modult VHDL nyelven. Az architektúrális leírás első process-ében mindig elszámolunk 0-tól 100-ig. A számlálás eredményét a "seged" signal-ban tároljuk el. A második processben összehasonlítjuk a "seged" és a "T" értékeit. A "T" a kitöltési tényező.

Amíg kisebb a "seged" a "T"-nél, addig a "KI" kimenet logikai 1-ben van. Ha "T" nagyobb, mint a "seged", akkor a kimenet állapotot vált.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity pwm is
    port(CLK, CLR : in std_logic;
        T : in std_logic_vector(7 downto 0);
        KI : out std_logic);
end pwm;

architecture BEH of PWM is
signal    seged    : std_logic_vector(7 downto 0);
begin

    process(CLK, CLR, seged)
    begin
        if CLR = '1' then
            seged <= (others => '0');
        else
            if rising_edge(CLK) then
                if seged < 10 then
                    seged <= seged + 1;
                else
                    seged <= (others => '0');
                end if;
            else
                null;
            end if;
        end if;
    end process;

    process(CLK, CLR, seged)
    begin
        if seged <= T then
            KI <= '1';
        else
            KI <= '0';
        end if;
    end process;

end BEH;

 

Először szimuláljuk le úgy a pwm modulunk működését, hogy 0-tól 10-ig számolunk el, illetve a kitöltési tényező (T) 30%. Az eredményt az első ábrán láthatjuk.

kep
1. ábra   30%-os kitöltési tényező (ST <= "00000011";)
 

Most módosítsuk az első processben a számlálási határértéket, 10 helyett legyen 100 (if seged < 100 then). Ismét szimuláljuk le a VHDL kódunk működését, ekkor már a kitöltési tényező 3% (2. ábra).

kep
2. ábra   3%-os kitöltési tényező (ST <= "00000011";)
 

Végül, módosítsuk a kitöltési tényezőt 64%-ra. Ekkor a következő szimulációs eredményt kapjuk (3. ábra).

kep
3. ábra   64%-os kitöltési tényező (ST <= "01000000";)
 

A kitöltési tényezőt a PWM modulhoz készült szimulációs tesztkörnyezetben tudjuk változtatni, az ST értékadásával.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity pwmsim is
    port(KI : out std_logic);
end pwmsim;

architecture SIM of PWMsim is
signal    SCLK, SCLR : std_logic;
signal    ST    : std_logic_vector(7 downto 0);
begin

    nev : entity webelektronika.pwm port map(SCLK, SCLR, ST, KI);

    process
    begin
        SCLK <= '0';
        ST <= "01000000";
        SCLR <= '1';
        wait for 10 ns;
        SCLR <= '0';
        wait for 10 ns;
        for i in 0 to 150 loop
            SCLK <= '1';
            wait for 10 ns;
            SCLK <= '0';
            wait for 10 ns;
        end loop;
    end process;

end SIM;