在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2278|回复: 3

[求助] [求助]新学的FPGA,写了个SPI的状态机,有什么不对吗?仿真似乎总有问题。

[复制链接]
发表于 2015-4-17 22:22:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
拜托各位达人了

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY SPI3578 IS
GENERIC(
N_WAITCLK  : INTEGER := 10;
N_DELAYCLK : INTEGER := 4
);
PORT(

ICLK
: IN  STD_LOGIC;

IRESET
: IN  STD_LOGIC;



IEN     : IN  STD_LOGIC;


SPICLK
: OUT STD_LOGIC;

SDO
    : IN STD_LOGIC;

SDI
: OUT STD_LOGIC;

CS  
: OUT STD_LOGIC;

DATAIN
: IN
STD_LOGIC_VECTOR(15 DOWNTO 0);
DATAOUT  : OUT
STD_LOGIC_VECTOR(15 DOWNTO 0)

);
END ENTITY;


ARCHITECTURE BEHAVIOR OF SPI3578 IS

TYPE SPI_STATE IS (S0_IDLE,S1_REP,S2_PLACE,S3_RECIVE,S4_DELAY);
SIGNAL CURRENT_STATE,NEXT_STATE  : SPI_STATE;

SIGNAL CNT ,NDLAY  : INTEGER RANGE 0 TO  127;
SIGNAL BITL
:INTEGER RANGE 0 TO 15;
SIGNAL SCLK
: STD_LOGIC := '0';
SIGNAL TX_DATA
: STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL RX_DATA
: STD_LOGIC_VECTOR(15 DOWNTO 0);



BEGIN

STATE_RENEW
ROCESS(ICLK,IRESET)


BEGIN

IF RISING_EDGE(ICLK)
THEN

IF (IRESET ='0')
THEN

CURRENT_STATE
<= S0_IDLE;

SPICLK
<= '0';

CS
<= '1';

ELSE

CURRENT_STATE
<= NEXT_STATE;

    END IF;

END IF;

END PROCESS;

STATE_CREATROCESS(CURRENT_STATE,IEN,ICLK)

BEGIN

CASE (CURRENT_STATE) IS

WHEN S0_IDLE
=>

IF IEN = '1' THEN

NEXT_STATE <= S0_IDLE;

CNT <=  0;

CS  <= '1';

ELSE

NEXT_STATE
<= S1_REP;

END IF;

WHEN  S1_REP
=>



IF CNT <= N_WAITCLK  THEN

CNT <= CNT + 1;

NEXT_STATE <= S1_REP;

ELSE

NEXT_STATE <= S2_PLACE;

BITL <= 0;

END IF;

WHEN  S2_PLACE
=>



SDI  <= TX_DATA(15-BITL);

SCLK <= NOT SCLK;

SPICLK
<=
SCLK;

NEXT_STATE <= S3_RECIVE;



WHEN  S3_RECIVE
=>

TX_DATA(15-BITL)<= SDO;

SCLK <= NOT SCLK;

SPICLK
<=
SCLK;

IF BITL
<= 14
THEN

BITL
<= BITL + 1;

NEXT_STATE <= S2_PLACE;

ELSE

NEXT_STATE <= S4_DELAY;

END IF;

WHEN  S4_DELAY
=>

IF NDLAY  <=  N_DELAYCLK   THEN

NEXT_STATE <=S4_DELAY;

NDLAY
<=
NDLAY +1;

ELSE

NEXT_STATE <= S0_IDLE;

END IF;

WHEN OTHERS
=> NULL;

END CASE;

END PROCESS;

--SPICLK
<=
SCLK;

END  BEHAVIOR   ;
 楼主| 发表于 2015-4-17 22:26:00 | 显示全部楼层
IF CNT <= N_WAITCLK  THEN

CNT <= CNT + 1;

NEXT_STATE <= S1_REP;

ELSE

NEXT_STATE <= S2_PLACE;

BITL <= 0;

END IF;

这块似乎有问题,process里边不加clk,就执行不下去。

所以,如果 当前状态和下一状态都是 S1_REP,是不是触发不了状态更新的操作
 楼主| 发表于 2015-4-17 22:30:13 | 显示全部楼层
[img] 1111.jpg [/img]
谢谢诸位
发表于 2015-4-18 00:59:00 | 显示全部楼层
不看别的,有这么多红线,说明有很多信号被驱动乱掉了,或者是没有被驱动,在复位信号后,自己设计的逻辑一定不能有未知量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 00:58 , Processed in 0.016499 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表