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

If statement 操纵时钟信号以获得10个脉冲,if-statement,vhdl,counter,clock,xilinx,If Statement,Vhdl,Counter,Clock,Xilinx,我试图在我的代码中创建一个非常特定的信号。基本上,我需要在负载0结束后,在下降沿生成一个信号,其中该信号是1KHz信号的10个脉冲,其余为0。它只保留了10个脉冲,这些脉冲与变量串行输出对齐 到目前为止,我已经尝试了一个if来尝试这一点,用一个计数器来尝试对我想要的10个脉冲计数到10,并丢弃其余的脉冲。这通常会导致由于错误而无法合成或测试台clk_触发器从未初始化 我的编码相当粗糙,因为我已经很久没有使用xilinx了 守则的主要部分 LIBRARY IEEE; USE IEEE.STD_LO

我试图在我的代码中创建一个非常特定的信号。基本上,我需要在负载0结束后,在下降沿生成一个信号,其中该信号是1KHz信号的10个脉冲,其余为0。它只保留了10个脉冲,这些脉冲与变量串行输出对齐

到目前为止,我已经尝试了一个if来尝试这一点,用一个计数器来尝试对我想要的10个脉冲计数到10,并丢弃其余的脉冲。这通常会导致由于错误而无法合成或测试台clk_触发器从未初始化

我的编码相当粗糙,因为我已经很久没有使用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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体哈明是
端口(时钟50MHz):标准逻辑中;
RST:标准逻辑中;
LOAD_O:在标准逻辑中;
输入1:在标准逻辑中;
输入2:标准逻辑中;
输入3:标准逻辑中;
输入4:标准逻辑中;
输入5:标准逻辑中;
输入6:标准逻辑中;
时钟分区:输出标准逻辑;
时钟触发:输出标准逻辑;
串行输出:输出标准逻辑);
结束哈明;
哈明的建筑拱门是
信号输入向量:标准逻辑向量(6到1);
信号输出:标准逻辑向量(9到0);
信号CLK_100Hz,CLK_50KHz:标准逻辑;
组分P2S
港口(
clk:标准逻辑中;
复位:在标准逻辑中;
负载:在标准逻辑中;
din:标准逻辑向量(9到0);
dout:输出标准(U逻辑);
端部元件;
分频时钟
端口(时钟50MHz):标准逻辑中;
RST:标准逻辑中;
CLK_100Hz:输出标准逻辑);
端部元件;
开始
----------------------------------------------
过程(负载、时钟100Hz)
开始

如果(LOAD_O='1'),则时钟触发您有一个50MHz的时钟。
因此,您可能决定制作一个漂亮的50/50 100Hz时钟,然后使用它。
这是错误的策略

您总是希望尽可能多的同步设计

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

  • 仅为一个50MHz时钟产生100Hz高脉冲。(例如P100Hz)
  • 无论你在哪里使用100Hz时钟,回到使用50MHz时钟 然后在50MHz时钟部分中,如果使用P100Hz,则使用附加的
    ,然后使用

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

谢谢你的波形,但是你应该展示你的代码,没有它我们就无能为力。正如提醒一样,当心不要使用门控时钟产生10个时钟脉冲。这通常是一个非常非常糟糕的主意。门控时钟和FPGA也存在固有问题。啊,是的,对不起,我的错,我已经用代码的主要部分更新了问题。啊,是的,我看到警告,我使用的一些时钟不适合斯巴达6,我想修复它们,但时间不在我这边,到目前为止,它的行为有点像在模拟中。你的100Hz时钟来自哪里?你是用50MHz自己做的吗?如果是这样的话,你应该能够很容易地修复你的代码。是的,100hz来自一个从主fpga时钟派生的预分频器,它只用于串行输出数据。那么我试图用计数器尝试的方法是合理的?。我想我没能成功