OpenCores
URL https://opencores.org/ocsvn/pwm_with_dithering/pwm_with_dithering/trunk

Subversion Repositories pwm_with_dithering

[/] [pwm_with_dithering/] [trunk/] [testbench/] [pwm_to_voltage.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 TeroS
----------------------------------------------------------------------------------
2
-- Company:              Aboa Space Research Oy (ASRO)
3
-- Engineer:             Tero Säntti
4
-- 
5
-- Create Date:    15:02:39 01/27/2021 
6
-- Design Name:          PWM verifier
7
-- Module Name:    pwm_to_voltage - Behavioral 
8
-- Target Devices: None / Simulation ONLY
9
-- Tool versions:  None / non-specific
10
-- Description:          Calculate PWM to real voltage. Adjustable R, C and supply 
11
--                                               voltage. Auto refresh option, in case PWM is halted or keeps 
12
--                                               '0' or '1' for extended time, also usefull if RC filters are 
13
--                                               cascaded after this, and require smaller time steps.
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.NUMERIC_STD.ALL;
23
use IEEE.math_real.all;
24
 
25
entity pwm_to_voltage is
26
    Generic (
27
                                autorefresh_interval : time;
28
                                autorefresh_enabled : boolean;
29
                                supply_voltage : real:=3.3;
30
                                R : real:=100.0;
31
                                C : real:=0.0001
32
                                );
33
    Port ( pwm : in  STD_LOGIC;
34
           voltage : out real;
35
                          frequency : out real
36
                          );
37
end pwm_to_voltage;
38
 
39
architecture Behavioral of pwm_to_voltage is
40
signal cur:real:=0.0;
41
signal prev_dir:std_logic:='0';
42
signal auto:std_logic:='0';
43
 
44
begin
45
 
46
-- output mapping:
47
voltage <= cur;
48
 
49
doit:process(pwm,auto)
50
variable time_diff:time;
51
variable real_time_diff_sec:real;
52
variable last_update:time:= 0 ns;
53
begin
54
        time_diff := now - last_update;
55
        real_time_diff_sec:=(real(time_diff/(1 ps)))/1000000000000.0;
56
        if prev_dir='0' then
57
                cur <= cur*((2.71828182845904523536028747135266249775724709369995 ** ((0.0-real_time_diff_sec)/(R*C))));
58
        else
59
                cur <= cur + (supply_voltage-cur)*(1.0-(2.71828182845904523536028747135266249775724709369995 ** ((0.0-real_time_diff_sec)/(R*C))));
60
        end if;
61
        last_update := now;
62
        prev_dir <= pwm;
63
end process;
64
 
65
autorefresh:process
66
   begin
67
                if autorefresh_enabled then
68
                        auto <= '0';
69
                        wait for autorefresh_interval;
70
                        auto <= '1';
71
                        wait for autorefresh_interval;
72
                else
73
                        auto <= '0';
74
                        wait;
75
                end if;
76
   end process;
77
 
78
 
79
freq_monitor:process(pwm)
80
variable up_time:time;
81
begin
82
if pwm='1' then
83
        frequency <= 1000000000000.0 / ((now - up_time)/1.0 ps);
84
        up_time := now;
85
end if;
86
end process;
87
 
88
end Behavioral;
89
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.