我遇到VHDL问题。我试图使用计数器来实现一个非常慢的计时器。因为它非常慢,所以计数器需要计数到20,000,000才能溢出。这意味着该计数器将采用25位计数器进行比较。
代码如下:
runled_gen : process(resetb, clk0out)
variable cnt2_temp : std_logic_vector(24 downto 0);
variable toggle_en2 : std_logic;
begin
if resetb = '0' then
pulse_cnt2 <= "0000000000000000000000000";
pulse_out2 <= '0';
elsif clk0out = '1' and clk0out'event then
cnt2_temp := pulse_cnt2 + 1;
if cnt2_temp >= "1001100010010110100000000" then
pulse_cnt2 <= "0000000000000000000000000";
pulse_out2 <= not pulse_out2;
else
pulse_cnt2 <= cnt2_temp;
pulse_out2 <= pulse_out2;
end if;
end if;
runled <= pulse_out2;
end process;
当我尝试合成并映射时,会出现以下警告:
警告:打包:249 - 以下相邻的携带多路复用器占用不同 切片组件。由此产生的进位链将具有次优的时序。 U1 / U4 / Mcompar_pulse_out2_cmp_ge0000_cy&LT; 10 -10 U1 / U4 / Mcount_pulse_cnt2_cy&℃,GT;
如果我将位大小减小到12,则警告消失。所以我猜这是由比特大小引起的。如果我的假设是正确的,那么一个MUXCY可以处理的比较数量是有限的。这就是它发生的原因。
我的问题是:
我的假设是否正确?
为什么12?我的意思是,它不应该像8,16或32?
我的方法不正确吗?我该如何实现这个功能?
非常感谢!
法查尔
答案 0 :(得分:1)
MUXCY是一个Xilinx原语,所以我假设你的目标是他们的一个设备。该组件是一种特殊的硬连线2对1多路复用器,用于为加法器创建快速纹波进位链。它被设置为使得来自连续位的进位将流过相邻的MUXCY,以最小化进位的传播时间。
此警告告诉您&#34;&gt; =&#34;之间的MUXCY路径在为计数器位0馈送进位逻辑之前,必须在交换结构上路由比较器位-10。
除了25位加法器外,比较器本质上是一个25位减法器。这导致产生大量组合逻辑云,阻止布局者获得最佳时机。如果您仍然遇到时间限制,那么您可以放心地忽略此警告。
您可以先将比较器结果注册到一个单独的信号中来分解组合路径:
signal gte : std_logic;
...
-- One less than original count to account for 1-cycle delay
if cnt2_temp >= "1001100010010110011111111" then
gte <= '1';
else
gte <= '0';
end if;
if gte = '1' then
pulse_cnt2 <= (others => '0');
pulse_out2 <= not pulse_out2;
else
pulse_cnt2 <= cnt2_temp;
pulse_out2 <= pulse_out2;
end if;
值得注意的是,在硬件方面,比较平等和不平等比其他关系比较更便宜,因为他们不需要使用进位链。如果您不需要容错来处理翻转位或其他错误行为,您可以替换&#34;&gt; =&#34;用&#34; =&#34;进行测试减少一些逻辑,让布局工作更容易。
另一个改进的机会是通过实现一个为您当前计数器生成同步时钟使能的预分频计数器来打破进位链。例如,您可以使用一个8位预分频器来使能17位计数器。这将缩短设计中最长的进位链,并有助于提高速度。