【问题标题】:How to assign a dynamic range of bits如何分配位的动态范围
【发布时间】: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 中没有动态范围这样的东西。所以,你不能这样做。唯一的可能性是在带有一堆条件的循环中一点一点地构建你的输出向量。

标签: verilog system-verilog


【解决方案1】:

根据您的示例,我将假设输出的宽度为 16 位。

您的问题可以简化,因为您是在Q == 8'h00 时执行此操作,那么您的输出不需要包含Q[7:8-bits_shifted_so_far],可以将其替换为零。正如 Serge 指出的那样,动态范围在 verilog 中是不可能的,但您的问题有一个简单的解决方案:

//Note the blocking assignment
if(shift_regs) {C, A, Q} = {C, A, Q} >> 1; 
//Set the output to A bit-shifted left by the desired amount
if(!Q) output = {8'h00, A} << (8-bits_shifted_so_far);

基本上,您所做的只是输出A 相对于已执行的移位操作的位移位。

【讨论】:

  • 如何在verilog中表达bits_shifted_so_far
猜你喜欢
  • 2017-03-11
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 2021-10-13
  • 2016-01-18
相关资源
最近更新 更多