【发布时间】:2019-12-18 09:42:24
【问题描述】:
假设我有三个像这样连接的寄存器:
{C, A, Q}
其中 C 是 1 位,A 和 Q 是 8 位。
我需要像这样定期执行移位操作:
if (shift_regs) {C, A, Q} <= {C, A, Q} >> 1;
另一个寄存器 P 以等于 Q 中位数的值开始,在本例中为 8,并且每次发生移位时减一。当P达到0时整个序列停止,输出结果为16位等于{A, Q}。
但是,我想通过检测 Q 在其所有位移出之前过早变为零的情况来执行优化,并将输出结果分配给 {{8-bits_shifted_so_far{1'b0}}, A, Q[7:8-bits_shifted_so_far]}。
示例序列:
C = 0, A = 8'b1101_0100, Q = 8'b0000_0011
1) 第一次换班后,{C, A, Q} 变为 {1'b0, 8'b0110_1010, 8'b0000_0001}。
2) 第二班后,{C, A, Q} 变为 {1'b0, 8'b0011_0101, 8'b0000_0000}。
3) Q 现在为零,因此将输出分配给{{8-bits_shifted_so_far{1'b0}}, A, Q[7:8-bits_shifted_so_far]},即{6'b00_0000, 8'b0011_0101, 2'b00}。
如何在 verilog 或 systemverilog 中实现这一点?
【问题讨论】:
-
你的问题有点含糊。您的输出是否需要保持值
{{8-bits_shifted_so_far{1'b0}}, A, Q[7:8-bits_shifted_so_far]}直到 Q 为零的下一个点?或者您的输出是否会在Q != 0时重置为其他内容? -
对不起,这实际上是一个顺序二进制乘法器的练习,但我试图简化这个场景,希望我的问题能被理解。仅当 Q 中的剩余位(尚未移出)具有零值时,输出才需要保持值
{{8-bits_shifted_so_far{1'b0}}, A, Q[7:8-bits_shifted_so_far]}。否则,它应该一直移位,直到Q中的所有位都被移出。 -
verilog 中没有动态范围这样的东西。所以,你不能这样做。唯一的可能性是在带有一堆条件的循环中一点一点地构建你的输出向量。