From bf43f96467369c8ce632a18766c04760ca233193 Mon Sep 17 00:00:00 2001 From: galmes Date: Sat, 17 Apr 2004 12:30:33 +0000 Subject: pwm : refit --- 2004/n/fpga/src/pwm/clk1us.vhd | 43 +++++++++++--------- 2004/n/fpga/src/pwm/convert_pwm.vhd | 41 +++++++++++++++++++ 2004/n/fpga/src/pwm/pwm_generator.vhd | 74 +++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 19 deletions(-) create mode 100644 2004/n/fpga/src/pwm/convert_pwm.vhd create mode 100644 2004/n/fpga/src/pwm/pwm_generator.vhd (limited to '2004/n/fpga') 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; -- cgit v1.2.3