0

我有一些在 Xilinx Spartan 6 上运行的代码,它目前符合时序要求。但是,我想更改它,以便使用更少的寄存器。

signal response_ipv4_checksum     : std_logic_vector(15 downto 0);
signal response_ipv4_checksum_1   : std_logic_vector(15 downto 0);
signal response_ipv4_checksum_2   : std_logic_vector(15 downto 0);
signal response_ipv4_checksum_3   : std_logic_vector(15 downto 0);
…

process (clk)
begin
    if rising_edge(clk) then
        response_ipv4_checksum_3 <= utility.ones_complement_sum(x"4622",                  config.source_ip(31 downto 16));
        response_ipv4_checksum_2 <= utility.ones_complement_sum(response_ipv4_checksum_3, config.source_ip(15 downto 8));
        response_ipv4_checksum_1 <= utility.ones_complement_sum(response_ipv4_checksum_2, response_group(31 downto 16));
        response_ipv4_checksum   <= utility.ones_complement_sum(response_ipv4_checksum_1, response_group(15 downto 0));
    end if;
end process;

目前,为了满足时间要求,我需要在多个周期中拆分添加。但是,我有 20 个周期来实际计算这个值,在此期间配置值不能改变。

是否有一些我可以使用(首选)的属性或我可以使用的约束(ucf)文件中的行,以便我可以简单地编写相同的东西,但不使用寄存器?

只是为了一些额外的代码,在我的 UCF 中,我已经有一个看起来像这样的时间规范:

NET pin_phy_rxclk TNM_NET = "PIN_PHY_RXCLK";
TIMESPEC "TS_PIN_PHY_RXCLK" = PERIOD "PIN_PHY_RXCLK" 8ns HIGH 50%;
4

1 回答 1

0

我认为你需要一个 FROM:TO 约束:

TIMESPEC TSname=FROM “group1” TO “group2” value;

哪里value可以基于另一个时间规范,比如TS_CLK*4

因此,您将调整您的过程,使其仅在输出信号上使用触发器,创建一个包含输入的时间组,另一个包含输出的时间组,并将它们用于group1group2

因此,第 1 组将包含所有输入网络/path/to/your/instance/config.source_ip/path/to/your/instance/response_group。为实体创建向量输入并在其外部连接 config/response_group 信号可能更容易。然后你就可以使用/path/to/your/instance/name_of_input_signals.

第 2 组将包含/path/to/your/instance/response_ipv4_checksum.

而且,正如你评论的那样,你可以使用TS_PIN_PHY_RXCLK*4(假设它是一个时间,而不是一个频率 - 否则你必须做一个/4我认为)

于 2013-02-05T14:09:58.070 回答