VHDL时钟分频器

时间:2014-04-21 22:06:18

标签: vhdl

我正在使用以下VHDL来获取100 Mhz时钟并输出25 Mhz时钟。 :

process(clk, reset)
  variable count : integer range 0 to 2;
begin
  if (reset = '1') then
    clock_25MHz <= '0';
    count       := 0;
  elsif rising_edge(clk) then
    count := count+1;
    if(count >= 2) then
      clock_25MHz <= not clock_25MHz;
      count       := 0;
    end if;
  end if;
end process;

它给了我这个警告:

&#34;警告:Xst:1293 - FF / Latch count_1在块中的常量值为0。在优化过程中将修剪此FF / Latch。&#34;

我不明白为什么会这样。任何人都可以为我阐明这一点吗?谢谢!

2 个答案:

答案 0 :(得分:0)

您不需要2位计数。单个触发器就足够了。

如果添加一个已分配计数的整数信号CNT(允许我在带有ghdl的波形上看到它):

 library ieee;
 use ieee.std_logic_1164.all;

 entity clk_div is
 end entity;

 architecture foo of clk_div is
     signal clk:            std_logic := '0';
     signal reset:          std_logic := '1';
     signal clock_25MHz:    std_logic;
     signal CNT:            integer;

begin

CLKDIV:
    process(clk,reset)
        variable count: integer range 0 to 2;   
    begin
        if (reset = '1') then
            clock_25MHz <= '0';
            count:=0;
        elsif rising_edge(clk) then
            count:=count+1;
            if(count>=2) then
                clock_25MHz <= not clock_25MHz;
                count:=0;
            end if;
        end if;
        CNT <= count;
      end process;
CLOCK:
    process 
    begin
        wait for 5 ns;
        clk <= not clk;
        if Now > 200 ns then
            wait;
        end if;
    end process;
UNRESET:
    process
    begin
        wait for 20 ns;
        reset <= '0';
        wait;
    end process;
end architecture;

你找到:

clock_div with count visible as signal

count始终显示为0或1而不是2或3,因为当它为2或更大时,它会将其指定为0。它从不在时钟边缘显示为2。

这是对的吗?为什么是的。如果您使用clock_25MHz持续4 100 Mhz时钟的波形计时,它可以正常工作。您正在处理的事情不是必要的,数不需要0到2的范围,(需要两个触发器)。

更改计数的评估顺序,以便在count = 1时切换clock_25MHz,然后切换计数。将计数范围更改为0到1或更好仍然使其键入std_logic。

     -- signal CNT:            integer;
     signal toggle_ff:      std_logic;

begin

CLKDIV:
    process(clk,reset)
        --variable count: integer range 0 to 2;
        variable toggle:  std_logic;
    begin
        if (reset = '1') then
            clock_25MHz <= '0';
            -- count:=0;
            toggle := '0';
        elsif rising_edge(clk) then
            -- count:=count+1;
            -- if(count>=2) then
            if toggle = '1' then
                clock_25MHz <= not clock_25MHz;
                -- count:=0; 
            end if;
            toggle := not toggle;
        end if;
        -- CNT <= count;
        toggle_ff <= toggle;
      end process;

给出了:

clock_div with single toggle FF

您还可以在流程语句中使用信号而不是变量。在我的示例代码中,重命名toggle_ff以切换,删除变量切换声明并将信号赋值语句移除到toggle_ff。这将无缝地工作的原因是因为您在切换之前评估了toogle FF的输出。

答案 1 :(得分:0)

自从count中的状态由Xilinx实现为FF / Latch以来发生了警告 变为0,1,0,1,...,并且只有count的内部组合值 获取值2,因此count状态中的任何位1将始终为0,如 警告说“FF / Latch count_1在块中的常量值为0”。

你也可以看到这个,因为可以用减少的'count'重写代码 范围为0到1,如果count增量放在if内,如:

process(clk, reset)
  variable count : integer range 0 to 1;
begin
  if (reset = '1') then
    clock_25MHz <= '0';
    count       := 0;
  elsif rising_edge(clk) then
    if (count = 1) then
      clock_25MHz <= not clock_25MHz;
      count       := 0;
    else
      count := count + 1;
    end if;
  end if;
end process;

但是基于从100 MHz进行4分频的具体要求 对于25 MHz时钟,创建中间50 MHz时钟可能更为明显 而不是count,代码如下:

process(clk, reset)
  variable clock_50MHz : std_logic;
begin
  if (reset = '1') then
    clock_25MHz <= '0';
    clock_50MHz := '0';
  elsif rising_edge(clk) then
    clock_50MHz := not clock_50MHz;
    if clock_50MHz = '1' then
      clock_25MHz <= not clock_25MHz;
    end if;
  end if;
end process;