-
看不明白
-
好像是存在这个问题
而且这个
reg reg_low;
reg reg1_low;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
reg_low
-
kankan
-
在设计上你可能存在缺陷,需要一个上电复位和一个手动置位.上电复位是用来置默认控制方式,而手动置位用来设置你需要进行的控制方式
-
50楼说我给弄复杂了:loveliness:
-
咋便宜,咋方便,咋赚钱,咋弄
-
静等解决方法:)
-
硬件设计思想和软件设计思想有什么差别?
-
另外个双向端口的控制信号是不是就是实际读写中的读写信号呢?如果不是又是什么关系?
-
这个要顶,我是看过再看的。只是没回复:loveliness:
-
你写的状态机分成了时序部分和组合部分(第二个进程),但是在状态转换的条件需要通过计数器来计数实现。计数器计数是时序逻辑,你直接写进到组合逻辑中,导致计数器不能正确计数。
-
不是,是我看不懂,不知道那些端口信号是时钟呢还是普通信号
-
没错
-
里面错了点
-
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Controller IS
PORT(
--控制器输入信号
Clk:IN STD_LOGIC;
--时钟输入信号,由分频模块分频后接入1Hz信号
Reset:IN STD_LOGIC;
--复位信号,低电平有效,复位后交通灯全部熄灭
En:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
--四种工作模式选择信号
--控制器输出信号
Counter_a:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);
Counter_b:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);
--两个不同方向通行时间
Wr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Ws:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Wl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Wc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
--西面交通信号灯输出
Nr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Ns:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Nl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Nc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
--北面交通灯信号输出
Er:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Es:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
El:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Ec:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
--东面交通信号灯输出
Sr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Ss:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Sl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
Sc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0)
--南面交通信号灯输出
);
END Controller;
ARCHITECTURE Behav OF Controller IS
TYPE STATES IS (LOAD,N_S,ES_WN,EW,WS_EN);
--定义模式一与模式二的五个状态
SIGNAL count_a:STD_LOGIC_VECTOR(5 DOWNTO 0);
SIGNAL count_b:STD_LOGIC_VECTOR(5 DOWNTO 0);
--用于寄存计数器的具体值
SIGNAL state1,state2: STATES;
--分别用于模式一与模式二的状态寄存器
BEGIN
--各个模式及其状态转移
REG:PROCESS(Reset,Clk,state1,state2,count_b,count_a,en)
BEGIN
IF(Reset='0') THEN
count_a
-
端口信号是什么意思??
-
需要,你记住你后面的一个进程是组合逻辑,不是时序逻辑。进行计数器则是时序逻辑,后面的count_a,count_b计数的时候都要分开写
-
你把状态机的组合逻辑和状态转移分开写了,所以你在组合逻辑部分进行自加或者自减,其结果是混乱的。你可以把需要进行自加或者自减的部分分离出来,如
process(reset,clk,current_state1,current_state2)
begin
if reset='0' then
count
-
WHEN LOAD => --模式一状态0
IF(count="000000") THEN
Wr
-
可以在第二个进程中加入RESET信号
if rest='0' then
elsif en="" then
elsif en="" then