Binary 两个计数器-双向溢出处理

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 :

我正在设计一个系统,其中我有两个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 : 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);