gpt4 book ai didi

vhdl - 时钟分频器仿真

转载 作者:行者123 更新时间:2023-12-05 01:14:01 25 4
gpt4 key购买 nike

我用VHDL语言写了这段分频器的代码,我不明白为什么我仿真的时候没有分频。我做错了什么?

library IEEE;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_1164.all;

entity div is
port(clk : in std_logic;
clk1, clkafisare, clkorg : out std_logic);
end entity;

architecture fct_div of div is
begin
process(clk)
variable c, e, g : integer := 0;
variable d, f, h : std_logic := '0';
begin
if rising_edge(clk) then
e := e+1; c := c+1; g := g+1;
if g = 12000000 and h = '0' then
h := '1'; g := 0;
elsif g = 12000000 and h = '1' then
h := '0'; g := 0;
end if;
if c = 25000000 and d = '0' then
d := '1'; c := 0;
elsif c = 25000000 and d = '1' then
d := '0'; c := 0;
end if;
if e = 100000 and f = '0' then
f := '1'; e := 0;
elsif e = 100000 and f = '1' then
f := '0'; e := 0;
end if;
end if;
clk1 <= d;
clkafisare <= f;
clkorg <= h;
end process;
end fct_div;

最佳答案

模拟显示您的代码确实生成分频时钟,但是除法中使用的大整数给出的周期最多为 500 毫秒分频 100 MHz 时钟,因此您可能等待的时间不够长:-)

你可以看到下面的模拟。

enter image description here

您确实可以将流程状态存储在流程变量中,因为该状态在过程暂停之间保留。注意这个过程不是在运行之间调用,就像一个普通的软件功能,但只是暂停最后(当有一个敏感列表时),然后在灵敏度列表中信号之一的事件。

代码的一些注释:

  • clk* 的赋值应该放在 if rising_edge(clk) 中,因为你可能希望这些输出来自触发器。

  • 考虑使用 clk* 中的状态代替 dfh变量,因为它几乎是多余的。

  • 考虑使用基于 std_logic_vector 的信号制作计数器,而不是内部整数变量,因为调试通常更容易使用可以很容易地显示在波形中的信号,你有更好的对实现的控制。例如调试时,你会看到计数器实际上增加了,因此可能已经理解分频器工作,但产生的时钟周期很长。

关于vhdl - 时钟分频器仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23504998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com