Algorithm Verilog:将二进制输入乘以其延迟形式的最小(硬件)算法

Algorithm Verilog:将二进制输入乘以其延迟形式的最小(硬件)算法,algorithm,verilog,hdl,Algorithm,Verilog,Hdl,我在中有一个二进制输入(1位串行输入),我想延迟M时钟脉冲,然后将2个信号相乘(和)。换句话说,我想计算总和: sum(in[n]*in[n+M]) 其中,n以时钟脉冲数表示 最直接的方法是将中的最新M样本存储在内存缓冲区中。在Verilog中,这类似于: always @(posedge clock ...) ... in_dly[M-1:0] <= {in_dly[M-2:0], in}; if (in_dly[M-1] & in)

我在中有一个二进制输入
(1位串行输入),我想延迟
M
时钟脉冲,然后将2个信号相乘(和)。换句话说,我想计算总和:

sum(in[n]*in[n+M])
其中,
n
以时钟脉冲数表示

最直接的方法是将
的最新
M
样本存储在内存缓冲区
中。在Verilog中,这类似于:

always @(posedge clock ...)
    ...
    in_dly[M-1:0] <= {in_dly[M-2:0], in}; 
    if (in_dly[M-1] & in)
         sum <= sum + 'd1;
    ...
因此,在
M
样本期间,
in='b1
在区间
[a[1]、[a[2]]、[a[3]、[a[4]]等期间。类似地,在下一个
M
样本期间,在
[b[1]、[b[2]、[b[3]、[b[4]]等期间输入较高。现在,总和是这些间隔的“重叠”:

min(b[2],a[2])-max(b[1],a[1]), if b[2]>a[1] and b[1]<a[2]; 0 otherwise
min(b[2],a[2])-max(b[1],a[1]),如果b[2]>a[1]和b[1]请尝试以下操作:

  • 使数组
    A
  • 每次当
    in
    ==1时,释放
    A
    元素并向其写入
    M
  • 每个时钟递减所有非零
    A
    元素
  • 一旦任何递减的元素变为零,如果
    中的
    等于1-
    和+
    ,则测试
    中的
编辑:上述算法适用于类似输入 -000000000000100000100010000000,而LLDinu realy需要 -1111111 00000000 11111 000000,下面是修改后的算法:

  • 使数组(环形缓冲区)
    A
  • 每次当
    in
    切换时,释放
    A
    元素并向其写入
    M
  • 每个时钟递减所有非零
    A
    元素
  • 如果
中的
中的
==1且非零
A
元素的数量为偶数-
和+

在您的设计中,
sum(in[n]*in[n+M])
操作是只执行一次,还是多次,因此每个操作的保存都会执行多次?
M
是实现的常量,还是随时间而变化?如果在FPGA中实现,则LUT通常可以实现非常有效的移位寄存器,因此在[n+M]
中执行
一次将不需要2000个触发器,而只需要30个LUT,因此与在更复杂的设计上花费时间相比,简单地支付移位成本可能是值得的。Hi Morten。该总和被计算多次(~10,而n=1到~60000),M是每个总和的常数。实际上,这些总和是用来计算“in”的自相关的。该应用程序是一个ASIC,具有自定义数字部分和一个可用的小内存。因此,必须尽可能减少此操作的资源。由于
中的
具有很少切换的设计属性,因此可以使用浅FIFO传输0和1周期的长度,然后可以重新生成延迟为M个周期的
中的
。如果在2000个周期中有10个toogles,FIFO内存大约为10*log2(2000)=110位,然后会有一些FIFO索引开销。不少于您计算的220位。然而,这个位数正接近2000个周期内10次切换信号的信息量。谢谢你的回复。你是对的,最好是缓冲长度并重新创建延迟信号。此外,由于每个和的延迟M略有不同,因此每个都需要单独存储(M(i)个样本,i=1:10)或使用一些复杂的逻辑从最大的缓冲区中回收较小的缓冲区M(i)。嗨,Alexey,谢谢你有趣的建议!我认为你的想法是好的,但它相当浪费(在资源/内存中),因为需要存储大量等于M(11位)的元素。然而,正如我在编辑问题时所解释的,它可以被优化。这很清楚。我以为输入像00010000010000000,而它是111110000000000,1111111000我明白你想说什么,但它并没有真正起作用。例如,如果延迟与输入的周期相似,那么A中几乎总是有2个元素。然而,它与我当前的方法非常相似,并且使用相同的资源,因此我可能会调整算法,但我会保留这个概念。谢谢你的帮助!如果切换是完全随机的,我希望我的算法运行良好。是吗?你说得对,我匆忙检查了一下,弄错了。
min(b[2],a[2])-max(b[1],a[1]), if b[2]>a[1] and b[1]<a[2]; 0 otherwise