Verilog(注册延迟或代码错误?)

时间:2015-11-10 19:50:44

标签: verilog

我正在努力学习Verilog 我的代码出了问题: 问题是当我试图添加我的数字时 第一个价值clk>第二值clk>第3值clk>第四个值clk>并且这里应该是我的平均值但由于某些未知原因我需要按时钟2次以获得更高的值 而且我不知道为什么。 (我认为我的代码存在问题,并且存在问题) 为什么我有这样的延迟 我的avereger必须得到4到10位的数字,并向我显示它(在我的LED上)

这是我的代码 我包括我的矢量形式[

image

module avereger (data_in,Led1,Led2,Led3,clk,rst);
input clk,rst;  
input [9:0]data_in;  
output[6:0] Led1,Led2,Led3; 
reg [9:0] data[3:0];  
reg [11:0] sum,avg_reg; 
always @ (posedge clk)
begin
if(rst==1'b1) 
begin  //all values will be 0 
data[0]<=0;
data[1]<=0;
data[2]<=0;
data[3]<=0;      
sum<=0; 
avg_reg<=0; 
end
else
begin 
data[3]<=data[2];
data[2]<=data[1];
data[1]<=data[0];
data[0]<=data_in;
sum<= data[0] + data[1] + data[2] + data[3]; 
avg_reg<=sum[11:2]; 
end
end
decoder_driver BCD(avg_reg,Led1,Led2,Led3); 
endmodule

module decoder_driver(A,Led1,Led2,Led3);
input [9:0] A; 
output [6:0] Led1,Led2,Led3;
reg [3:0] B,C,D; 
wire [3:0] wireB,wireC,wireD; 
assign wireB=B; 
assign wireC=C;
assign wireD=D;
display1  HUN(wireB,Led1); 
display1  TEN(wireC,Led2); 
display1  ONE(wireD,Led3); 
always @ (A)
begin
B=A/7'd100; 
C=A%7'd100/7'd10; 
D=A%7'd100%7'd10;
end 
endmodule

module display1 (a,Led);
input [3:0] a;
output [6:0] Led; 
reg [6:0] Led; 
always @ (a)
begin
case(a)
4'b0000: Led <= 7'b1000000; //0
4'b0001: Led <= 7'b1111001; //1
4'b0010: Led <= 7'b0100100; //2
4'b0011: Led <= 7'b0110000; //3
4'b0100: Led <= 7'b0011001; //4
4'b0101: Led <= 7'b0010010; //5
4'b0110: Led <= 7'b0000010; //6
4'b0111: Led <= 7'b1111000; //7
4'b1000: Led <= 7'b0000000; //8
4'b1001: Led <= 7'b0010000; //9
4'b1010: Led <= 7'b0001110; //F
default: Led <= 7'b1111111; //-
endcase
end
endmodule

1 个答案:

答案 0 :(得分:1)

代码占用总共6个循环而不是4个循环的原因是因为计算sumavg_reg各占一个周期,因此与4个数据项中移位所需的4个周期相结合,你得到6个周期。

如果您观察模拟过程中发生的情况,您会注意到4个项目的移位需要4个周期。但是,sum位于第4个值的边缘,data[0],即data[4]中的前三个项目和avg_reg中的任何内容的总和,如果你是&#39;我刚刚完成了重置。并且sum是在边缘移位两次之前的sum的值。在下一个周期avg_reg变为正确,然后sum之后的周期变为正确。

如果你想删除这些周期,你可以简单地avg_reg组合确定,并且根本不需要module avereger (data_in,Led1,Led2,Led3,clk,rst); input clk, rst; input [9:0] data_in; output[6:0] Led1,Led2,Led3; reg [9:0] data[3:0]; wire [11:0] sum; always @ (posedge clk) begin if(rst==1'b1) begin //all values will be 0 data[0]<='0; data[1]<='0; data[2]<='0; data[3]<='0; end else begin data[3]<=data[2]; data[2]<=data[1]; data[1]<=data[0]; data[0]<=data_in; end end // Find sum combinationally assign sum = data[0] + data[1] + data[2] + data[3]; // Do >>2 here decoder_driver BCD(.A(sum[11:2]), .Led1(Led1), .Led2(Led2), .Led3(Led3)); endmodule

always @(*)

旁注,您应该避免编写自己的敏感列表,因为它很容易出错,在其他模块中使用always @(A)而不是Exception in thread "main" org.lwjgl.system.libffi.ClosureError: Callback failed because the closure instance has been garbage collected. at org.lwjgl.system.JNI.invokeIIPPPP(Native Method) at org.lwjgl.glfw.GLFW.nglfwCreateWindow(GLFW.java:1146) at org.lwjgl.glfw.GLFW.glfwCreateWindow(GLFW.java:1227) at com.dungeon.gl.FullscreenCreation.setFullScreen(FullscreenCreation.java:63) at com.dungeon.gl.GLAction.updateGL(GLAction.java:78) at com.dungeon.MainAction.start(MainAction.java:69) at com.dungeon.MainAction.main(MainAction.java:21)