【问题标题】:VHDL: Unable to assign System clock (Sys_Clk) to SignalVHDL:无法将系统时钟 (Sys_Clk) 分配给 Signal
【发布时间】:2017-12-13 11:44:18
【问题描述】:

这里我已经上传了模拟结果。在突出显示的部分,它应该将 sys_clk 分配给两个信号

在定义的 sclk_1 和 sclk_2 信号经过一些延迟后,我编写了 vhdl 代码来分配系统时钟(Sys_clk)。

当代码运行和执行时,在计数器计数 25 次后的仿真中,这两个信号的状态只是显示为高(逻辑电平高)而不是系统时钟 (Sys_Clk)。

我使用的是 Artix 7 Basys -3 Board,它有 100MHZ 系统时钟。

谁能帮我如何在定义的信号上分配系统时钟(Sys_Clk)??

architecture Behavioral of Power_Sequence is
signal counter : integer := 0;
signal sclk_1 : std_logic := '0';
signal sclk_2 : std_logic := '0';

begin

process(Sys_Clk)

begin

    if(Sys_Clk 'event and Sys_Clk = '1') then
        if(resetb = '0')then
            sclk_1 <= '0';
            sclk_2 <= '0';
        else
            counter <= counter + 1;
            if (counter > 24 and counter < 50) then
            sclk_1 <= Sys_Clk;
            sclk_2 <= Sys_Clk;
            end if;
        end if;
     end if;    
end process;
end Behavioral;

【问题讨论】:

  • 编辑问题并将其设为minimal reproducible example。包括您收到的确切错误消息。目前我们看不到任何相关声明(尽管缺少分号很明显。发布的代码甚至无法编译,更不用说给出错误的结果了)
  • 时钟信号是时钟信号。您应该只将其连接到同步元件的时钟输入。不要将其连接到 FF 数据输入。顺便说一句,您的 if 语句仅在 Sys_Clk 为“1”时为真,因此 sclk_tp 和 sclk_bt 始终为高是正确的。
  • sclk_tpsclk_bt 是什么?它们是sclk_1sclk_2 吗?
  • @mkrieger 是的,两者都是一样的。
  • @KelvinKalariya ...换句话说sclk_1 &lt;= Sys_Clk;并不意味着从现在开始sclk_1应与Sys_Clk相同。这意味着:sclk_1 获取Sys_Clk 的当前值并保留它,直到我们通过执行另一个sclk_1 &lt;= expression; 为其分配另一个值

标签: vhdl fpga xilinx hdl


【解决方案1】:

您的代码无法运行。 行间正在处理的代码:

    if(Sys_Clk 'event and Sys_Clk = '1') then
...
    end if;

将在 Sys_clk 上升时执行。此时 Sys_Clk 的值为 '1' !然后,如果您在信号 sclk_tp 和 sclk_bt 上复制它,它将始终复制“1”。

要使其正常工作,您必须在异步过程中分配 sclk_tp 和 sclk_bt 信号,如下所示:

sclk_tp <= Sys_Clk when (counter > 24 and counter < 50) else '0';

并且只使用同步过程来计数。

[编辑]

正如 paebbels 所解释的,上面的行不是一个很好的时钟门控解决方案。您可以在 this stackoverflow response 上找到 colck 门控的解释。

【讨论】:

  • 你不应该使用这个描述来实现时钟门控!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多