summaryrefslogtreecommitdiff
path: root/2004/n/fpga/src/pwm/comptvalue3.vhd
diff options
context:
space:
mode:
Diffstat (limited to '2004/n/fpga/src/pwm/comptvalue3.vhd')
-rw-r--r--2004/n/fpga/src/pwm/comptvalue3.vhd85
1 files changed, 85 insertions, 0 deletions
diff --git a/2004/n/fpga/src/pwm/comptvalue3.vhd b/2004/n/fpga/src/pwm/comptvalue3.vhd
new file mode 100644
index 0000000..0e32003
--- /dev/null
+++ b/2004/n/fpga/src/pwm/comptvalue3.vhd
@@ -0,0 +1,85 @@
+-------------------------------------------------------------------------------
+--comptvalue3.vhd
+--Eurobot 2004 : APB Team
+--Auteur : Fidèle GAFAN
+--Module générateur des PWM
+--
+--REMARQUE(S):changer tccompt,q et valuecompt
+-- si CLK#32MHz et/ou qu'on modifie les valeurs de référence de T1
+-- et T2
+-- Tcmax=20ms/1us=20161cycles.
+--*Si DATACOMPT=0,on veut que T2 vale 0,5ms donc on initialise Q à la valeur
+--Q=0,5ms/1us=505.
+--*Si DATACOMPT=255,on veut que T2 vale 1,5ms donc on initialise Q à la valeur
+--Q=1,5ms/1us=1515.
+--*Pour toute autre valeur de DATACOMPT comprise entre les deux précédentes et
+--différentes de ces dernières,on initialise Q avec
+--Q=(0,5ms/1us)+(DATACOMPT*min[((1,5ms-0,5ms)/1us)/(255-1)]
+-------------------------------------------------------------------------------
+--LIBRARY
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+use ieee.std_logic_arith.all;
+--ENTITY
+entity comptvalue3 is
+ port (
+ RST : in std_logic;
+ CLK : in std_logic;
+ CLK1USCOMPT : in std_logic;
+ loadcompt : in std_logic;
+ datacompt : in integer range 0 to 255;
+ tccompt : buffer integer range 0 to 20161; --nb de cycles de clk1us
+ --pour avoir 19,999712ms
+ valuecompt : out integer range 0 to 1000000 --duree pdt laql la sortie
+ --reste haute. Decrementee
+ );
+end entity;
+
+architecture comptvalue3behav of comptvalue3 is
+
+ signal q : integer range 0 to 1000000; --recevra duree courante de valuecompt pdt laql la sortie
+ --reste haute. Decrementee
+
+begin
+ process(RST,CLK)
+constant tcmax :integer range 0 to 20161:=20161;
+ begin
+ if (RST = '1') then --initialisation horloge 19,999712ms et
+ --premier chargement sans load;role du
+ --state1.Prochain etat : calcul ie state3
+ tccompt<=tcmax;
+ if (datacompt=0) then
+ q<=505; --pour data=0 la periode doit durer 0,5ms
+ elsif (datacompt=255) then
+ q<=1515;--pour data=255 la periode doit durer 1,5ms
+ elsif((datacompt/=0)and (datacompt/=255)) then
+ q<=(505+(datacompt*3));
+ end if;
+ elsif (CLK'event and CLK = '1') then
+ if (CLK1USCOMPT='1') then
+ if (loadcompt = '1') then --state2 chargement pendant 1 clk1us
+ tccompt<=tcmax; --pdt 1 clk1us, tccompt reste max
+ if (datacompt=0) then
+ q<=505;--pour data=0 la periode doit durer 0,5ms
+ elsif (datacompt=255) then
+ q<=1515;--pour data=255 la periode doit durer 1,5ms
+ elsif ((datacompt/=0)and (datacompt/=255)) then
+ q<=(505+(datacompt*3));
+ end if;
+ elsif (loadcompt='0') then --state3 calculs a chaque front de clk1us
+ if (q/=0) then
+ q<=(q-1);
+ tccompt<=((tccompt)-1);
+ elsif (q=0) then
+ q<=0;
+ tccompt<=((tccompt)-1);
+ end if;
+ end if;--if du loadcompt
+ end if;--if du clk1us
+ end if;--elsif du clk et rst
+ end process;
+ valuecompt <= q;
+end comptvalue3behav;
+
+