- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我正在尝试用 verilog 编写加法器树。它的通用部分是它具有可配置的要添加的元素数量和可配置的字大小。然而,我遇到了一个又一个的问题,我开始怀疑这是解决我的问题的正确方法。 (我将在更大的项目中使用它。)绝对可以对加法器树进行硬编码,尽管这将需要大量文本。
所以,我想我会和你们堆栈溢出者核实一下你们对此的看法。这是“这样做的方法”吗?我也愿意接受有关不同方法的建议。
我还可以提一下,我对 verilog 还很陌生。
如果有人感兴趣,这是我当前的非工作代码:(我并不期望您解决问题;我只是为了方便而展示它。)
module adderTree(
input clk,
input [`WORDSIZE * `BANKSIZE - 1 : 0] terms_flat,
output [`WORDSIZE - 1 : 0] sum
);
genvar i, j;
reg [`WORDSIZE - 1 : 0] pipeline [2 * `BANKSIZE - 1 : 0]; // Pipeline array
reg clkPl = 0; // Pipeline clock
assign sum = pipeline[0];
// Pack flat terms
generate
for (i = `BANKSIZE; i < 2 * `BANKSIZE; i = i + 1) begin
always @ (posedge clk) begin
pipeline[i] <= terms_flat[i * `WORDSIZE +: `WORDSIZE];
clkPl = 1;
end
end
endgenerate
// Add terms logarithmically
generate
for (i = 0; i < $clog2(`BANKSIZE); i = i + 1) begin
for (j = 0; j < 2 ** i; j = j + 1) begin
always @ (posedge clkPl) begin
pipeline[i * (2 ** i) + j] <= pipeline[i * 2 * (2 ** i) + 2 * j] + pipeline[i * 2 * (2 ** i) + 2 * j + 1];
end
end
end
endgenerate
endmodule
最佳答案
以下是一些您可能会觉得有用的评论:
在设计中使用尽可能少的时钟通常是好的(最好只有一个)。
在这种特殊情况下,您似乎正在尝试生成一个新时钟clkPl,但这不起作用,因为它永远不会返回到0。(“reg clkPl=0;”将重置它在时间 0 处为 0,然后在“clkPl = 1;”中永久设置为 1。)
您只需更换即可解决此问题
always @ (posedge clkPl)
与
always @ (posedge clk)
仅在组合 block 中使用阻塞分配,在时钟 block 中使用非阻塞是一种很好的形式。您在“打包固定条款”部分中混合了阻塞和非阻塞分配。
由于您不需要clkPl,因此您可以简单地删除具有阻塞分配的行(“clkPl = 1;”)
你的双 for 循环:
for (i = 0; i < $clog2(`BANKSIZE); i = i + 1) begin
for (j = 0; j < 2 ** i; j = j + 1) begin
always @ (posedge clkPl) begin
pipeline[i * (2 ** i) + j] <= pipeline[i * 2 * (2 ** i) + 2 * j] + pipeline[i * 2 * (2 ** i) + 2 * j + 1];
end
end
end
看起来它将访问不正确的元素。
例如对于 BANKSIZE = 28,**i 将计数到 7,此时“pipeline[i * (2 ** i) + j]”="pipeline[7*2**7 +j]"="pipeline[896+j] 这将超出数组的范围。(该数组中有 2*BANKSIZE=512 个元素。)
我认为你实际上想要这个结构:
assign sum = pipeline[1];
for (i = 1; i < `BANKSIZE; i = i + 1) begin
always @ (posedge clk) begin
pipeline[i] <= pipeline[i*2] + pipeline[i*2 + 1];
end
end
请注意,大多数 verilog 工具都非常擅长合成多个元素的添加,因此您可能需要考虑在层次结构的每个级别组合更多术语。
(添加更多项的成本低于人们的预期,因为这些工具可以使用 carry save adders 等优化来减少门延迟。)
关于Verilog,通用加法器树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467617/
我想知道是否可以编写函数 add :: Maybe Int -> Maybe Int add Just x = Just (x+1) add Nothing = Nothing 没有 x。类似于 f
我想知道是否可以编写函数 add :: Maybe Int -> Maybe Int add Just x = Just (x+1) add Nothing = Nothing 没有 x。类似于 f
我正在尝试用 Verilog 编写 BCD 加法器,但其中一个模块遇到问题。具体来说,加法器将两个 BCD 数字相加。所以,如果两位数之和小于或等于九,那么它就是正确的。但是,如果它更大,则必须添加
我是一名优秀的程序员,十分优秀!