我正在使用以下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;
我不明白为什么会这样。任何人都可以为我阐明这一点吗?谢谢!
答案 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;
你找到:
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;
给出了:
您还可以在流程语句中使用信号而不是变量。在我的示例代码中,重命名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;