我写了一个简单的学校项目交通信号灯, 我要添加“红黄”灯的新状态
此图显示了它的外观
我不知道“ 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
//====================================
答案 0 :(得分:0)
您在此处编写了优先级编码器,其中最后一个条件仅在其他条件均无效时才适用。这通常执行起来较慢(除非综合工具可以优化无法访问的状态),并且难以扩展(如您所知)。
要检查来自每个状态的流量对于所有可能的状态是否正确,也很难进行分析。
尽管看起来可能不太理想,但使用状态变量将状态机编写为case语句更为常见。然后展开“对于每个状态,下一个状态条件是...”表达式。
使用图像中暗含的编码,这将是一个明显的案例表达方式
2'b01: nextState = (counter == 5'h0f) ? 2'b10 : 2'b01;
基于状态/下一个状态,您还可以确定计数器所需的行为。请记住,如果您有一个以上的计数器,您将对计数状态和亮状态之间的相关性有一些隐含的假设。
这个问题的不明显的部分是您可能不希望有4个状态序列(如图所示,其中的轴处于“反转”状态),您有多达16个潜在状态,因为您有两组的灯。首先由您决定从“稳定”状态之一中提取所有可能的路径,然后确定需要避免的状态(例如G / G)。这是将状态变量与输出解耦的另一个原因。