verilog - 如何从寄存器表达式中选择一系列位?

标签 verilog xilinx-ise

我试图取 8 个 8 位寄存器的平均值。我能够在结构上做到这一点,有四个 8-> 9 位加法器、两个 9-> 10 位加法器和一个 10-> 11 位加法器。这工作正常;但是,我很好奇是否有更好的方法/更有效的方法来做到这一点。

对于结构方式,我所要做的就是从 10->11 位加法器分配一条线到输出。

我正在尝试做类似下面的事情,但它说

索引 <10> 超出信号范围 [7:0]。 我有它的索引 10,以防所有寄存器都像 255 一样大。

module avg( 
    num_in, 
    clk,
    rs,
    ave8
  ) ;
  input clk ;
  input rs;
  input [7:0] num_in ;
  output [7:0] ave8 ;
  reg [7:0] registers [7:0] ;

always @(posedge clk) begin
      
        if(rs) begin
         registers[0] <= 0;
         registers[1] <= 0;
         registers[2] <= 0;
         registers[3] <= 0;
         registers[4] <= 0;
         registers[5] <= 0;
         registers[6] <= 0;
         registers[7] <= 0;
      end 
    
      
     registers[0] <= num_in;
    registers[1] <= registers[0];
    registers[2] <= registers[1];
    registers[3] <= registers[2];
    registers[4] <= registers[3];
    registers[5] <= registers[4];
    registers[6] <= registers[5];
    registers[7] <= registers[6];   


  end

// This assign function is what I am focused on.
    assign ave8 = {registers[0] + registers[1] + registers[2] + registers[3] + registers[4] + registers[5] + registers[6] + registers[7]}[10:3];

最佳答案

一种方法是创建 sum 线:

wire [10:0] sum = registers[0] + registers[1] + registers[2] + registers[3] + registers[4] + registers[5] + registers[6] + registers[7];
assign ave8 = sum[10:3];

关于verilog - 如何从寄存器表达式中选择一系列位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69196809/

相关文章:

compiler-errors - 在reg声明中获取解析错误

verilog - 我有幅度比较器 4 位 Verilog 代码,但输出错误

type-conversion - VHDL 中的类型转换 : real to integer - Is the rounding mode specified?

ubuntu - 在 ubuntu 12.4 上启动 ise14.6

verilog - 如何实现超过一个时钟周期的时序逻辑?

verilog - 在 systemverilog 中不使用程序 block 来避免竞争条件

verilog - 同时使用 case 语句和 if-else?

fpga - 如何在 Xilinx ISE 中找到推断锁存器?

vhdl - 提高 Xilinx ISim 仿真的速度