Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog中的算术除法 模块平均器( 中华电力有限公司, rst, N 总和 cnt, 出来 平均值 ); 输入[9:0]n; 输入时钟; 输入rst; 输出寄存器[19:0]输出; 输出寄存器[9:0]cnt; 输出寄存器[19:0]和; 输出寄存器[9:0]平均值; 整数i=0; 始终@(posedge clk) 如果(rst==1)开始 总和=20'b0; cnt=10'b0; out=20'b0; 平均值=10'b0; 如果(rst==0)开始,则结束else sum=sum+n; out=总和; cnt=cnt+1; 平均值=0; 对于(i=0;i=cnt)开始 out=out-cnt; 平均值=平均值+1; 结束 结束 结束 端模_Verilog_Fpga_Xilinx - Fatal编程技术网

Verilog中的算术除法 模块平均器( 中华电力有限公司, rst, N 总和 cnt, 出来 平均值 ); 输入[9:0]n; 输入时钟; 输入rst; 输出寄存器[19:0]输出; 输出寄存器[9:0]cnt; 输出寄存器[19:0]和; 输出寄存器[9:0]平均值; 整数i=0; 始终@(posedge clk) 如果(rst==1)开始 总和=20'b0; cnt=10'b0; out=20'b0; 平均值=10'b0; 如果(rst==0)开始,则结束else sum=sum+n; out=总和; cnt=cnt+1; 平均值=0; 对于(i=0;i=cnt)开始 out=out-cnt; 平均值=平均值+1; 结束 结束 结束 端模

Verilog中的算术除法 模块平均器( 中华电力有限公司, rst, N 总和 cnt, 出来 平均值 ); 输入[9:0]n; 输入时钟; 输入rst; 输出寄存器[19:0]输出; 输出寄存器[9:0]cnt; 输出寄存器[19:0]和; 输出寄存器[9:0]平均值; 整数i=0; 始终@(posedge clk) 如果(rst==1)开始 总和=20'b0; cnt=10'b0; out=20'b0; 平均值=10'b0; 如果(rst==0)开始,则结束else sum=sum+n; out=总和; cnt=cnt+1; 平均值=0; 对于(i=0;i=cnt)开始 out=out-cnt; 平均值=平均值+1; 结束 结束 结束 端模,verilog,fpga,xilinx,Verilog,Fpga,Xilinx,上面是实现累积移动平均滤波器的代码。for循环用于除法以找到平均值,并涉及重复减法。但是,我收到以下警告和错误: 警告:Xst:2254-块无法满足面积限制,最终比率为509。 警告:Xst:1336-(*)使用了超过100%的设备资源 错误:Pack:18-对于给定的设备和软件包来说,设计太大。 这一定是因为我在for循环中使用了大值,因此得到了一个无法实现的大电路。我正在寻找for循环的替代方案,它可以为我找到平均值。我只需要商值 设计属性:系列:Spartan3E设备:XC3S500E满是

上面是实现累积移动平均滤波器的代码。for循环用于除法以找到平均值,并涉及重复减法。但是,我收到以下警告和错误:

警告:Xst:2254-块无法满足面积限制,最终比率为509。 警告:Xst:1336-(*)使用了超过100%的设备资源 错误:Pack:18-对于给定的设备和软件包来说,设计太大。

这一定是因为我在for循环中使用了大值,因此得到了一个无法实现的大电路。我正在寻找for循环的替代方案,它可以为我找到平均值。我只需要商值

设计属性:系列:Spartan3E设备:XC3S500E

满是EE堆栈交换。这是解决方案的主要要求:

for循环逻辑在静态展开后是巨大的。用你的 在当前代码中,无法处理n=1023的最坏情况。 要用当前代码覆盖这一点,您需要一个1024的for循环 迭代

您可以使用向下计数器而不是向上计数器,只检查 数组切片,其中索引表示数组切片的lsb。 例如:

module averager(
    clk,
    rst,
    n,
    sum,
    cnt,
    out,
    avg
 );

input  [9:0] n;
input clk;
input rst;
output reg [19:0] out;
output reg [9:0] cnt;
output reg [19:0] sum;
output reg [9:0] avg;

integer i = 0;

always @(posedge clk ) 
    if (rst == 1) begin 
        sum = 20'b0;
        cnt = 10'b0;
        out = 20'b0; 
        avg = 10'b0;
    end else if (rst == 0) begin
        sum = sum + n;
        out = sum;
        cnt = cnt + 1;
        avg = 0;

        for (i=0; i<641; i=i+1) begin
            if(out >= cnt) begin
                out = out - cnt;
                avg = avg + 1;
            end
        end
    end
endmodule
该for循环分解为11次迭代(10到0),每次迭代仅为一次 查看
输出的10位切片
,仅查看
平均值的一位
。你可以 不熟悉
+:
运算符。这是一个位片运算符 在IEEE标准1364-2001中介绍。如果开始索引在左侧 (允许动态),右侧为带偏移量的位(必须 是一个静态常数)。你可以阅读更多关于它的内容

由于这是一个倒计时,我们可以安全地假设 数学上)切片的高位是零,我们将 在这种情况下,保护装置不得有底流。所以我们现在有11个 10位减法器,每个减法器带有1位赋值器,该赋值器更小 逻辑则是原来的642(应该是1024)每个20位减法器 用10位加法器


这是一个与以下问题完全相同的问题:
for (i=10; i>=0; i=i-1) begin // lsb index of the slice
  if (out[i+:10] >= cnt) begin // 10-bit slice compare
    out[i+:10] = out[i+:10] - cnt; // 10-bit slice subtraction
    avg[i] = 1'b1; // 1-bit assign
  end
end