当时钟占空比为 50% 时,时钟速度快两倍
The clock speed is two times faster when the clock duty cycle is 50%
我想在FPGA板上生成102Hz的时钟(带cyclone 3的)
硬件上的原始时钟是 50MHz,所以我将它除以 490196 得到 102Hz 时钟
但是当我将占空比设置为 50%
时,时钟速度快了两倍
signal div_490196_counter: std_logic_vector(18 downto 0);
...
process(clk,reset,div_490196_counter)
begin
if(reset='0') then
div_490196_counter <= (others=>'0');
elsif(rising_edge(clk)) then
if(div_490196_counter = 490165) then
div_490196_counter <= (others=>'0');
else
div_490196_counter <= div_490196_counter+1;
end if;
end if;
end process;
clk_102Hz <= '1' when (div_490196_counter < 245098) else '0';
我尝试使用 Verilog,但结果是一样的:
reg[18:0] div_490196_counter;
...
always@(posedge clk or negedge reset)
begin
if(reset == 1'b0)
div_490196_counter = 0;
else
if(div_490196_counter == 490165)
div_490196_counter = 0;
else
div_490196_counter = div_490196_counter + 1;
end
assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;
只有我切换到非50%占空比时钟才能解决问题:
clk_102Hz <= div_490196_counter(18);
或在 verilog 中:
assign clk_102Hz=div_490196_counter[18];
但为什么会这样呢?
我以为结果应该是一样的
您的 clk_102Hz
的两个版本在模拟中的行为应该或多或少相同。但是,请注意此版本不能很好地用作硬件时钟:
assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;
原因是在现实生活中,比较运算符会在一段时间内发生(不像模拟中那样立即发生),因此 clk_102Hz
输出可能会在某些 [=13= 的计算过程中出现故障] 值转换。对于为什么您观察到的频率恰好是预期频率的两倍,我没有准确的解释,但这通常是不可预测的。
要解决这个问题,只需通过由 clk
计时的触发器发送 clk_102Hz
信号即可。
我想在FPGA板上生成102Hz的时钟(带cyclone 3的) 硬件上的原始时钟是 50MHz,所以我将它除以 490196 得到 102Hz 时钟 但是当我将占空比设置为 50%
时,时钟速度快了两倍 signal div_490196_counter: std_logic_vector(18 downto 0);
...
process(clk,reset,div_490196_counter)
begin
if(reset='0') then
div_490196_counter <= (others=>'0');
elsif(rising_edge(clk)) then
if(div_490196_counter = 490165) then
div_490196_counter <= (others=>'0');
else
div_490196_counter <= div_490196_counter+1;
end if;
end if;
end process;
clk_102Hz <= '1' when (div_490196_counter < 245098) else '0';
我尝试使用 Verilog,但结果是一样的:
reg[18:0] div_490196_counter;
...
always@(posedge clk or negedge reset)
begin
if(reset == 1'b0)
div_490196_counter = 0;
else
if(div_490196_counter == 490165)
div_490196_counter = 0;
else
div_490196_counter = div_490196_counter + 1;
end
assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;
只有我切换到非50%占空比时钟才能解决问题:
clk_102Hz <= div_490196_counter(18);
或在 verilog 中:
assign clk_102Hz=div_490196_counter[18];
但为什么会这样呢? 我以为结果应该是一样的
您的 clk_102Hz
的两个版本在模拟中的行为应该或多或少相同。但是,请注意此版本不能很好地用作硬件时钟:
assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;
原因是在现实生活中,比较运算符会在一段时间内发生(不像模拟中那样立即发生),因此 clk_102Hz
输出可能会在某些 [=13= 的计算过程中出现故障] 值转换。对于为什么您观察到的频率恰好是预期频率的两倍,我没有准确的解释,但这通常是不可预测的。
要解决这个问题,只需通过由 clk
计时的触发器发送 clk_102Hz
信号即可。