我正在努力学习Verilog 我的代码出了问题: 问题是当我试图添加我的数字时 第一个价值clk>第二值clk>第3值clk>第四个值clk>并且这里应该是我的平均值但由于某些未知原因我需要按时钟2次以获得更高的值 而且我不知道为什么。 (我认为我的代码存在问题,并且存在问题) 为什么我有这样的延迟 我的avereger必须得到4到10位的数字,并向我显示它(在我的LED上)
这是我的代码 我包括我的矢量形式[
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
答案 0 :(得分:1)
代码占用总共6个循环而不是4个循环的原因是因为计算sum
和avg_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)
。