Verilog自动售货机错误

Verilog自动售货机错误,verilog,fpga,Verilog,Fpga,我正在为学校设计一个项目,我需要让代码与Verilog一起工作。目标是有4个输入(FPGA上的按钮)、quarter、nickel、dime和reset,以及确定我要购买哪种玉米煎饼(豆煎饼、牛排煎饼和鸡肉煎饼)的开关。我需要在七段显示器上显示插入的当前货币。我遇到的问题是,七段显示器不工作。它只显示我的默认值,没有任何开关工作,按钮也不工作。我发现这个网站在寻求帮助,并发现了其他的例子,我试着遵循其中的一些,但我仍然被卡住了。我会感谢你的帮助,这是我第一次编码。由于某种原因,我无法插入整个代码

我正在为学校设计一个项目,我需要让代码与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美元的镍币,您会这样编码吗?一个简单的条件加法器不是更有效地跟踪当前数量吗?