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

这张图片显示了它应该是什么样子
我不知道"if-else“语句是什么样子的。
预先感谢您的帮助
`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
//====================================发布于 2019-07-09 21:04:17
您在这里编写了一个优先级编码器,其中最后一个条件仅在其他条件都无效的情况下才适用。这通常实现较慢(除非合成工具可以优化不可达状态),并且更难扩展(如您所发现的)。
在检查来自每个状态的流对于所有可能的状态都是正确的方面也更难分析。
尽管它看起来不太理想,但更常见的做法是使用状态变量将状态机编写为case语句。然后展开“对于每个状态,下一个状态条件是...”表达式。
使用图像中隐含的编码,这将是一个显而易见的case表达式
2'b01: nextState = (counter == 5'h0f) ? 2'b10 : 2'b01;基于state/nextstate,您还可以确定计数器需要什么行为。请记住,如果您有多个计数器,则您对计数状态和光状态之间的相关性有一些隐含的假设。
这个问题不明显的部分是,你可能不想要一个4状态序列(如图中所示,其中轴处于‘反转’状态),你有多达16个潜在状态,因为你有两组光。这取决于你首先从一个“稳定”状态画出所有可能的路径,找出你需要避免的状态(例如G/G)。这是将状态变量从输出中解耦的另一个原因。
https://stackoverflow.com/questions/56941827
复制相似问题