我有一些代码在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中,我已经有了一个如下所示的timespec:
NET pin_phy_rxclk TNM_NET = "PIN_PHY_RXCLK";
TIMESPEC "TS_PIN_PHY_RXCLK" = PERIOD "PIN_PHY_RXCLK" 8ns HIGH 50%;
答案 0 :(得分:0)
我认为你需要一个FROM:TO约束:
TIMESPEC TSname=FROM “group1” TO “group2” value;
其中value
可以基于其他时间规格,例如TS_CLK*4
因此,您需要将您的流程调整为仅在输出信号上设置触发器,创建一个包含输入的时间组,另一个包含输出的时间组,并将其用于group1
和group2
因此,第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
我认为)