verilog语言设计交通灯的问题

来源:百度知道 编辑:UC知道 时间:2024/09/22 23:37:25
verilog语言设计交通灯的问题中,要求绿灯变黄灯时,黄灯闪烁3个时钟后变红灯。我用的方法是讲给定的1k的时钟1000分频后得到out信号(1hz),到绿灯跳变时将1hz时钟out信号赋给黄灯。请问能直接这样赋值吗?如果不能,该用什么方法实现黄灯的1hz闪烁?

原题目是:a,b方向各有红,黄,绿灯,初始态全为红灯,之后东西方向通车,绿灯灭后,黄灯闪烁,各路口通车时间为30秒,由两个七段数码管计数,当显示时间小于3秒的时候通车方向黄灯闪烁
系统时钟1khz,黄灯闪烁时钟要求为2hz,七段码管的时间显示为1hz脉冲,即1秒递减一次,在显示时间小于3秒时,通车方向的黄灯以2hz的频率闪烁,系统中加入外部复位信号。
请高手指点迷津,如果给出全部控制模块更好~~~
如果没有时间,请指点提问中能否将分频过的out时钟信号赋给黄灯的问题,如果不能,请受累指点该如何实现,不胜感激!!!
所有分数全部奉上!在线等...

我们将问题分解为2部分,来自同步时钟域信号的处理和来自异步时钟域信号的处理。前者要简单许多,所以先讨论前者,再讨论后者。

1.同步时钟域信号的处理
一般来说,在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存。只要满足建立时间,保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是如果模块需要使用输入信号的跳变沿(比如帧同步信号),千万不要直接这样哦。
always @ (posedge inputs)
begin
...
end
因为这个时钟inputs很有问题。如果begin ... end语句段涉及到多个D触发器,你无法保证这些触发器时钟输入的跳变沿到达的时刻处于同一时刻(准确的说是相差在一个很小的可接受的范围)。因此,如果写出这样的语句,EDA工具多半会报clock skew > data delay,造成建立/保持时间的冲突。本人曾经也写出过这样的语句,当时是为了做分频,受大二学的数字电路的影响,直接拿计数器的输出做了后面模块的时钟。当初用的开发工具是max+plusII,编译也通过了,烧到板子上跑倒也能跑起来(估计是因为时钟频率较低,6M:lol:),但后来拿到 QuartusII中编译就报clock skew > data delay。大家可能会说分频电路很常见的啊,分频输出该怎么用呢。我一直用的方法是采用边沿检测电路,用HDL语言描述大概是这样:
always @ (posedge Clk)
begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1)
begin
...
end
...