【发布时间】:2013-12-12 03:41:50
【问题描述】:
我已经为参数化数字的平方根编写了verilog代码。如果位数是偶数,则代码有效。
如果位数是奇数,则代码从右 (LSB) 开始将位数分成两组。第一次迭代将选择从最左边开始有 1 位的组。
我正在使用计数器来完成所需的周期数。我不明白我应该如何为第一次迭代选择 1 位组,为其余迭代选择 2 位组。
【问题讨论】:
标签: verilog root square-root
我已经为参数化数字的平方根编写了verilog代码。如果位数是偶数,则代码有效。
如果位数是奇数,则代码从右 (LSB) 开始将位数分成两组。第一次迭代将选择从最左边开始有 1 位的组。
我正在使用计数器来完成所需的周期数。我不明白我应该如何为第一次迭代选择 1 位组,为其余迭代选择 2 位组。
【问题讨论】:
标签: verilog root square-root
可变数量的位选择似乎在硬件中并不实用。如果你展示了一些代码答案可能会更相关或更实用。
解决这个问题的两种方法:
检测奇数时补上,MSB加0。
在迭代中有一个if else,它选择 1 或 2 位选择性地填充 LSB。
1.
的代码示例parameter DATA_W = 11;
parameter odd = DATA_W % 2;
input [DATA_W-1:0] data;
reg [DATA_W-1+odd:0] data_int;
always @* begin
if (odd)
data_int = {1'b0, data};
else
data_int = data;
end
代码示例 2.
// Iteration for( loop=0; loop<max; loop=loop+1) begin
if ((loop == 0) && (odd)) begin
sel = {data[0], 1'b0};
end
else begin
sel = data[loop*2+1:loop*2];
end
// end
这应该能够静态展开,因为odd 是基于一个参数并且循环具有固定的迭代次数。如果一个循环可以静态展开,那么它就是可合成的。
【讨论】: