首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Verilog中添加“红黄”灯的状态

如何在Verilog中添加“红黄”灯的状态
EN

Stack Overflow用户
提问于 2019-07-09 03:59:56
回答 1查看 179关注 0票数 0

我写了一个简单的学校项目红绿灯,我想添加一个“红黄”灯的新状态。

这张图片显示了它应该是什么样子

我不知道"if-else“语句是什么样子的。

预先感谢您的帮助

代码语言:javascript
复制
`timescale 1ns / 1ps
module Traffic
(
  input       reset,
  input       clk,
  input       NS_VEHICLE_DETECT,
  input       EW_VEHICLE_DETECT,
  output wire NS_RED,
  output wire NS_YELLOW,
  output wire NS_GREEN,
  output wire EW_RED,
  output wire EW_YELLOW,
  output wire EW_GREEN
);

reg [5:0] lights; //  {NS_RED, NS_YELLOW, NS_GREEN, EW_RED, EW_YELLOW, EW_GREEN}
reg [4:0] nsCounter;
reg [3:0] ewCounter;
reg [1:0] yellowCounter;


assign {NS_RED, NS_YELLOW, NS_GREEN, EW_RED, EW_YELLOW, EW_GREEN} = lights;


always @(posedge clk)
   if (reset)
      lights <= 6'b001100;
   else
     if (nsCounter == 31 & EW_VEHICLE_DETECT & NS_GREEN)
       lights <= 6'b010100;
     else
       if (ewCounter == 15 & EW_GREEN) 
         lights <= 6'b100010;
       else
         if (yellowCounter == 3 & NS_YELLOW)
           lights <= 6'b100001;
         else
           if (yellowCounter == 3 & EW_YELLOW) 
             lights <= 6'b001100;
//------------------------------------

always @(negedge clk)
  if (reset)
    begin
      nsCounter     <= 5'h0;
      ewCounter     <= 4'h0;
      yellowCounter <= 2'h0;
    end
  else
    begin
      nsCounter     <= nsCounter     + 1'b1;
      ewCounter     <= ewCounter     + 1'b1; 
      yellowCounter <= yellowCounter + 1'b1;
    end
//------------------------------------

endmodule
//====================================
EN

回答 1

Stack Overflow用户

发布于 2019-07-09 21:04:17

您在这里编写了一个优先级编码器,其中最后一个条件仅在其他条件都无效的情况下才适用。这通常实现较慢(除非合成工具可以优化不可达状态),并且更难扩展(如您所发现的)。

在检查来自每个状态的流对于所有可能的状态都是正确的方面也更难分析。

尽管它看起来不太理想,但更常见的做法是使用状态变量将状态机编写为case语句。然后展开“对于每个状态,下一个状态条件是...”表达式。

使用图像中隐含的编码,这将是一个显而易见的case表达式

代码语言:javascript
复制
2'b01: nextState = (counter == 5'h0f) ? 2'b10 : 2'b01;

基于state/nextstate,您还可以确定计数器需要什么行为。请记住,如果您有多个计数器,则您对计数状态和光状态之间的相关性有一些隐含的假设。

这个问题不明显的部分是,你可能不想要一个4状态序列(如图中所示,其中轴处于‘反转’状态),你有多达16个潜在状态,因为你有两组光。这取决于你首先从一个“稳定”状态画出所有可能的路径,找出你需要避免的状态(例如G/G)。这是将状态变量从输出中解耦的另一个原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56941827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档