Refactor KittCarPWM to use dynamic bit lengths for PWM and timing counter

This commit is contained in:
2025-03-24 15:55:54 +01:00
parent 5db3a71766
commit 8826072328
2 changed files with 10 additions and 8 deletions

View File

@@ -2,6 +2,7 @@
LIBRARY IEEE; LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL; USE IEEE.NUMERIC_STD.ALL;
USE IEEE.MATH_REAL.ALL;
------------------------------------ ------------------------------------
ENTITY KittCarPWM IS ENTITY KittCarPWM IS
@@ -46,8 +47,9 @@ ARCHITECTURE Behavioral OF KittCarPWM IS
TYPE leds_sr_type IS ARRAY (TAIL_LENGTH - 1 DOWNTO 0) OF INTEGER RANGE led'LOW TO led'HIGH; TYPE leds_sr_type IS ARRAY (TAIL_LENGTH - 1 DOWNTO 0) OF INTEGER RANGE led'LOW TO led'HIGH;
CONSTANT MIN_KITT_CAR_STEP_NS : UNSIGNED(46 DOWNTO 0) := to_unsigned(MIN_KITT_CAR_STEP_MS * 1000000, 47); CONSTANT COUNTER_BIT_LENGTH : INTEGER := INTEGER(ceil(log2(real(MIN_KITT_CAR_STEP_MS * 1000000 * 2 ** NUM_OF_SWS - 1))));
CONSTANT BIT_LENGTH : INTEGER := 5; CONSTANT PERIOD_BIT_LENGTH : INTEGER := INTEGER(ceil(log2(real(TAIL_LENGTH))));
CONSTANT MIN_KITT_CAR_STEP_NS : UNSIGNED(COUNTER_BIT_LENGTH - 1 DOWNTO 0) := to_unsigned(MIN_KITT_CAR_STEP_MS * 1000000, COUNTER_BIT_LENGTH);
SIGNAL pwms : STD_LOGIC_VECTOR(TAIL_LENGTH - 1 DOWNTO 0) := (OTHERS => '0'); SIGNAL pwms : STD_LOGIC_VECTOR(TAIL_LENGTH - 1 DOWNTO 0) := (OTHERS => '0');
SIGNAL leds_sig : STD_LOGIC_VECTOR(NUM_OF_LEDS - 1 DOWNTO 0) := (OTHERS => '0'); SIGNAL leds_sig : STD_LOGIC_VECTOR(NUM_OF_LEDS - 1 DOWNTO 0) := (OTHERS => '0');
@@ -61,13 +63,13 @@ BEGIN
BEGIN BEGIN
PWM : PulseWidthModulator PWM : PulseWidthModulator
GENERIC MAP( GENERIC MAP(
BIT_LENGTH => BIT_LENGTH BIT_LENGTH => PERIOD_BIT_LENGTH
) )
PORT MAP( PORT MAP(
reset => reset, reset => reset,
clk => clk, clk => clk,
Ton => STD_LOGIC_VECTOR(to_unsigned(i, BIT_LENGTH)), Ton => STD_LOGIC_VECTOR(to_unsigned(i, PERIOD_BIT_LENGTH)),
Period => STD_LOGIC_VECTOR(to_unsigned(TAIL_LENGTH - 1, BIT_LENGTH)), Period => STD_LOGIC_VECTOR(to_unsigned(TAIL_LENGTH - 1, PERIOD_BIT_LENGTH)),
PWM => pwms(i - 1) PWM => pwms(i - 1)
); );
END GENERATE; END GENERATE;
@@ -76,7 +78,7 @@ BEGIN
PROCESS (clk, reset) PROCESS (clk, reset)
VARIABLE up : STD_LOGIC := '1'; -- Direction of LED movement VARIABLE up : STD_LOGIC := '1'; -- Direction of LED movement
VARIABLE leds_sr : leds_sr_type := (OTHERS => 0); -- Shift register for LED positions VARIABLE leds_sr : leds_sr_type := (OTHERS => 0); -- Shift register for LED positions
VARIABLE counter : UNSIGNED(46 DOWNTO 0) := (OTHERS => '0'); -- Timing counter VARIABLE counter : UNSIGNED(COUNTER_BIT_LENGTH - 1 DOWNTO 0) := (OTHERS => '0'); -- Timing counter
VARIABLE n_period : UNSIGNED(NUM_OF_SWS DOWNTO 0) := to_unsigned(1, NUM_OF_SWS + 1); -- Period multiplier VARIABLE n_period : UNSIGNED(NUM_OF_SWS DOWNTO 0) := to_unsigned(1, NUM_OF_SWS + 1); -- Period multiplier
BEGIN BEGIN
IF reset = '1' THEN IF reset = '1' THEN

View File

@@ -46,7 +46,7 @@
<Option Name="IPUserFilesDir" Val="$PIPUSERFILESDIR"/> <Option Name="IPUserFilesDir" Val="$PIPUSERFILESDIR"/>
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/> <Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
<Option Name="EnableBDX" Val="FALSE"/> <Option Name="EnableBDX" Val="FALSE"/>
<Option Name="WTXSimLaunchSim" Val="37"/> <Option Name="WTXSimLaunchSim" Val="38"/>
<Option Name="WTModelSimLaunchSim" Val="0"/> <Option Name="WTModelSimLaunchSim" Val="0"/>
<Option Name="WTQuestaLaunchSim" Val="0"/> <Option Name="WTQuestaLaunchSim" Val="0"/>
<Option Name="WTIesLaunchSim" Val="0"/> <Option Name="WTIesLaunchSim" Val="0"/>