Vhdl 在Spartan 3E上实现由按钮触发的短脉冲信号

Vhdl 在Spartan 3E上实现由按钮触发的短脉冲信号,vhdl,fpga,digital,spartan,Vhdl,Fpga,Digital,Spartan,我试图在交通灯控制器上实现“紧急”功能 该紧急信号为std_逻辑输入,由按钮触发(使用ucf文件) 该信号的作用基本上是每当按下按钮时,控制器将检测两条道路(从北到南或从西到东)中的哪条道路是红色的,并立即将其切换为橙色(当然,另一条道路将变为红色),以让紧急车辆通过(例如救护车) 我试着去揭发开关,然后把揭发的信号输入上升沿探测器。它不起作用:按下紧急按钮使两条道路(NS和WE)的红灯和黄灯同时亮起,这简直是一场灾难,我用来配置每个灯亮多久的计数器在恢复正常之前也被干扰了很长一段时间 以下是我

我试图在交通灯控制器上实现“紧急”功能

该紧急信号为std_逻辑输入,由按钮触发(使用ucf文件)

该信号的作用基本上是每当按下按钮时,控制器将检测两条道路(从北到南或从西到东)中的哪条道路是红色的,并立即将其切换为橙色(当然,另一条道路将变为红色),以让紧急车辆通过(例如救护车)

我试着去揭发开关,然后把揭发的信号输入上升沿探测器。它不起作用:按下紧急按钮使两条道路(NS和WE)的红灯和黄灯同时亮起,这简直是一场灾难,我用来配置每个灯亮多久的计数器在恢复正常之前也被干扰了很长一段时间

以下是我目前的代码:


图书馆IEEE;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.std_logic_unsigned.all;
使用ieee.numeric_std.all;
实体TLC为
港口(
Clck:标准逻辑中;
复位:在标准逻辑中;
紧急情况:在标准逻辑中;
交通灯:输出标准逻辑向量(5到0)——NS道路的交通灯(5到3)和WE道路的交通灯(2到0)。
);
末端薄层色谱;
TLC的结构是
-------------去抖
常量计数_MAX:整数:=20;
常数BTN_激活:标准逻辑:='1';
信号计数1:整数:=0;
类型状态为(空闲,等待时间);
信号状态1:状态类型1:=空闲;
信号紧急解除公告:标准逻辑;
-----------------------------------------
类型状态_类型为(NRWG、NRWY、NGWR、NYWR)--NRWG:红色为南北,绿色为东西,依此类推。
信号一秒计数器:标准逻辑向量(25到0):=“00000000000000000000”;
信号一秒启用:标准逻辑;
信号状态:状态类型:=NRWG;
信号计数:标准逻辑向量(3到0);
常数sec8:std_逻辑_向量(3到0):=“1000”;
常数sec3:std_逻辑_向量(3到0):=“0011”;
常数sec11:std_逻辑_向量(3到0):=“1011”;
--边缘检测信号
信号紧急A、紧急B、紧急C:std_逻辑;
----------
开始
控制器:过程(Clck、复位、应急)
开始
如果emergencyc='1',则
如果state=NRWG或state=NRWY,则----如果NS为红色,则将其切换为黄色。

说明您的
debounce_emergency:process
在许多方面都是错误的。我建议您模拟您的设计来查看它。如果按下
紧急
按钮40个时钟周期,会发生什么情况


此外,在
控制器:进程中
如果紧急情况下c='1'…
部件必须位于
如果上升沿(clck)
内部,否则将触发状态信号的多次更改。

您的代码无法读取。从编写VHDL而不是移植的Verilog开始。使用VHDL的主要原因是以失去灵活性为代价的强类型和增量周期模拟。只要把std_逻辑和十几个组合过程放在各处,你的流程就不可能跟上。谢谢,我特意将紧急信号设置为异步信号,因为无论何时发生紧急情况,它都需要被激活。