2

这里有几个问题,请耐心等待,感谢您抽出宝贵时间阅读本文...

我最近编写了一个 SPI 主机,并对其进行了全面模拟以确保它按预期工作。从这里我想在另一个设计中使用它,我已经设置了一个 7 段显示组件来获取从 SPI 总线上的 ADC 接收到的值,但是我想我已经把自己搞糊涂了观点。

我需要向 SPI 主机发送一个带有其他参数的脉冲来启动传输,并等待一个忙信号被取消断言,然后我才能发送其他任何东西。我不确定在新设计中实现 SPI 主控的最佳方式。

我会在设计中将其用作组件吗?有没有更好的办法?

如果它必须是一个组件,有什么方法可以将它设置为直接从该组件输出到引脚,而不是我必须映射到顶层设计中的新输入/输出?

比如我有SCLK、MOSI、MISO、CS;我可以不只是让它们直接输出而不必通过顶层映射吗?似乎它会简化顶层并使其不那么笨重。

另外,是否可以设置一个函数来只说“通过 SPI 发送此数据,然后返回收到的内容”?

我仍在思考如何将这些东西放在一起,因此非常感谢帮助/示例。似乎所有可用的示例/教程都基于使用两个半加器、逻辑门等,只有在它们如此简单时才有帮助。

编辑:我的 SPI Master 的实体

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;
4

1 回答 1

1

您的实体看起来很合理,但更好的名称或对 CPOL、CPHA 的评论会很有用!

部分答案:

1)您可以在您的设计中将其用作组件,但如前所述,直接实体实例化更简单且不那么冗长。

2)不,您不能直接从层次结构的深处输出,即使可以,这也是一个糟糕的主意!

您熟悉 C++、Ada 或 Java 编程中的“设计模式”吗?如果是这样,请将您的顶层设计视为“外观”模式。

这是外部世界需要了解的关于您的设计的唯一信息。它通常会被编写为结构化 HDL,实例化您的其他实体,并在子单元之间建立互连并连接到外部端口。

有一些方法可以减少这些互连的痛苦,尤其是跨多个层次结构,但最终您必须将 SPI 信号分解到顶层设计的各个引脚,以便它们可以连接到 PCB 上的正确导线!

3)是否可以设置一个函数来只说“通过 SPI 发送此数据,然后返回接收到的内容”......不是一个函数,不。

但当然,您可以引入一个硬件包装器,为您的设计的其余部分提供一个复杂任务的简单视图。例如,(假设“send_packet”被断言在 SPI 上写入一个字节,并且“busy”变高直到写入完成)您可以创建一个实体,将字节数组和“start”信号作为输入。它的架构包含一个对字节进行计数的过程,依次将每个字节输出到 SPI 并在“忙”时等待,完成后它可以向其“调用者”发出信号。

于 2012-12-24T15:16:06.093 回答