首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL和时钟50 to至25 VHDL

VHDL和时钟50 to至25 VHDL
EN

Stack Overflow用户
提问于 2016-02-05 07:43:08
回答 3查看 3.7K关注 0票数 1

我在用VHDL做一个时钟分频器。我的输入时钟频率是50 the,我开始使用下面的25 the输出:

代码语言:javascript
复制
LIBRARY IEEE;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;

ENTITY CLK25 IS
    PORT(clk_in,rst   : IN      std_logic;
          clk_out         : OUT std_logic);
END ENTITY CLK25;

ARCHITECTURE behav OF CLK25 IS
SIGNAL clk_in_set  : integer RANGE 1000000000 DOWNTO 0 := 50000000;
SIGNAL clk_out_set : integer RANGE 1000000000 DOWNTO 0 := 25000000;

BEGIN 
CLK1                :   PROCESS (clk_in,rst) IS
  VARIABLE  cnt     :   unsigned(31 DOWNTO 0);
  VARIABLE clk_tmp  :   std_logic;
  VARIABLE clk_set    :   unsigned(31 DOWNTO 0);
BEGIN
clk_set := to_unsigned(clk_in_set/(clk_out_set*4),32); --< x4 to account for   process time delay
    IF  (rst = '0') THEN 
          cnt := (OTHERS => '0');
          clk_tmp := '0';
    ELSIF rising_edge(clk_in) THEN
        IF cnt = clk_set THEN
            clk_tmp := not(clk_tmp);
            cnt := (OTHERS => '0');
        ELSE cnt := cnt + 1;
        END IF;
    END IF;
    clk_out <= clk_tmp;
END PROCESS CLK1;
END ARCHITECTURE behav;

到目前为止,它在模拟和b-test中运行良好。->Although通常的数学我知道,不要真的堆叠<-- VHDL大师请浮点!不管怎样,我想把模型整理一下,做一个用户可定义的时钟,输入两个参数(x和(Z # Y))

代码语言:javascript
复制
(clk_in_set(X)/(clk_out_set(Z) # Y )

这个是可能的吗?运算符的顺序并不重要,只与时间和频率的关系有关,例如:x= 50000000 =输入频率,z= 25000000 =输出频率。我认为这个问题可以通过纯数学来解决,但它是针对VHDL应用的,所以才有了这篇文章。process语句使数学计算更加混乱。

没有等待语句,请,这是完全不现实的可定义。

EN

回答 3

Stack Overflow用户

发布于 2016-02-05 14:53:55

用逻辑生成时钟是一种非常糟糕且容易出错的习惯(门控时钟)。你以这种方式产生的“时钟”信号实际上只是一个数据信号,它对它所驱动的同步元件具有未定义的路由延迟偏差。请参阅供应商的FPGA数据表或用户指南,查找可用的时钟生成组件(PLL、MMCM、DCM等)并使用它们。这可能会给你省去很多麻烦。

票数 3
EN

Stack Overflow用户

发布于 2016-02-06 03:54:29

你最初的设计看起来有点夸张,所有这些变量等等。我同意之前的帖子,你基本上只是在寻找一个2的时钟除法器。

这只是一个时钟分频器的快速示例:

代码语言:javascript
复制
proces(clk, rst)
begin
    if rst = '1' then
        clk_out <= '0';
    elsif rising_edge(clk) then
        clk_out <= not(clk_out);
    end if;
end process;

但如上所述,这对于物理实现来说可能不是很好。您可能希望从库中实例化一个触发器,以便获得一个硬编码的实例端口(clk_out),您可以在其中创建一个新的时钟源。这样你就可以在真正的硅片上得到50/50的时钟周期。

除以4、8等可以通过级联这些除法器来实现。或者planB是从0..N开始创建一个简单的计数器,并在每次计数达到N时对clk_out进行反转。N将设置时钟频率。这也使您能够获得更灵活的时钟频率,尽管不是所有的时钟都是50/50时钟!但在这个方案中,同样重要的是使用硬编码触发器,这样您就有了一个可靠的实例名称,可以用作时钟根。

票数 2
EN

Stack Overflow用户

发布于 2016-02-05 14:43:58

要从50 MHz输入时钟生成25 MHz时钟,必须将输入时钟除以2。这可以通过在输入时钟的每个上升沿触发的单个触发器来实现。

如果clk_set为0,则设计满足此条件。此外,您的设计支持2的倍数的除法器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35213836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档