verilog - 我有一个 Verilog 代码,问题是我需要 C 位与 B_G2 同时变高,这是在 else 语句中完成的
问题描述
问题是我需要 C 位与 B_G2 同时变高,并且它是在 else 语句中完成的。
这是我到目前为止的代码:
module lightcontrol(clk, R,C, A_CAR, B_CAR, lightsA, lightsB, cnt);
`define A_G2 3'b000
`define A_Y 3'b001
`define B_G1 3'b010
`define B_G2 3'b110
`define B_Y 3'b101
`define A_G1 3'b100
`define RED 3'b100
`define YELLOW 3'b010
`define GREEN 3'b001
input clk;
input A_CAR;
input B_CAR;
input R ;
output [2:0] lightsA;
output [2:0] lightsB;
output [3:0] cnt;
output C;
reg [3:0] cnt = 0;
reg [2:0] state;
reg C = 0;
always @(posedge clk)
begin
if (R==0 && C==1)
begin
if((state == `B_G2)&&(A_CAR == 1'b1))
state=`B_Y;
C=0;
end
else if ((R==1 &&C==0) | (R==1 && C==1))
state = `A_G2;
else
case(state)
`A_G2: state = B_CAR ? `A_Y : `A_G2;
`A_Y: state = `B_G1;
`B_G1:
begin
state = `B_G2;
C=1;
end
`B_G2: state = A_CAR ? `B_Y : `B_G2 ;
`B_Y: state = `A_G1 ;
`A_G1: state = `A_G2 ;
endcase
end
assign lightsA = ((state == `A_G2)|(state == `A_G1)) ? `GREEN: (state == `A_Y) ? `YELLOW : `RED;
assign lightsB = ((state == `B_G2)|(state == `B_G1)) ? `GREEN: (state == `B_Y) ? `YELLOW : `RED;
endmodule
解决方案
您应该使用非阻塞分配
而不是像你正在做的那样初始化变量,reg C = 0
你应该使用重置。除此之外,为了获得事件,您需要确定运行该代码所需的条件。
您立即看到它需要C == 0
,R == 0
来运行案例(以推进状态)。而你感兴趣的事件需要 state 为B_G1
,你可以去state == B_G1
from ,如果你在 state并且输入被设置state == A_Y
,你可以到达 to 。最后(最初)你去状态when 。也许更好地理解波形。state == A_Y
A_G2
B_CAR
A_G2
R == 1
(由wavedrom提供支持)
{signal: [
{name: 'clk', wave: 'p....'},
{name: 'R', wave: '10...'},
{name: 'C', wave: 'x0..1'},
{name: 'state', wave: 'x2345', data:['A_G2', 'A_Y', 'B_G1', 'B_G2']},
{name: 'B_CAR', wave: 'x1xxx'},
]}
推荐阅读
- javascript - 为什么预加载器在我的 React 应用程序中不起作用?
- javascript - 如何获取此 JSON 的名称或从 NodeJS Express 路由器获取路径?
- memory-management - 如何计算Bert的内存需求?
- angular - Angular Material 不应用样式
- python - 校准不失真以减小图像大小
- c# - 是否可以在可缩放的图片框图像(固定大小的图片框)上添加标签?
- kotlin-coroutines - kotlin coroutines - 为什么 Thread.sleep 不会在启动时暂停主线程?
- java - Firestore 查询不等于 Uid
- django - 如何从 Django REST 框架中获取数据?
- c# - SQL Server 2012 表中包含的地理编码地址 - 添加纬度/经度