verilog average,将n位数字相加,然后除以nbit数字

verilog average,将n位数字相加,然后除以nbit数字,verilog,Verilog,我有麻烦把这个代码放在一起我的主要代码是一个状态机它把两个数字加在一起=和然后加载一个来加一个到和(和=a+和)时钟到达后,它然后除以n位。我不知道怎么把它拼起来。在分配输出时遇到很多麻烦。什么是合法的,什么是不合法的我不能将regs设置为彼此相等有时我觉得我可以这样做,有时我不能。如果我使用模块,输入可以是输出,反之亦然,我发布了我的全部代码,因为我想让它工作。我认为我的设备是正确的,但我需要创建一个测试台来进行测试 module Adder (A1, B1, Cin,Q); parame

我有麻烦把这个代码放在一起我的主要代码是一个状态机它把两个数字加在一起=和然后加载一个来加一个到和(和=a+和)时钟到达后,它然后除以n位。我不知道怎么把它拼起来。在分配输出时遇到很多麻烦。什么是合法的,什么是不合法的我不能将regs设置为彼此相等有时我觉得我可以这样做,有时我不能。如果我使用模块,输入可以是输出,反之亦然,我发布了我的全部代码,因为我想让它工作。我认为我的设备是正确的,但我需要创建一个测试台来进行测试

module Adder (A1, B1, Cin,Q);
  parameter n = 5;     

  output[n:0]Q;
  reg [n:0]Q;

  input [n:0] A1;
    wire[n:0] A1;
  input [n:0] B1;
    wire [n:0] B1;  
input Cin;

  always @(A1 or B1 or Cin)
begin
    Q = A1 +B1 + Cin;
end
endmodule




module ave(Clk,X,LA,DataA,Sum,Q);
parameter n=5;
input A,B,EB,Temp,DataA,DataB,Sum,Q;
input X;
reg A,B,Temp,Sum;
reg y,Y
wire 
reg S1=3'b000;S2=3'b001;S3=3'b010;S4=3'b011;S5=3'b100;
always (Clk)
begin
case(y)

S1:
     y=S2;
S2:

     y=S3;
S3:
if (counter>0) y=S2;
    else y=S4;
S4: 
    y=S4;

S5:
    Done;

endcase
end


always (Clk)
begin
case

S1:
    Counter=n; Temp=n; Sum=0;
S2:

    A=X;
S3:
if (counter>0) B<=A+B; 
    else B<=B;
S4: 
    DataA=Temp;
    DataB=Sum;



S5:
    Done=1;


end

Adder add(A,Sum,Cin,Sum);
divider divid(Clk,1,1,1,1,DataA,DataB,1,1,Q,0);




endmodule
模块加法器(A1、B1、Cin、Q);
参数n=5;
输出[n:0]Q;
注册号[n:0]Q;
输入[n:0]A1;
导线[n:0]A1;
输入[n:0]B1;
导线[n:0]B1;
输入Cin;
始终@(A1或B1或Cin)
开始
Q=A1+B1+Cin;
结束
端模
模块ave(时钟、X、LA、数据A、总和、Q);
参数n=5;
输入A、B、EB、Temp、DataA、DataB、Sum、Q;
输入X;
注册A、B、临时、总和;
雷吉,雷吉
电线
注册S1=3'b000;S2=3'b001;S3=3'b010;S4=3'b011;S5=3'b100;
始终(时钟)
开始
案例(y)
S1:
y=S2;
S2:
y=S3;
S3:
如果(计数器>0)y=S2;
否则y=S4;
S4:
y=S4;
S5:
完成;
尾声
结束
始终(时钟)
开始
案例
S1:
计数器=n;温度=n;总和=0;
S2:
A=X;
S3:

如果(计数器>0)B您无法使用Verilog-95,如果没有,您可以清理代码样式,如果没有其他帮助,它可以更容易地发现错误

注意:使用空格缩进代码,而不是制表符,因为它们在发布Q时会弄乱格式,并且根据编辑器的设置,查看代码的人可能会看到不同的外观

module Adder #(
  parameter n = 5
)(
  input      [n:0] A1, //Inputs do not have to be declared as wires
  input      [n:0] B1,  
  input            Cin,
  output reg [n:0] Q;
);

  //Auto sensitivity list with @* lowers chance of bugs
  always @* begin
    Q = A1 + B1 + Cin;
  end

endmodule
大多数语言,我把它应用到我的verilog中,保持常量,比如
parameter
s和
localparam
,用大写,其他的都是小写

您的shiftlne代码更具可读性:对我来说,可读代码意味着更容易发现错误并理解设计意图

always @(posedge Clk) begin
  if( L ) begin
    if( C ) begin
      Q <= R;
    end
    else begin
      for (k=0;k<(n-1);k=(k+1))
        Q[k+1] =  Q[k];  //For loop only applies to this line
                         //  should it not be Q[k+1] <= Q[k];
        Q[0]   <= w;
    end
  end
end
endmodule
始终@(posedge Clk)开始
如果(L)开始
如果(C)开始

“我迷路了”不是问题,请问一些具体的问题,是什么给你带来了问题。我遇到的问题是输出。在模块中,我可以使用输入作为输出,反之亦然。我还可以将regs设置为彼此相等,如果是,我在哪里可以这样做。我最终得到了非法的左手赋值。@user2941970输入和输出是信号驱动方式的声明,以错误的方式驱动它们是没有意义的,而且会有意义的。它在模拟器中工作。可以将导线指定给reg的值。导线a_导线=a_reg;这很有道理。我需要使用assign命令吗。如果我还计划使用该电线两次,我是否需要两根电线?我是否可以使用同一根电线。谢谢你的快速回复response@user2941970您需要将导线视为连接硬件块的导线,它不是包含临时值的变量。这个箱子你可能需要2个。
always @(posedge Clk) begin
  if( L ) begin
    if( C ) begin
      Q <= R;
    end
    else begin
      for (k=0;k<(n-1);k=(k+1))
        Q[k+1] =  Q[k];  //For loop only applies to this line
                         //  should it not be Q[k+1] <= Q[k];
        Q[0]   <= w;
    end
  end
end
endmodule