gpt4 book ai didi

vhdl - 双向数据总线设计

转载 作者:行者123 更新时间:2023-12-03 18:35:03 25 4
gpt4 key购买 nike

我需要通过双向数据总线 (ULPI) 与芯片通信。

据我所知,数据在时钟上升沿从 ULPI 总线移出,并在时钟下降沿读取。我的问题是,在读取寄存器时,我首先需要对上升沿敏感(将命令写入数据总线上的芯片),然后在从芯片读取寄存器输出到总线时对下降沿敏感。

我不清楚如何设计这个最好的方式。

我尝试了一个带有 case 语句的进程,但要使其正常工作,我的进程需要对上升沿和下降沿都敏感,我认为这不好。还是真的没问题?

最佳答案

双向总线通常通过使用三态缓冲器来实现。当三态缓冲区输出为“Z”时,您可以从 inout 中读取端口,当缓冲器驱动线路时,它充当输出。在 VHDL 中,这可以通过直接实例化一个原语(例如 Xilinx 器件的 IOBUF)或通过让您的综合工具通过描述上述逻辑来推断三态缓冲区来实现。

您在这里处理 3 个信号:

  • T这是你的三态控制。该信号将来自您的同步逻辑,了解 ULPI 的协议(protocol)。那是因为总线是共享的,所以必须有某种方法可以知道何时应该接收数据和发送数据。
  • I这是您希望通过总线发送的输入数据,在被适当的时钟注册后。
  • O这是您在任何注册/同步之前通过总线接收的输出数据。

  • 关键:三态缓冲区不是同步的。 这是您在三态缓冲区之前/之后所做的,它将正确同步您的信号。在这种情况下,您必须在时钟上升沿将您的输入同步到三态缓冲区(待发送),并在时钟下降沿同步从三态缓冲区/IOBUF 接收的注册数据。

    sample 设计。
    library ieee;
    use ieee.std_logic_1164.all;

    library unisim; -- for xilinx IOBUF
    use unisim.vcomponents.all;

    entity iobuffer_example is
    port (
    I_CLK : in std_logic; -- synchronized with bidir bus
    IO_DATA : inout std_logic; -- data to/from external pin on bidir bus
    I_DIR_CTRL : in std_logic; -- from other VHDL logic, controlling bidir bus direction
    O_DATA_FROM_EXTERNAL : out std_logic; -- data received over bidir bus
    I_DATA_TO_EXTERNAL : in std_logic); -- data to send over bidir bus

    end entity iobuffer_example;

    architecture io_buffer_arch of iobuffer_example is
    signal data_in : std_logic;
    signal data_out : std_logic;
    begin

    IOBUF_Inst : IOBUF
    port map (
    O => data_in, -- data from bidir bus
    IO => IO_DATA, -- data on bidir bus
    I => data_out, -- data to bidir bus
    T => I_DIR_CTRL); -- 3-state enable input, high=input, low=output

    Register_Input : process (I_CLK) is
    begin
    if (falling_edge(I_CLK)) then
    O_DATA_FROM_EXTERNAL <= data_in;
    end if;
    end process Register_Input;

    Register_Output : process (I_CLK) is
    begin
    if (rising_edge(I_CLK)) then
    data_out <= I_DATA_TO_EXTERNAL;
    end if;
    end process Register_Output;

    end architecture io_buffer_arch;

    笔记。

    注意跨时钟域交叉。这里有许多可能的数据从总线传出和传出的交叉点,特别是如果您的内部逻辑驱动在与总线时钟不同的时钟上。如果没有更多细节,我无法提出建议。

    如果您想通过综合工具推断三态缓冲区的行为表示,您可以做这样的事情,而不是使用 unisim 库和 IOBUF :
    PROCESS (I_DIR_CTRL, IO_DATA)
    BEGIN
    IF( I_DIR_CTRL = '1') THEN
    IO_DATA <= 'Z';
    ELSE
    IO_DATA <= data_out;
    END IF;
    data_in <= IO_DATA;
    END PROCESS;

    关于vhdl - 双向数据总线设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969826/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com