如何有效利用VHDL模块?
这里有几个问题,请耐心听我说,感谢您抽出时间阅读…… 我最近编写了一个SPI主机,并对其进行了充分的模拟,以确保其按预期工作。 从这里开始,我想在另一种设计中使用它,在这种设计中,我已经设置了一个7段显示组件,用于获取从SPI总线上的ADC接收到的值,但是我想我已经把自己弄糊涂了 我需要向SPI主机发送一个带有其他参数的脉冲以启动传输,并等待一个繁忙信号被取消断言,然后才能发送任何其他内容我不确定如何在新设计中实现SPI主机。 我会在设计中使用它作为一个组件吗?有更好的办法吗 如果它必须是一个组件,我是否有办法将它设置为直接从该组件输出到管脚,而不必映射到顶层设计中的新输入/输出 例如,我有SCLK、MOSI、MISO和CS;我可以不直接将它们输出,而不必通过顶层映射吗?看起来它简化了顶层,减少了笨重 另外,是否可以设置一个函数,只说“通过SPI发送此数据,然后返回接收到的数据” 我仍在思考如何将这些东西组合在一起,因此非常感谢您的帮助/示例。似乎所有可用的示例/教程都是基于使用两个半加法器、逻辑门等的东西,这些东西只在非常简单的情况下才有帮助 编辑:我的SPI主机的实体如何有效利用VHDL模块?,vhdl,fpga,hdl,Vhdl,Fpga,Hdl,这里有几个问题,请耐心听我说,感谢您抽出时间阅读…… 我最近编写了一个SPI主机,并对其进行了充分的模拟,以确保其按预期工作。 从这里开始,我想在另一种设计中使用它,在这种设计中,我已经设置了一个7段显示组件,用于获取从SPI总线上的ADC接收到的值,但是我想我已经把自己弄糊涂了 我需要向SPI主机发送一个带有其他参数的脉冲以启动传输,并等待一个繁忙信号被取消断言,然后才能发送任何其他内容我不确定如何在新设计中实现SPI主机。 我会在设计中使用它作为一个组件吗?有更好的办法吗 如果它必须是一个组
entity SPI_master is
generic(data_width: integer := 8;
clock_select: integer := 0);
port(SCLK: out std_logic;
MOSI: out std_logic;
MISO: in std_logic;
CS: out std_logic;
Mclk_in: in std_logic;
RST: in std_logic;
CPOL: in std_logic;
CPHA: in integer;
send_packet: in std_logic;
busy: out std_logic;
Tx_data: in std_logic_vector(data_width-1 downto 0);
Rx_data: out std_logic_vector(data_width-1 downto 0));
end SPI_master;
您的实体看起来很合理,尽管更好的名称或对CPOL、CPHA的评论会很有用 部分答覆: 1) 您可以在设计中将其作为组件使用,但如前所述,直接实体实例化更简单,更不冗长 2) 不,您不能直接从层次结构的深层次输出,即使您可以,这也是一个糟糕的想法 你熟悉C++、艾达或java编程的“设计模式”吗?如果是这样,请将顶层设计视为“立面”模式 这是外部世界需要了解的关于您的设计的唯一信息。它通常被写成结构化的HDL,实例化其他实体,在子单元之间进行互连,并连接到外部端口 有很多方法可以减少这些互连带来的痛苦,尤其是跨多个层次的互连,但最终必须将SPI信号分解到顶层设计中的各个引脚,以便它们可以连接到PCB上的正确导线 3) 是否可以设置一个函数,只说“通过SPI发送此数据,然后返回接收到的数据”。。。不是功能,不是
但当然,您可以引入硬件包装器,为设计的其余部分提供复杂任务的简单视图。例如,(假设“send_packet”被断言在SPI上写入一个字节,“busy”变高直到写入完成),您可以创建一个实体,将一个字节数组和一个“start”信号作为输入。它的体系结构包含一个计算字节数的过程,依次将每个字节输出到SPI并在“忙”时等待,完成后它可以向其“调用者”发出信号。将SPI主机的实体声明(而不是体系结构)添加到post中可能会有所帮助。