if rising_edge (clk) then
new_clk <= not new_clk ;
end if;
使用该语句时,实际上时钟速度除以2是因为单边触发。如果我们想用一个与时钟速度相同的计数器计数,需要什么语句呢?有没有办法同时使用上升沿和下降沿?
编辑:因为不清楚..
我通常使用计数器来降低时钟速度,并通过使用更高的计数器位向量索引来制作新的时钟。计数器矢量的MSB具有最高频率闪烁但其频率是时钟的一半,因为上升沿事物。如果可以同时使用上升沿和下降沿两种情况,则MSB的频率将等于时钟速度。
在上面的代码中,在连续的上升沿处设置一个位并清零。但时钟速度再次分裂。
答案 0 :(得分:2)
这个问题有点不清楚,但我认为其目的是制作一个 计数器在时钟的上升沿和下降沿递增。
通常的FPGA和ASIC原语确实包含可以改变状态的触发器 无论是上升还是下降,所以假设目标技术也是如此 只有对上升或下降边缘敏感的触发器。
如果是LSB,则可以创建在每个边缘有效递增的计数器
直接由时钟产生,并产生剩余的计数器位
作为传统的柜台。代码可以如下所示,最终计数输出打开
z_o
:
-- Resulting counter output combined from ordinary counter and clk_i
z_o <= cnt(cnt'left downto 1) & (not clk_i);
-- Ordinary counter for top of resulting counter
process (clk_i, rst_i) is
begin
if rising_edge(clk_i) then
cnt(cnt'left downto 1) <= std_logic_vector(unsigned(cnt(cnt'left downto 1)) + 1);
end if;
if rst_i = '1' then
cnt(cnt'left downto 1) <= (others => '0');
end if;
end process;
波浪可以在下面看到:
请注意,z_o
上的结果计数器的时间不会像普通人那样
所有位都来自触发器的计数器,因此时序分析设置可能
必须有所不同,具体取决于使用结果计数器的方式。
所以可以选择创建一个在两个边上递增的计数器 值得重新考虑解决方案,并使用普通计数器 相反,因为这将简化时序设置。
答案 1 :(得分:0)
1)如果我们想用一个与时钟速度相同的计数器计数,需要什么语句呢?
您只需要创建一个这样的同步过程:
PROCESS(CLK, RESET)
IF reset = '1' then
COUNT <= (OTHERS => '0');
ELSIF rising_edge(clk) then
COUNT <= COUNT + '1';
END IF;
2)有没有办法同时使用上升沿和下降沿?
您必须以这种方式创建两个流程
PROCESS(CLK,RES)
IF reset = '1' then
COUNT_pos <= (OTHERS => '0');
ELSIF rising_edge(clk) then
COUNT_pos <= COUNT_neg + '1';
END IF;
PROCESS(CLK,RES)
IF reset = '1' then
COUNT_neg <= (OTHERS => '0');
ELSIF falling_edge(clk) then
COUNT_neg <= COUNT_pos + '1';
END IF;
它们只是您应该为此目的更改此代码的示例。