summaryrefslogtreecommitdiff
path: root/2004/n/fpga
diff options
context:
space:
mode:
authorgalmes2004-04-17 12:30:33 +0000
committergalmes2004-04-17 12:30:33 +0000
commitbf43f96467369c8ce632a18766c04760ca233193 (patch)
treef23989e8291a27847069ee7ccf9e90b887dd35d7 /2004/n/fpga
parent8b312363990e2df76a1085fa9120ea6467a88c1b (diff)
pwm : refit
Diffstat (limited to '2004/n/fpga')
-rw-r--r--2004/n/fpga/src/pwm/clk1us.vhd43
-rw-r--r--2004/n/fpga/src/pwm/convert_pwm.vhd41
-rw-r--r--2004/n/fpga/src/pwm/pwm_generator.vhd74
3 files changed, 139 insertions, 19 deletions
diff --git a/2004/n/fpga/src/pwm/clk1us.vhd b/2004/n/fpga/src/pwm/clk1us.vhd
index 082e4ec..3614b5a 100644
--- a/2004/n/fpga/src/pwm/clk1us.vhd
+++ b/2004/n/fpga/src/pwm/clk1us.vhd
@@ -4,44 +4,49 @@
--Auteur : Fidèle GAFAN
--Module générateur d'horloge 1us-périodique(0,992us en réalité)
--
---REMARQUE(S):changer inc si CLK#32MHz
+--REMARQUE(S):changer compt si CLK#32MHz
--Les calculs ont été faits avec CLK=32MHz
--donc 31*(1/CLK)=1us
---d'où inc=31
+--d'où compt=31
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
+
+use work.nono_const.all;
+use work.pwm_const.all;
+
--ENTITY
entity clk1us is
port (
RST : in std_logic;
- CLK : in std_logic; --32MHz
+ CLK : in std_logic; --40MHz
CLK1USOUT : out std_logic
);
end entity;
+
--ARCHITECTURE
-architecture clk1usbehav of clk1us is
-signal inc : integer range 0 to 31;-- nombres de cycles de clk necessaires
- --pour 1us decremente
+architecture RTL of clk1us is
+ -- nombres de cycles de clk necessaires pour 1us incrémente.
+ signal compt: T_OCTET;
begin
- process(RST,CLK)
- begin
+ process(RST,CLK)
+ begin
if (RST = '1') then
- CLK1USOUT<='0';
- inc<=31; --31,25 normalement
+ CLK1USOUT <= '0';
+ compt <= x"00";
elsif (CLK'event and CLK = '1') then
- inc<=((inc)-1);
- if (inc=30) then
- CLK1USOUT<='1';
+ compt <= compt + x"01";
+ if (compt = x"00") then -- 30
+ CLK1USOUT <= '1';
else
- CLK1USOUT<='0';
- if (inc=0) then
- inc<=30;
- end if;
+ CLK1USOUT <= '0';
+ if (compt = (PWM_NB_CYCLE_1US - x"01")) then
+ compt <= x"00"; -- 30
+ end if;
end if;
end if;
- end process;
-end clk1usbehav;
+ end process;
+end RTL;
diff --git a/2004/n/fpga/src/pwm/convert_pwm.vhd b/2004/n/fpga/src/pwm/convert_pwm.vhd
new file mode 100644
index 0000000..a3ab92e
--- /dev/null
+++ b/2004/n/fpga/src/pwm/convert_pwm.vhd
@@ -0,0 +1,41 @@
+-------------------------------------------------------------------------------
+--convert_pwm.vhd
+--Eurobot 2004 : APB Team
+--Auteur : Fidèle GAFAN
+--Module générateur des PWM
+--
+--REMARQUE(S):changer tccompt,q et data_out
+-- 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=PWM_VALUE_MIN.
+--*Si DATACOMPT=255,on veut que T2 vale 1,5ms donc on initialise Q à la valeur
+--Q=1,5ms/1us=PWM_VALUE_MAX.
+--*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-0)]
+-------------------------------------------------------------------------------
+--LIBRARY
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+use ieee.std_logic_arith.all;
+
+use work.nono_const.all;
+use work.pwm_const.all;
+
+--ENTITY
+entity convert_pwm is
+port (
+ data_in : in T_OCTET;
+ data_out : out T_DOUBLE_OCTET --duree pdt laql la sortie
+ );
+end entity;
+
+
+architecture RTL of convert_pwm is
+begin
+ data_out <= (PWM_VALUE_MIN + (data_in * PWM_INC_INT));
+
+end RTL;
diff --git a/2004/n/fpga/src/pwm/pwm_generator.vhd b/2004/n/fpga/src/pwm/pwm_generator.vhd
new file mode 100644
index 0000000..e650de4
--- /dev/null
+++ b/2004/n/fpga/src/pwm/pwm_generator.vhd
@@ -0,0 +1,74 @@
+-------------------------------------------------------------------------------
+--pwm_generator.vhd
+--Eurobot 2004 : APB Team
+--Auteur : Fidèle GAFAN
+--Registre à décalage affichantles signaux PWM
+--
+
+-- Les commentaires ci-dessous ne sont plus trop valables.
+-- Maintenant, clock = 40MHz
+
+
+--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
+-- = 20161 cycles.
+
+-- 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)]
+
+------------------------------------------------rtl de la sortie pwm en fonction de tc
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+use ieee.std_logic_arith.all;
+
+use work.nono_const.all;
+use work.pwm_const.all;
+
+--ENTITE
+entity pwm_generator is
+ port (
+ rst : in std_logic;
+ clk : in std_logic;
+ pwm_in : in T_DOUBLE_OCTET;
+ pwm_out : out std_logic
+ );
+end entity;
+
+--ARCHITECTURE
+architecture RTL of pwm_generator is
+ signal compt : T_DOUBLE_OCTET;
+ signal reg : T_DOUBLE_OCTET;
+begin
+
+ process(rst, clk)
+ begin
+ if (rst = '1') then
+ compt <= x"0000";
+ reg <= x"0000";
+ pwm_out <= '0';
+ elsif (clk'event and clk = '1') then
+ compt <= compt + x"0001";
+ if (compt <= reg) then
+ pwm_out <= '1';
+ else
+ pwm_out <= '0';
+ if (compt = PWM_NB_CYCLE_20MS) then
+ compt <= x"0000";
+ reg <= pwm_in;
+ end if;
+ end if;
+ end if;
+ end process;
+
+end RTL;