VHDL: creating a very slow clock pulse based on a very fast clock

前端 未结 4 1462
悲哀的现实
悲哀的现实 2021-01-02 22:35

(I\'d post this in EE but it seems there are far more VHDL questions here...)

Background: I\'m using the Xilinx Spartan-6LX9 FPGA with the

4条回答
  •  孤城傲影
    2021-01-02 22:53

    Here's a Complete Sample Code :

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.NUMERIC_STD.ALL;
    
    ENTITY Test123 IS
    
        GENERIC (
            clk_1_freq_generic : unsigned(31 DOWNTO 0) := to_unsigned(0, 32); -- Presented in Hz
            clk_in1_freq_generic : unsigned(31 DOWNTO 0) := to_unsigned(0, 32) -- Presented in Hz, Also
        );
    
        PORT (
            clk_in1 : IN std_logic := '0';
            rst1 : IN std_logic := '0';
            en1 : IN std_logic := '0';
            clk_1 : OUT std_logic := '0'
        );
    
    END ENTITY Test123;
    
    ARCHITECTURE Test123_Arch OF Test123 IS
        --
        SIGNAL clk_en_en : std_logic := '0';
        SIGNAL clk_en_cntr1 : unsigned(31 DOWNTO 0) := (OTHERS => '0');
        --
        SIGNAL clk_1_buffer : std_logic := '0';
        SIGNAL clk_1_freq : unsigned(31 DOWNTO 0) := (OTHERS => '0'); -- Presented in Hz, Also
        SIGNAL clk_in1_freq : unsigned(31 DOWNTO 0) := (OTHERS => '0'); -- Presented in Hz
        --
        SIGNAL clk_prescaler1 : unsigned(31 DOWNTO 0) := (OTHERS => '0'); -- Presented in Cycles (Relative To The Input Clk.)
        SIGNAL clk_prescaler1_halved : unsigned(31 DOWNTO 0) := (OTHERS => '0');
        --
    
    BEGIN
        clk_en_gen : PROCESS (clk_in1)
        BEGIN
            IF (clk_en_en = '1') THEN
    
                IF (rising_edge(clk_in1)) THEN
                    clk_en_cntr1 <= clk_en_cntr1 + 1;
    
                    IF ((clk_en_cntr1 + 1) = clk_prescaler1_halved) THEN   -- a Register's (F/F) Output Only Updates Upon a Clock-Edge : That's Why This Comparison Is Done This Way !
    
                        clk_1_buffer <= NOT clk_1_buffer;
                        clk_1 <= clk_1_buffer;
                        clk_en_cntr1 <= (OTHERS => '0');
    
                    END IF;
    
                END IF;
    
            ELSIF (clk_en_en = '0') THEN
    
                clk_1_buffer <= '0';
                clk_1 <= clk_1_buffer;
                clk_en_cntr1 <= (OTHERS => '0'); -- Clear Counter 'clk_en_cntr1'
    
            END IF;
    
        END PROCESS;
    
        update_clk_prescalers : PROCESS (clk_in1_freq, clk_1_freq)
        BEGIN
            clk_prescaler1 <= (OTHERS => '0');
            clk_prescaler1_halved <= (OTHERS => '0');
            clk_en_en <= '0';
    
            IF ((clk_in1_freq > 0) AND (clk_1_freq > 0)) THEN
    
                clk_prescaler1 <= (clk_in1_freq / clk_1_freq); -- a Register's (F/F) Output Only Updates Upon a Clock-Edge : That's Why This Assignment Is Done This Way !
                clk_prescaler1_halved <= ((clk_in1_freq / clk_1_freq) / 2); -- (Same Thing Here)
    
                IF (((clk_in1_freq / clk_1_freq) / 2) > 0) THEN -- (Same Thing Here, Too)
                    clk_en_en <= '1';
                END IF;
    
            ELSE
                NULL;
            END IF;
    
        END PROCESS;
    
        clk_1_freq <= clk_1_freq_generic;
        clk_in1_freq <= clk_in1_freq_generic;
    
    END ARCHITECTURE Test123_Arch;
    

提交回复
热议问题