如何有效利用VHDL模块?

时间:2012-12-23 12:50:19

标签: vhdl fpga hdl

这里有几个问题,请耐心等待,并感谢您花时间阅读本文...

我最近写了一个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;

1 个答案:

答案 0 :(得分:1)

你的实体看起来很合理,虽然对CPOL更好的名字或评论,CPHA会很有用!

部分答案:

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

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

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

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

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

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

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