Nexys 4 Kartı kullanarak PWM ile Sinüs Üretme

Aşağıda Nexys 4 karıt üzerinde PWM kullanarak sinüs üreten VHDL kodu verilmiştir.

2015-04-28

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5. use IEEE.MATH_REAL.ALL;
  6.  
  7. entity pwm is
  8.     generic(    
  9.         SISTEM_FREKANSI : integer := 100_000_000;
  10.         COZUNURLUK : integer := 16;
  11.         ORNEK_SAYISI : integer := 128
  12.              
  13.     );    
  14.     Port(
  15.         in_clk : in std_logic;
  16.         in_rst : in std_logic;
  17.         out_data : out std_logic
  18.  
  19.     );
  20. end pwm;
  21.  
  22. architecture Behavioral of pwm is
  23.    
  24.     type t_Veri_Tablosu is array (0 to ORNEK_SAYISI - 1) of integer;
  25.      -- range 0 to  COZUNURLUK;
  26.     constant MAX_FREKANS : integer :=
  27.      SISTEM_FREKANSI / (COZUNURLUK * ORNEK_SAYISI);
  28.    
  29.     function f_Veri_Olusturma(COZUNURLUK, ORNEK_SAYISI : integer)
  30.      return t_Veri_Tablosu is
  31.         variable v_Veri_Tablosu : t_Veri_Tablosu;        
  32.     begin
  33.         for n_i in 0 to ORNEK_SAYISI - 1 loop
  34.             v_Veri_Tablosu(n_i) :=  integer(real(COZUNURLUK/ 2 )
  35.             + real((COZUNURLUK-1)/ 2) *
  36.             sin(real(n_i) / real(ORNEK_SAYISI) * 1.0 * 2.0 * MATH_PI));
  37.         end loop;        
  38.         return v_Veri_Tablosu;                
  39.     end f_Veri_Olusturma;
  40.    
  41.     constant c_Veri_Tablosu :  t_Veri_Tablosu :=
  42.      f_Veri_Olusturma(COZUNURLUK, ORNEK_SAYISI);
  43.     signal r_cnt : integer range 0 to COZUNURLUK;
  44.     signal r_data_cnt : integer range 0 to ORNEK_SAYISI - 1;
  45.     signal r_clk_cnt : std_logic_vector(3 downto 0);
  46.     signal r_clk : std_logic;
  47.  
  48. begin
  49.  
  50.     r_clk <= in_clk;--r_clk_cnt(r_clk_cnt'high);
  51.    
  52.     process(r_clk, in_rst)
  53.     begin
  54.         if in_rst = '1' then
  55.             r_cnt <= 0;
  56.         elsif rising_edge(r_clk) then
  57.             if r_cnt = COZUNURLUK - 1 then
  58.                 r_cnt <= 0;
  59.             else
  60.                 r_cnt <= r_cnt + 1;
  61.             end if;            
  62.         end if;
  63.    end process;
  64.    
  65.    process(r_clk, in_rst)
  66.    begin
  67.        if in_rst = '1' then
  68.            r_data_cnt <= 0;
  69.        elsif rising_edge(r_clk) then
  70.             if r_cnt = COZUNURLUK - 1 then
  71.                 if r_data_cnt = ORNEK_SAYISI - 1 then
  72.                     r_data_cnt <= 0;
  73.                 else
  74.                     r_data_cnt <= r_data_cnt + 1;
  75.                 end if;
  76.             end if;            
  77.        end if;
  78.   end process;
  79.  
  80.     process(r_clk)
  81.     begin
  82.         if rising_edge(r_clk) then
  83.              if r_cnt < c_Veri_Tablosu(r_data_cnt) then
  84.                 out_data <= '0';
  85.              else
  86.                 out_data <= '1';
  87.              end if;
  88.         end if;
  89.     end procesS;
  90.      
  91. end Behavioral;