我是VHDL的新手。我得到了关于如何从24 MHz的输入时钟信号产生1Hz(50%占空比)的时钟信号的代码。我有一些问题需要进一步澄清。
如果我想更改占空比,应如何调整代码 到80%?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clock is
port ( CLKin: in std_logic;
reset: in std_logic;
CLKout: out std_logic);
end clock;
architecture arch of clock is
signal counter: integer:=0;
signal temp : std_logic := '1';
begin
process(CLKin,counter,reset)
begin
if(reset='0') then counter<=0; temp<='1';
elsif(CLKin'event and CLKin='1') then counter <=counter+1;
if (counter = 12000000) then temp <= NOT temp; counter<=0;
end if;
end if;
CLKout <= temp;
end process;
end arch;
答案 0 :(得分:8)
您希望将24MHz的时钟(24000000 Hz)分频为1 Hz。
因此,您创建一个计数器,计数CLKin的每个上升沿(24 MHz)。
在24000000/2 = 12000000计数之后,您处于中间位置。这就是你改变输出信号(temp <= not temp
)的电平值的地方。因为你的规格说它必须是50%的占空比。这样做时,您也会从头开始重新计数。
对于8MHz,你有一个计数器(24000000/8)/ 2 = 1500000。
只是一个小小的评论:最好使用ieee.numeric_std
库i.s.o ieee_logic_arith
和ieee.std_logic_unsigned
注意:代码首先分配给信号temp
。然后信号temp
输出clkout
。这背后的原因是在VHDL中不允许从输出端口(clkout
)读取。你应该在做output <= not output;
时阅读它。根据信号,允许阅读。
还有一个注意事项:在流程的敏感性列表中,不需要在那里发出counter
信号。
process(CLKin, reset) -- no counter needed
另外一件事......计算12000000个周期是:0 - &gt; (12000000-1)= 11999999