Binary 两个计数器-双向溢出处理
我正在设计一个系统,其中我有两个18位计数器,我想通过减去它们来跟踪这两个计数器的差异 输入:Binary 两个计数器-双向溢出处理,binary,vhdl,fpga,Binary,Vhdl,Fpga,我正在设计一个系统,其中我有两个18位计数器,我想通过减去它们来跟踪这两个计数器的差异 输入: A : in unsigned(18 downto 0); -- Counter 1 B : in unsigned(18 downto 0); -- Counter 2 我用于将变量转换为带有额外位的有符号数字: variable As : signed(19 downto 0); variable Bs : signed(19 downto 0); variable Ys :
A : in unsigned(18 downto 0); -- Counter 1
B : in unsigned(18 downto 0); -- Counter 2
我用于将变量转换为带有额外位的有符号数字:
variable As : signed(19 downto 0);
variable Bs : signed(19 downto 0);
variable Ys : signed(19 downto 0);
在时钟的每个上升沿上执行的过程中的减法:
As := signed('0' & A); -- The two stored values are converted to signed number signals.
Bs := signed('0' & B);
Ys := As - Bs; -- The difference is calculated.
这个标志很重要,因为我需要知道哪一个领先或落后于另一个
这在计数器没有被缠绕的情况下有效,这就引出了我的问题:当我还需要知道缠绕的方向(计数器也可以倒计时)时,如何用VHDL处理这一问题
我已经在考虑一个解决方案,其中包括许多大型比较器来检测包裹,但在逻辑元素方面可能有一个更“低成本”的解决方案
注意:计数器是模409600,因此409599将是最大值。
它们是增量的,但也有一个异步负载,因此在一个时钟中,它们最多可以改变+-205个计数,因为每个计数器的负载值为+205或-205
感谢您为我指明了正确的方向:)下面的内容处理的模与
2**N
不同,但可能会给您一些想法
对于dist
,作为a
和b
之间的短距离,如果a=b+dist
,则a在前面:
信号a_sub_b:无符号(a'范围);
前向信号a_:标准逻辑;
信号距离:无符号(a'范围);
开始
我在“有一个异步负载”时抽搐了一下。这样的事情不应该存在,异步设置/复位是好的,同步负载也是好的,但异步负载产生了一个次优电路,这是自找麻烦。对于环绕检测问题,我建议修改计数器以报告环绕和方向。
signal a_sub_b : unsigned(a'range);
signal a_ahead : std_logic;
signal dist : unsigned(a'range);
begin
a_sub_b <= a - b;
a_ahead <= not a_sub_b(a_sub_b'left);
dist <= a_sub_b when (a_ahead = '1') else (to_unsigned(0, a_sub_b'length) - a_sub_b);