没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
-- test1.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY spi IS
PORT
(
NReset: IN STD_LOGIC;
Clk: IN STD_LOGIC;
ResetWdi: BUFFER STD_LOGIC;
SPINcs: INOUT STD_LOGIC;
SPIClk: INOUT STD_LOGIC;
SPIMOSI: INOUT STD_LOGIC;
SPIMISO: INOUT STD_LOGIC;
SPITxdata: IN STD_LOGIC_VECTOR(15 DOWNTO 0);
SPIRxdata: BUFFER STD_LOGIC_VECTOR(15 DOWNTO 0);
SPIStatus: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
SPIControl: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SPILength: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SPISetClk: IN STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END;
ARCHITECTURE rtl OF spi IS
TYPE StateType IS (S0_Wait,S1_Data,S2_Stop);
SIGNAL StateIndex: StateType;
SIGNAL CntCycle:integer RANGE 0 TO 16383;
SIGNAL CntBit:integer RANGE 0 TO 15;
SIGNAL SPITxdataTmp:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL CycleBit:integer RANGE 0 TO 16383;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY spi IS
PORT
(
NReset: IN STD_LOGIC;
Clk: IN STD_LOGIC;
ResetWdi: BUFFER STD_LOGIC;
SPINcs: INOUT STD_LOGIC;
SPIClk: INOUT STD_LOGIC;
SPIMOSI: INOUT STD_LOGIC;
SPIMISO: INOUT STD_LOGIC;
SPITxdata: IN STD_LOGIC_VECTOR(15 DOWNTO 0);
SPIRxdata: BUFFER STD_LOGIC_VECTOR(15 DOWNTO 0);
SPIStatus: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
SPIControl: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SPILength: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SPISetClk: IN STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END;
ARCHITECTURE rtl OF spi IS
TYPE StateType IS (S0_Wait,S1_Data,S2_Stop);
SIGNAL StateIndex: StateType;
SIGNAL CntCycle:integer RANGE 0 TO 16383;
SIGNAL CntBit:integer RANGE 0 TO 15;
SIGNAL SPITxdataTmp:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL CycleBit:integer RANGE 0 TO 16383;
SIGNAL SPIClkCut:STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL SPIBitCut:integer RANGE 0 TO 15;
SIGNAL CntWdi:STD_LOGIC_VECTOR(9 DOWNTO 0);
BEGIN
CntWdi <= CntWdi + 1 WHEN (Clk'EVENT AND Clk = '1');
ResetWdi <= CntWdi(9);
PROCESS (NReset, Clk)
BEGIN IF(NReset = '0') THEN
SPINcs <= 'Z';
SPIClk <= 'Z';SPIMOSI <= 'Z';
SPIMISO <= 'Z';
SPIStatus <= "01100000";
SPIRxdata <= X"0000";
StateIndex <= S0_Wait;
SPIClkCut <= X"00000000";
SPIBitCut <= 0;
ELSIF(Clk'EVENT AND Clk = '1') THEN
IF(SPIControl(0) = '0') THEN
SPIMISO <= 'Z';
CASE StateIndex IS
WHEN S0_Wait =>SPIClk <= SPIControl(1);
IF(SPIControl(4) = '1')THEN
SPINcs <= SPIControl(7);
IF(SPIControl(3) = '0') THEN
SPIMOSI <= SPITxdata(CONV_INTEGER(SPILength) - 1);
ELSE SPIMOSI <= SPITxdata(0);
END IF;SPIRxdata <= X"0000";
StateIndex <= S1_Data;
SPIStatus <= "00000000";
ELSE SPINcs <= '1';
SIGNAL SPIBitCut:integer RANGE 0 TO 15;
SIGNAL CntWdi:STD_LOGIC_VECTOR(9 DOWNTO 0);
BEGIN
CntWdi <= CntWdi + 1 WHEN (Clk'EVENT AND Clk = '1');
ResetWdi <= CntWdi(9);
PROCESS (NReset, Clk)
BEGIN IF(NReset = '0') THEN
SPINcs <= 'Z';
SPIClk <= 'Z';SPIMOSI <= 'Z';
SPIMISO <= 'Z';
SPIStatus <= "01100000";
SPIRxdata <= X"0000";
StateIndex <= S0_Wait;
SPIClkCut <= X"00000000";
SPIBitCut <= 0;
ELSIF(Clk'EVENT AND Clk = '1') THEN
IF(SPIControl(0) = '0') THEN
SPIMISO <= 'Z';
CASE StateIndex IS
WHEN S0_Wait =>SPIClk <= SPIControl(1);
IF(SPIControl(4) = '1')THEN
SPINcs <= SPIControl(7);
IF(SPIControl(3) = '0') THEN
SPIMOSI <= SPITxdata(CONV_INTEGER(SPILength) - 1);
ELSE SPIMOSI <= SPITxdata(0);
END IF;SPIRxdata <= X"0000";
StateIndex <= S1_Data;
SPIStatus <= "00000000";
ELSE SPINcs <= '1';
剩余5页未读,继续阅读
资源评论
kongyang1989
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功