我正在Xilinx中用VHDL编程8051指令集。在写完逻辑并生成综合报告后,我看到延迟为13.330ns(频率为75.020 MHz),逻辑电平= 10。
这个值相当少(频率),我需要加强它,但我无法理解使用综合报告的延迟是什么/在哪里。
这是报告中关于时间安排的部分:
=========================================================================
Timing constraint: Default period analysis for Clock 'clk_div1'
Clock period: 13.330ns (frequency: 75.020MHz)
Total number of paths / destination ports: 156134 / 3086
-------------------------------------------------------------------------
Delay: 13.330ns (Levels of Logic = 10)
Source: SEQ/alu_op_code_1 (FF)
Destination: SEQ/alu_src_2L_7 (FF)
Source Clock: clk_div1 rising
Destination Clock: clk_div1 rising
Data Path: SEQ/alu_op_code_1 to SEQ/alu_src_2L_7
Gate Net
Cell:in->out fanout Delay Delay Logical Name (Net Name)
---------------------------------------- ------------
FDE:C->Q 40 0.591 1.345 SEQ/alu_op_code_1 (SEQ/alu_op_code_1)
LUT4:I1->O 2 0.643 0.527 ALU1/ci32_SW0 (N2251)
LUT4:I1->O 1 0.643 0.000 ALU1/adder_comp/C11_F (N1292)
MUXF5:I0->O 3 0.276 0.531 ALU1/adder_comp/C11 (ALU1/adder_comp/C1)
MUXF5:S->O 12 0.756 0.964 ALU1/adder_comp/C21 (ALU1/adder_comp/C2)
LUT4:I3->O 8 0.648 0.760 ALU1/ans_L<5>104 (ALU1/ans_L<5>104)
LUT4:I3->O 17 0.648 1.054 ALU1/ans_L<7>95_SW0 (N264)
LUT4:I3->O 1 0.648 0.000 SEQ/alu_src_2H_and000055_SW3_F (N1304)
MUXF5:I0->O 1 0.276 0.423 SEQ/alu_src_2H_and000055_SW3 (N599)
LUT4_D:I3->O 15 0.648 1.049 SEQ/alu_src_2L_mux0005<7>121228 (N285)
LUT4:I2->O 1 0.648 0.000 SEQ/alu_src_2H_mux0007<6> (SEQ/alu_src_2H_mux0007<6>)
FDE:D 0.252 SEQ/alu_src_2H_1
----------------------------------------
Total 13.330ns (6.677ns logic, 6.653ns route)
(50.1% logic, 49.9% route)
有人可以解释发生了什么吗?
答案 0 :(得分:3)
一些定义:
13.33ns由两部分组成。门延迟6.677ns,净延迟6.653ns
门延迟的主要因素是功能包含在逻辑锥内的复杂程度。净延迟的主要因素是信号驱动的事物数量。
报告中的每一行都在讨论一个逻辑块。因此第一行alu_op_code_1寄存器,以及从C引脚(Clk)到Q引脚(输出)所需的时间。扇出列表示Q引脚驱动的逻辑块数量。在这种情况下它是40,这就是净延迟相当高的原因。对于像ALU的操作码这样的常用寄存器而言,这是非常容易理解的。
我们也可以看一下整个路径,看看它是从SEQ中的操作码进入ALU。通过加法器,返回到SEQ块,最后进入另一个名为alu_src_2H_1的寄存器。那道路是什么,我不能告诉你。只有拥有源的人才能做到这一点,然后就是试图查看这两个寄存器之间的逻辑。
我有点困惑的是,这条路看起来像是达到了时间(13.33ns是目标),但你说你需要“加强”。为什么呢?
答案 1 :(得分:3)
查看报告中的名称并与源代码进行比较。
基本上,你只有在“SEQ”实例中从ALU操作码流向ALU输出信号“alu_src_2L”的组合逻辑:
来源:SEQ / alu_op_code_1(FF) 目的地:SEQ / alu_src_2L_7(FF)
查看详细信息,您可以看到在此特定路径中,大部分时间用于ALU“ALU1”,特别是加法器/比较逻辑“adder_comp”。如果您希望在此路径中延迟较少,则必须优化逻辑或使用其他寄存器切割路径(并使设计的其余部分仍然适用于该更改)。
答案 2 :(得分:1)
首先,在为FPGA编写HDL或调整HDL时,了解特定FPGA的功能和限制确实是值得的。 Xilinx在记录每个FPGA模型方面做得非常出色。查看LUT4和MUXF5模块,您的FPGA系列可能是Spartan 3?通过研究数据表,您可以看到哪些硬件结构非常有效,哪些需要更多资源。一般而言,硬件越接近芯片上的实际内容,它的执行速度越快,占用的面积就越小。
例如,Xilinx LUT也可以用作移位寄存器,这意味着您不必在片中使用触发器。如果确保移位寄存器映射到LUT,这会带来非常明显的改善。 XST尽力使用HDL来推断这些有效的映射,但通常会有一些阻止这些有效映射的愚蠢事情,例如在复位信号之前检查启用信号。确保您研究合成器的输出以及位置和路径,以发现可以改善FPGA映射的实例。 Xilinx文档提供了XST可用于推断更高效组件的示例VHDL和Verilog。有时,直接简单地实例化组件通常更容易。对于复杂的组件,有UNIMACRO和COREGEN向导,它们可以生成非常高效的硬件。
对于一个极端的例子,PicoBlaze microcontroller专门用于利用Xilinx FPGA架构。研究PicoBlaze源代码以查看这种有效映射的示例可能会有所帮助。
其次,如果组合逻辑路径太长,那么它将限制您的最大时钟频率。除了重写代码以更好地映射到FPGA,或重写以消除不必要的硬件资源之外,您还可以在组合逻辑链的中间位置插入触发器(寄存器)。在计算机体系结构中,这称为流水线操作,将使您增加每条指令的周期数。例如,PicoBlaze每个指令使用两个周期。英特尔奔腾4每条指令大约有17个周期。如果你聪明,那么你可以用一种方式编写HDL,开始处理一条指令,同时完成最后一条指令的处理。这意味着每条指令仍然需要2个时钟周期(延迟),但是每个周期(吞吐量)可以退出一条指令。大多数微控制器如8051和PicoBlaze都关注延迟,大多数微处理器(如x86架构)都关注吞吐量。