Verilog自动售货机错误
我正在为学校设计一个项目,我需要让代码与Verilog一起工作。目标是有4个输入(FPGA上的按钮)、quarter、nickel、dime和reset,以及确定我要购买哪种玉米煎饼(豆煎饼、牛排煎饼和鸡肉煎饼)的开关。我需要在七段显示器上显示插入的当前货币。我遇到的问题是,七段显示器不工作。它只显示我的默认值,没有任何开关工作,按钮也不工作。我发现这个网站在寻求帮助,并发现了其他的例子,我试着遵循其中的一些,但我仍然被卡住了。我会感谢你的帮助,这是我第一次编码。由于某种原因,我无法插入整个代码,所以我将主要部分放在。我认为开始是错的Verilog自动售货机错误,verilog,fpga,Verilog,Fpga,我正在为学校设计一个项目,我需要让代码与Verilog一起工作。目标是有4个输入(FPGA上的按钮)、quarter、nickel、dime和reset,以及确定我要购买哪种玉米煎饼(豆煎饼、牛排煎饼和鸡肉煎饼)的开关。我需要在七段显示器上显示插入的当前货币。我遇到的问题是,七段显示器不工作。它只显示我的默认值,没有任何开关工作,按钮也不工作。我发现这个网站在寻求帮助,并发现了其他的例子,我试着遵循其中的一些,但我仍然被卡住了。我会感谢你的帮助,这是我第一次编码。由于某种原因,我无法插入整个代码
module LabX(quarter, nickel, dime, BB, CB, SB, clk, reset, current_state, R, L, next_state, give_BB, give_CB, give_SB, Rssd, Lssd, ld);
input quarter, nickel, dime, BB, CB, SB, clk, reset, R, L;
output next_state, give_BB, give_CB, give_SB;
output [6:0] Rssd, Lssd, current_state;
output [2:0] ld;
reg [6:0] current_state, next_state, give_BB, give_CB, give_SB, Rssd, Lssd, ld;
parameter cent0 = 0, cent5= 1, cent10 = 2, cent15=3, cent20 =4, cent25 =5, cent30=6, cent35=7, cent40=8, cent45=9, cent50=10, cent55=11, cent60=12, cent65=13, cent70=14, cent75=15, cent80=16, cent85=17, cent90=18, cent95=19, cent100=20;
always @(posedge clk or posedge reset)
begin
if(reset)
current_state = cent0;
else
current_state = next_state;
end
always @(nickel or dime or quarter or BB or CB or SB or reset)
begin
case(current_state)
cent0: begin
if(nickel)
next_state = cent5;
else if(dime)
next_state = cent10;
else if(quarter)
next_state = cent25;
else if(reset)
next_state = cent0;
end
我继续这个过程,并显示当你有足够的购买我输入了这个
cent55: begin
if(nickel)
next_state = cent60;
else if(dime)
next_state = cent65;
else if(quarter)
next_state = cent80;
else if(reset)
next_state = cent0;
if(BB)
give_BB = 1;
else if(CB)
give_CB = 1;
else if(SB)
give_SB = 0;
end
对于七段显示,我输入代码如下:
case (current_state)
cent0:Rssd=7'b1111110;
cent5:Rssd=7'b1011011;
cent10:Rssd=7'b1111110;
cent15:Rssd=7'b1011011;
cent20:Rssd=7'b1111110;
cent25:Rssd=7'b1011011;
cent30:Rssd=7'b1111110;
cent35:Rssd=7'b1011011;
cent40:Rssd=7'b1111110;
cent45:Rssd=7'b1011011;
cent50:Rssd=7'b1111110;
cent55:Rssd=7'b1011011;
cent60:Rssd=7'b1111110;
cent65:Rssd=7'b1011011;
cent70:Rssd=7'b1111110;
cent75:Rssd=7'b1011011;
cent80:Rssd=7'b1111110;
cent85:Rssd=7'b1011011;
cent90:Rssd=7'b1111110;
cent95:Rssd=7'b1011011;
cent100:Rssd=7'b1111110;
BB:Rssd=7'b0011111;
CB:Rssd=7'b0011111;
SB:Rssd=7'b0011111;
default: Rssd = 7'b1111110;
endcase
end
endmodule
我也是为Lssd做的。我相信UCF文件是正确的,我的代码有问题。我认为根据您提供的输入很难找出问题所在。您是否尝试在测试台上模拟代码?FPGA构建过程是否会给您带来一些错误或警告?也许您可以尝试将一些按钮直接路由到一些显示段,看看是否能够根据按钮输入切换显示中的某些段?顺便问一下,您的按钮输入是否直接耦合到FPGA上的物理按钮?在这种情况下,至少必须确保将输入(双触发器)与本地时钟同步,并且在按下时进行一些边缘检测。为了让它可靠,你甚至需要添加一些去抖动逻辑。(用谷歌搜索一下我的意思。)你需要看看你的“总是敏感”列表。列表中没有当前的\u状态。你可能需要看的其他东西是:注册[6:0]当前州,下一个州,给BB,给CB,给SB,Rssd,Lssd,ld;因为您以reg[6:0]开始这一行,所以您在这一行中声明的所有寄存器都将是reg[6:0]。表面上看,其中一些似乎不应该是7位值。好吧,让我试一下,我应该用较少的位对输入进行第二次reg吗?
@(镍、一角、四分之一、BB、CB或SB或reset)
是1995年的事(Verilog-1995)。自Verilog-2001以来,首选方法是使用自动灵敏度列表@*
(或@(*)
)。按照编码,看起来所有的give.*
都是推断的锁存,无法返回到0;由此产生的行为是首次购买后免费的墨西哥煎饼。21状态机对于自动售货机来说过于复杂。如果要求处理价值5美元的镍币,您会这样编码吗?一个简单的条件加法器不是更有效地跟踪当前数量吗?我认为根据您提供的输入很难找出错误。您是否尝试在测试台上模拟代码?FPGA构建过程是否会给您带来一些错误或警告?也许您可以尝试将一些按钮直接路由到一些显示段,看看是否能够根据按钮输入切换显示中的某些段?顺便问一下,您的按钮输入是否直接耦合到FPGA上的物理按钮?在这种情况下,至少必须确保将输入(双触发器)与本地时钟同步,并且在按下时进行一些边缘检测。为了让它可靠,你甚至需要添加一些去抖动逻辑。(用谷歌搜索一下我的意思。)你需要看看你的“总是敏感”列表。列表中没有当前的\u状态。你可能需要看的其他东西是:注册[6:0]当前州,下一个州,给BB,给CB,给SB,Rssd,Lssd,ld;因为您以reg[6:0]开始这一行,所以您在这一行中声明的所有寄存器都将是reg[6:0]。表面上看,其中一些似乎不应该是7位值。好吧,让我试一下,我应该用较少的位对输入进行第二次reg吗?@(镍、一角、四分之一、BB、CB或SB或reset)
是1995年的事(Verilog-1995)。自Verilog-2001以来,首选方法是使用自动灵敏度列表@*
(或@(*)
)。按照编码,看起来所有的give.*
都是推断的锁存,无法返回到0;由此产生的行为是首次购买后免费的墨西哥煎饼。21状态机对于自动售货机来说过于复杂。如果要求处理价值5美元的镍币,您会这样编码吗?一个简单的条件加法器不是更有效地跟踪当前数量吗?