verilog average,将n位数加在一起,然后除以nbit数

时间:2013-12-05 19:30:18

标签: verilog

我无法将此代码放在一起我的主代码是状态机它将2个数字加在一起=和然后加载A在时钟到达之后将A加到sum(sum = a + sum)然后除以n bit 。我迷失了把它放在一起。分配输出时遇到很多麻烦。什么是合法的,什么不是我能够设置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

这是我的分隔符加上其他模块:

module shiftlne(R,C,L,w,Clk,Q);
parameter n=8;
input [n-1:0]R;
input L,w,Clk,C;
output [n-1:0]Q;
reg [n-1:0]Q;
integer k;
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];
        Q[0]<=w;
    end

        end
end
endmodule

module downcounter (R,E,L,Clk,Q);
parameter n=8;
input[n-1:0]R;
input Clk,L,E;
output [n-1:0]Q;
reg[n-1:0]Q;

always @(posedge Clk)
begin   if(L)
        Q<=R;
    else if(E)
        Q<=(Q-1);
end
endmodule



module muxdff(  D0, D1, Sel, Clk,Q);
input Clk,D0,D1,Sel;
wire D;
output Q;
reg Q;
assign D=Sel?D1:D0;
always @ (posedge Clk)
begin
        Q=D;

end
endmodule


module regne (R,Clk,Resetn,E,Q);
parameter n=8;

input [n-1:0]R;
input Clk,Resetn,E;
output [n-1:0]Q;
reg [n-1:0] Q;

always @(posedge Clk or negedge Resetn)
begin
if (Resetn==0)
    Q<=0;
else if (E)
 Q<=R;
end
endmodule

1 个答案:

答案 0 :(得分:2)

你是否坚持使用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,保留大写的parameterlocalparam等常量,其他一切都是小写的。

你的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