在Verilog(Vivado)中向寄存器添加不同数字时出现问题



我目前正在大学课堂上学习使用Vivado在Verilog中进行数字系统设计。我的最后一个项目是美式足球记分牌。我正在努力实现得分功能(针对两支球队(,但我在总积分寄存器中添加6、3、2和1分时遇到了问题。

每个点输入都链接到一个开关。如果我移动一个开关,它会为输出增加6分(触地得分(。另一个开关使总分增加了3分。以此类推,得2分和1分。这是我目前掌握的代码。现在,它只成功地将6个点添加到寄存器中(每次打开时只添加一次(。其他的让我的七段显示器跳来跳去,看起来每当3、2和1点开关打开时,它的添加速度都很快

得分最高为99分,因为我每队使用两个7段显示。我有一个二进制到十进制模块和一个七段转换器模块,这两个模块都在工作。还有一个masterReset输入,可以将分数重置为零。重置输入有效。

module teamAPoints(
input masterReset,
input teamATouchdown,
input teamAFieldGoal,
input teamA2PtConv,
input teamAExtraPoint,
output reg [6:0] teamAScore
);

always @ (posedge masterReset or posedge teamATouchdown or posedge teamAFieldGoal or posedge teamA2PtConv or posedge teamAExtraPoint) begin
if (masterReset) begin
teamAScore <= 0;
end
else if (teamAExtraPoint) begin
teamAScore <= teamAScore + 1;
end
else if (teamA2PtConv) begin
teamAScore <= teamAScore + 2;
end
else if (teamAFieldGoal) begin
teamAScore <= teamAScore + 3;
end
else if (teamATouchdown) begin
teamAScore <= teamAScore + 6;
end
end
endmodule

我希望我解释得足够好。我也试过把它变成一个有限状态机,但没有成功。我知道我在FPGA上描述硬件,我非常习惯Java和C等标准编程语言。我敢打赌这就是我错误的根源。感谢所有帮助/解释。

您需要有一个寄存器才能存储任何内容。目前你正在使用电线,因此分数没有得到适当的更新。你需要一个额外的时钟信号,这是设计时序电路所需要的。请尝试以下代码。

module teamAPoints(
input masterReset,
input teamATouchdown,
input teamAFieldGoal,
input teamA2PtConv,
input teamAExtraPoint,
input clk,     //Added a clock signal
output reg [6:0] teamAScore
);

always @ (posedge clk or posedge masterReset) begin
if (masterReset) begin
teamAScore <= 0;
end
else if (teamAExtraPoint) begin
teamAScore <= teamAScore + 1;
end
else if (teamA2PtConv) begin
teamAScore <= teamAScore + 2;
end
else if (teamAFieldGoal) begin
teamAScore <= teamAScore + 3;
end
else if (teamATouchdown) begin
teamAScore <= teamAScore + 6;
end
end
endmodule

在您的测试台上添加以下片段

`timescale 1ns/1ps  //change the timescale as per your need.
module tb();
reg clk;  //Declaration
localparam CLK_PERIOD = 10; //Add your clock period here to adjust the frequency
initial
begin
clk = 1'd0;
end
always
#CLK_PERIOD/2 : clk = ~clk;

最新更新