【发布时间】:2022-01-14 06:50:20
【问题描述】:
我想在FPGA板上生成102Hz时钟(带有旋风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];
但是为什么会这样呢? 我认为结果应该是一样的
【问题讨论】:
-
在 std_logic_vector 上进行数学运算充其量是狡猾的;尤其是因为它没有传达您的设计意图。使用
numeric_std.unsigned很明显,您的意图是无符号算术,没有符号,比较运算符<之类的东西会有更少的惊喜。正如 toolic 所说,如果您想要的不仅仅是指针和猜测,请让您的 sn-ps 完整、可编译和可运行(包括测试平台)。
标签: vhdl verilog fpga quartus intel-fpga