首页 文章

如何有效利用VHDL模块?

提问于
浏览
2

There's a few questions in here, so bear with me, and thanks for taking the time to read this...

我最近写了一个SPI主控,并完全模拟它以确保它按预期工作 . 从这里我想在另一个设计中使用它,我已经设置了一个7段显示组件,以便从SPI总线上获取从ADC接收到的值,但是我想我已经把事情弄糊涂了 . 点 .

我需要将一个带有其他参数的脉冲发送到SPI主控制器以启动传输,并在我发送任何其他信息之前等待忙信号被置低 . I'm not really sure how best way to implement the SPI master within the new design.

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

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

例如,我有SCLK,MOSI,MISO和CS;我可以不直接输出它们而不是必须通过顶层映射吗?似乎它简化了顶级并使其不那么笨重 .

是否可以设置一个函数来说"Send this data over SPI and then return what's received"?

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

编辑:我的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;

1 回答

  • 1

    您的实体看起来合理,虽然更好的名称或评论CPOL,CPHA将是有用的!

    部分答案:

    1)您可以在设计中将其用作组件,但如前所述,直接实体实例化更简单,更简洁 .

    2)不,你不能直接从层次结构的深层输出,即使你可能这是一个可怕的想法!

    您是否熟悉C,Ada或Java编程中的“设计模式”?如果是这样,请将您的顶级设计视为“Facade”模式 .

    这是外部世界唯一需要了解您的设计的东西 . 它通常被编写为结构HDL,实例化您的其他实体,并在子单元和外部端口连接之间 Build 互连 .

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

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

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

相关问题