我已经用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;
答案 0 :(得分:1)
模拟显示您的代码确实生成了分频时钟,但是 分区中使用的大整数给出的时间最长为500毫秒 划分100 MHz时钟,所以你可能没有等待足够长的时间: - )
您可以在下面看到模拟。
您确实可以将流程状态存储在流程变量中,因为该状态是 保留在该过程的暂停之间。请注意,该过程不是 在运行之间调用,就像普通的软件功能一样,但只是暂停 最后(当有灵敏度列表时),然后执行恢复 敏感列表中某个信号的事件。
对代码的一些评论:
clk*
的分配应该放在if rising_edge(clk)
内,因为您
可能希望这些输出来自触发器。
考虑使用clk*
中的状态而不是d
,f
和h
变量,因为它几乎是多余的。
考虑使用基于std_logic_vector
的信号制作计数器
内部整数变量,因为调试通常更容易
使用可以在波形中轻松显示的信号,你会更好
控制实施。例如,在调试时,你会有
看到计数器实际上增加了,因而可能已经理解了
分频器工作,但结果时钟只有很长的时间。
答案 1 :(得分:0)
将变量转换为架构级信号,并从变量赋值切换到信号分配。
您还应该将clk1,clkafisare和clkorg的赋值移到第一个if语句中,以描述边缘敏感寄存器。如果你没有测试平台,你还需要编写一个以生成clk信号,然后才能获得任何输出。