【问题标题】:How do I generate an I²C clock with these specs?如何使用这些规格生成 I²C 时钟?
【发布时间】:2021-11-30 18:32:06
【问题描述】:

I2C clock specifications fpga 的时钟是 100MHz,我需要以 400kHz 运行它,所以为了制作 400kHz 时钟,我划分了 100MHz/(2^8)=390625(接近 400kHz)(请告诉我一个时钟分频器的更优化方式)这里 8 是没有。位,所以我做了一个计数器(8 到 0)并将其第 8(索引)位作为 i2c 通信过程(vhdl)的时钟。 请指导我如何生成所需的时钟。 谢谢

signal count:std_logic_vector(8 downto 0);
signal sign:std_logic;
process(clk,rst)
begin
 if rst='1' then
 count<=(others=>'0');
 elsif rising_edge(clk) and rst='0' then 
 count<=count+1;
 end if;
 sign<=count(8);
end process;

【问题讨论】:

  • 请注意,如果您从某种逻辑(如您接受的答案中)生成时钟,则您可能会在综合过程中看到错误。时钟不像任何逻辑信号。我需要特别照顾。在许多 FPGA 中,它必须由特定设备(PLL、时钟发生器……)生成和/或通过特定缓冲器,以使其电气特性与其时钟角色兼容。因此,请注意您的错误/警告消息,如果您遇到与时钟相关的问题,请打开 FPGA 的文档并搜索“时钟”或“时钟发生器”或“时钟管理器”。
  • 例如,在 Xilinx FPGA 中,您可能需要用正确配置的数字时钟管理器 (DCM) 模块替换自定义逻辑时钟发生器,该模块将 100MHz 时钟作为输入并生成 400kHz 时钟从中。然后可以将生成的时钟路由到带有时钟缓冲器的时钟网络,并被设计的其他部分用作常规时钟。

标签: vhdl clock


【解决方案1】:

您只需将 clk 除以 250 即可得到 400kHz 的 clk。大致如下:

signal count : integer range 0 to 250;
signal clk400 : std_logic; 
process (clk100, rst)
begin 
    if rst ='1' then 
        count  <= 0;
        clk400 <= '0'; 
    elsif rising_edge(clk100) then
       count <= count +1;
       if count = 249 then 
           count  <= 0;
           clk400 <= not clk400;
       end if;
    end if;
end process;

或者,根据您的 FPGA 和工具,您可以使用 PLL。

【讨论】:

  • 请建议我如何生成这个 400khz 时钟,时钟低时间为 1.3us,时钟高时间为 0.6us。谢谢你的时间(图片中的更多细节)
  • 你不需要,这些只是最小值。 50/50 占空比就可以了。
  • 先生,除此之外,我想知道,对于 rtl 设计师来说,vhdl 和 verilog 是否足够,或者我需要学习更多语言,我是这个领域的新手。
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多