操纵时钟信号以获得10个脉冲

时间:2019-12-01 07:20:55

标签: if-statement vhdl counter clock xilinx

我正在尝试在代码中创建一个非常具体的信号。基本上,我需要在load_0结束后的下降沿生成一个信号,该信号将是1KHz信号的10个脉冲,其余的为0。仅保留与变量Serial_out对齐的10个脉冲。

因此,到目前为止,我已经尝试过是否要尝试此操作,并使用一个计数器尝试对我想要的10个脉冲计数到10,然后丢弃其余的脉冲。这总是会因为错误而无法合成,或者永远不会初始化测试台clk_trig。

由于我没有使用xilinx很久了,所以我的编码非常粗糙。

代码的主要部分

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY HAMMING IS
    PORT ( CLK_50MHz_M : IN  STD_LOGIC;
             RST  : IN STD_LOGIC;
             LOAD_O : IN STD_LOGIC;
             input1 : IN STD_LOGIC;
             input2 : IN STD_LOGIC;
             input3 : IN STD_LOGIC;
             input4 : IN STD_LOGIC;
             input5 : IN STD_LOGIC;
             input6 : IN STD_LOGIC;
             CLK_DIV_O : OUT STD_LOGIC;
             CLK_TRIG : OUT STD_LOGIC;
             Serial_out : OUT STD_LOGIC);
END HAMMING;

ARCHITECTURE ARCH OF HAMMING IS
SIGNAL input_vec : STD_LOGIC_VECTOR(6 DOWNTO 1);
SIGNAL output : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL CLK_100Hz, CLK_50KHz : STD_LOGIC;


COMPONENT P2S
     port(
         clk : in STD_LOGIC;
         reset : in STD_LOGIC;
         load : in STD_LOGIC;
         din : in STD_LOGIC_VECTOR(9 downto 0);
         dout : out STD_LOGIC);
END COMPONENT;

COMPONENT SCALE_CLOCK
        PORT (CLK_50MHz_S : IN  STD_LOGIC;
                RST       : IN  STD_LOGIC;
                CLK_100Hz   : OUT STD_LOGIC);
END COMPONENT;

begin
----------------------------------------------
process (LOAD_O, CLK_100Hz)
begin
    if (LOAD_O = '1') then CLK_TRIG <= '0';    -crude attempt at the desired signal
    ELSE
    CLK_TRIG <= CLK_100Hz;
    end if;
end process;
---------------------------------------------

-- BITS DE PALABRA
output(2) <= input_vec(1);
output(4) <= input_vec(2);
output(5) <= input_vec(3);
output(6) <= input_vec(4);
output(8) <= input_vec(5);
output(9) <= input_vec(6);

-- BIT PARIEDAD
output(0) <= input_vec(1) XOR input_vec(2) XOR input_vec(4) XOR input_vec(5);
output(1) <= input_vec(1) XOR input_vec(3) XOR input_vec(4) XOR input_vec(6);
output(3) <= input_vec(2) XOR input_vec(3) XOR input_vec(4);
output(7) <= input_vec(5) XOR input_vec(6);

ClockDiv: SCALE_CLOCK PORT MAP(CLK_50MHz_S => CLK_50MHz_M, RST => RST, CLK_100Hz => CLK_100Hz);
SeriesOut: P2S PORT MAP(clk => CLK_100Hz, din => output, dout =>  Serial_out, reset => RST, load => LOAD_O);

CLK_DIV_O <= CLK_100Hz;
input_vec <= input1 & input2 & input3 & input4 & input5 & input6;
END ARCH;

FPGA2 code running

1 个答案:

答案 0 :(得分:0)

您有一个50MHz的时钟。
因此,您可能决定制作一个不错的50/50 100Hz时钟,然后使用它。
那是错误的策略!

您总是希望尽可能多地进行同步设计。

如果您希望信号以100Hz的频率变化,则正确的(同步)方法如下:

  • 使100Hz脉冲仅对一个 50MHz时钟有效。 (例如P100Hz)
  • 在任何使用100Hz时钟的地方都可以回到使用50MHz时钟的地方 然后在50MHz时钟部分中使用额外的if P100Hz then

您现在有了一个有效运行在100Hz的同步设计。