当前位置:首页 > 工业控制 > 电子设计自动化
[导读]一、摘要: SPI 接口应用十分广泛,在很多情况下,人们会用软件模拟的方法来产生SPI 时序或是采用带SPI 功能模块的MCU。但随着可编程逻辑技术的发展,人们往往需要自己设计简单的SPI 发送模块。本文介绍一种基于FPGA

一、摘要:

SPI 接口应用十分广泛,在很多情况下,人们会用软件模拟的方法来产生SPI 时序或是采用带SPI 功能模块的MCU。但随着可编程逻辑技术的发展,人们往往需要自己设计简单的SPI 发送模块。本文介绍一种基于FPGA 的将并行数据以SPI 串行方式自动发送出去的方法。

二、关键字:

VHDL、FPGA、SPI、串行数据输出选择模块、移位脉冲产生模块、SPI 时钟采集信号和无相移的SPI 基准时钟产生模块、SPI 时钟输出选择模块、8bit SPI 时钟采集生成模块、16bit SPI 时钟采集生成模块、24bit SPI 时钟采集生成模块、8bit 数据移位模块、16bit 数据移位模块、24bit 数据移位模块。

三、功能框图:

SPI_MODES 为输入模式选择端口:

--"01"is 8bit 传输模式

--"10"is 16bit 传输模式

--"11"is 24bit 传输模式

CLKS 为整个模块的基准时钟

DBINOUTS 为并行数据输入端口:

--8bit 模式为DBINOUTS(7 downto 0)

--16bit 模式为DBINOUTS(15 downto 0)

--24bit 模式为DBINOUTS(23 downto 0)

SPI_WR 为启动SPI 传输的信号


整个功能模块可工作在 8bit、16bit、24bit SPI 猝发传输状态。对其进行软件操作的步骤相当简单:

--此模块软件操作流程如下

--1、SPI_MODES="xx" 设定串口操作模式

--2、DBINOUTS="xxxxxxxxxxxxxxxxxxxxxxxx" 输入要发射的数据

--3、SPI_WR='0'

--4、SPI_WR='1'

--5、SPI_WR='0'

--8bit 模式延时2*8*4*CLKS

--16bit 模式延时2*1**CLKS

--24bit 模式延时2*24*4*CLKS

--6、DBINOUTS="xxxxxxxxxxxxxxxxxxxxxxxx" 输入下一个要发射的数据

四、VHDL 描述解读

--以下描述的是一个SPI 自动发射模块

--在很多情况下,人们会用软件模拟的方法来产生SPI 时序

--这里采用硬件的方法,即使软件操作更为简单,有提高了传输的速度

--------------------------------------------------------------

--此模块软件操作流程如下

--1、SPI_MODES="xx" 设定串口操作模式

--2、DBINOUTS="xxxxxxxxxxxxxxxxxxxxxxxx" 输入要发射的数据

--3、SPI_WR='0'

--4、SPI_WR='1'

--5、SPI_WR='0'

--8bit 模式延时2*8*4*CLKS

--16bit 模式延时2*1**CLKS

--24bit 模式延时2*24*4*CLKS

--6、DBINOUTS="xxxxxxxxxxxxxxxxxxxxxxxx" 输入下一个要发射的数据

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity SPI_interface is

port(CLKS :in std_logic; --基准时钟

LCD_SCLS :out std_logic;--SPI 发射时钟,上升沿有效

LCD_SDIS :out std_logic;--SPI 数据串行输出口

SPI_MODES :in std_logic_vector(1 downto 0);

--串口操作模式选择

--"01"is 8bit trans mode

--"10"is 16bit trans mode

--"11"is 24bit trans mode

SPI_WR :in std_logic; --启动串口发送信号

DBINOUTS :in std_logic_vector(23 downto 0));

--背发送数据的并行输入口

--8bit mode use DBINOUTS(7 downto 0)

--16bit mode use DBINOUTS(15 downto 0)

--24bit mode use DBINOUTS(23 downto 0)

end;

architecture SPI_interface_behav of SPI_interface is

signal DB8BIT_reg :std_logic_vector(7 downto 0); --8bit 数据移位寄存器

signal DB16BIT_reg :std_logic_vector(15 downto 0);--16bit 数据移位寄存器

signal DB24BIT_reg :std_logic_vector(23 downto 0);--24bit 数据移位寄存器

signal counter4 :std_logic_vector(3 downto 0); --移位脉冲产生计数器

signal counter4s :std_logic_vector(1 downto 0); --SPI 时钟生成计数器

signal counter8 :std_logic_vector(4 downto 0); --8bit SPI 时钟控制计数器

signal counter16 :std_logic_vector(5 downto 0); --16bit SPI 时钟控制计数器

signal counter24 :std_logic_vector(5 downto 0); --24bit SPI 时钟控制计数器

signal shift :std_logic;--移位时钟脉冲

signal LCD_SCLSS :std_logic;--SPI 时钟采集信号

signal LCD_SCLSSS :std_logic;--无相移的SPI 基准时钟

signal LCD_SCLSS8 :std_logic;--8bit SPI 时钟信号

signal LCD_SCLSS16 :std_logic;--16bit SPI 时钟信号

signal LCD_SCLSS24 :std_logic;--24bit SPI 时钟信号

signal LCD_SDIS_8BIT :std_logic;--8bit SPI 数据信号

signal LCD_SDIS_16BIT :std_logic;--16bit SPI 数据信号

signal LCD_SDIS_24BIT :std_logic;--24bit SPI 数据信号

begin

--串行数据输出选择模块

u1:process(LCD_SDIS_8BIT,LCD_SDIS_16BIT,LCD_SDIS_24BIT,SPI_MODES)

begin

if SPI_MODES="01" then --选择8bit 串行数据输出

LCD_SDIS<=LCD_SDIS_8BIT;

elsif SPI_MODES="10" then --选择16bit 串行数据输出

LCD_SDIS<=LCD_SDIS_16BIT;

elsif SPI_MODES="11" then --选择24bit 串行数据输出

LCD_SDIS<=LCD_SDIS_24BIT;

else LCD_SDIS<='1';

end if;

end process;

--移位脉冲产生模块

u2:process(CLKS)

begin

if CLKS='1' and CLKS'event then

if counter4="0011" then

counter4<="0000";

shift <='1';

else counter4<=counter4+1;

shift <='0';

end if;

end if;

end process;

--SPI 时钟采集信号和无相移的SPI 基准时钟产生模块

u3:process(CLKS)

begin

if CLKS='1' and CLKS'event then

if counter4s<"11" then

counter4s<=counter4s+1;

else counter4s<="00";

end if;

end if;

LCD_SCLSS<=counter4s(0); --SPI 时钟采集信号

LCD_SCLSSS<=counter4s(1); --无相移的SPI 基准时钟

end process;

--SPI 时钟输出选择模块

u4:process(LCD_SCLSS8,LCD_SCLSS16,LCD_SCLSS24,SPI_MODES)

begin

if SPI_MODES="01" then

LCD_SCLS<=LCD_SCLSS8; --选择8bit SPI 时钟模式

elsif SPI_MODES="10" then

LCD_SCLS<=LCD_SCLSS16; --选择16bit SPI 时钟模式

elsif SPI_MODES="11" then

LCD_SCLS<=LCD_SCLSS24; --选择24bit SPI 时钟模式

else LCD_SCLS<='1';

end if;

end process;

--8bit SPI 时钟采集生成模块

counter8_u:process(LCD_SCLSS)

begin

if SPI_WR='1' then

counter8<="10001";

elsif LCD_SCLSS='1' and LCD_SCLSS'event then

if counter8>0 then

counter8<=counter8-1;

LCD_SCLSS8<=LCD_SCLSSS;

end if;

end if;

end process;

--16bit SPI 时钟采集生成模块

counter16_u:process(LCD_SCLSS)

begin

if SPI_WR='1' then

counter16<="100001";

elsif LCD_SCLSS='1' and LCD_SCLSS'event then

if counter16>0 then

counter16<=counter16-1;

LCD_SCLSS16<=LCD_SCLSSS;

end if;

end if;

end process;

--24bit SPI 时钟采集生成模块

counter24_u:process(LCD_SCLSS)

begin

if SPI_WR='1' then

counter24<="110011";

elsif LCD_SCLSS='1' and LCD_SCLSS'event then

if counter24>0 then

counter24<=counter24-1;

if (counter24="000000")or(counter24="000001")or

(counter24="110011")or(counter24="000010")then

LCD_SCLSS24<='0';

else

LCD_SCLSS24<=LCD_SCLSSS;

end if;

end if;

end if;

end process;

--8bit 数据移位模块

DB8BIT_U:process(shift,SPI_WR,DBINOUTS)

begin

if SPI_WR='1' then

DB8BIT_reg<=DBINOUTS(7 downto 0);

else

if shift='1' and shift'event then

LCD_SDIS_8BIT<=DB8BIT_reg(0);

DB8BIT_reg(6 downto 0)<=DB8BIT_reg(7 downto 1);

end if;

end if;

end process;

--16bit 数据移位模块

DB16BIT_U:process(shift,SPI_WR,DBINOUTS)

begin

if SPI_WR='1' then

DB16BIT_reg(15 downto 0)<=DBINOUTS(15 downto 0);

else

if shift='1' and shift'event then

LCD_SDIS_16BIT<=DB16BIT_reg(0);

DB16BIT_reg(14 downto 0)<=DB16BIT_reg(15 downto 1);

end if;

end if;

end process;

--24bit 数据移位模块

DB24BIT_U:process(shift,SPI_WR,DBINOUTS)

begin

if SPI_WR='1' then

DB24BIT_reg(23 downto 0)<=DBINOUTS(23 downto 0);

else

if shift='1' and shift'event then

LCD_SDIS_24BIT<=DB24BIT_reg(0);

DB24BIT_reg(22 downto 0)<=DB24BIT_reg(23 downto 1);

end if;

end if;

end process;

end;

五、仿真波形图


六、编译后资源占用情况


七、结束语

本文旨在给学习可编程技术的人们提供一个参考,起到抛砖引玉的作用。望阅读过此文的读者提供更好的方法,与所有的学习者共享,共勉!(作者:姚青华)



来源:星梦居0次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

3D打印技术(3D printing technology)是一种以数字模型为基础,通过逐层累加材料的方式制造物体的技术。它已经在许多领域引起了广泛的关注和应用,包括制造业、医疗领域、建筑业、艺术设计等。本文将围绕3D打...

关键字: 3D打印 数字模型 技术

3D打印技术在医疗领域的应用日益广泛,它不仅能够提供个性化的医疗解决方案,还能够快速制造医疗器械和人体组织模型,为医生和患者带来了许多益处。本文将详细介绍3D打印技术在医疗方面的应用,并探讨其所起到的作用。

关键字: 3D打印 医疗 技术

6月21日消息,最近在法国巴黎举行的联合国教科文组织首届阿勒福赞奖颁奖仪式上,中国科学院古脊椎动物与古人类研究所付巧妹获得阿勒福赞科学、技术、工程、数学领域杰出青年科学家国际奖(简称"阿勒福赞奖")。

关键字: 科学 技术 工程

DSP又称数字信号处理器,数字信号处理是将信号以数字方式表示并处理的理论和技术。数字信号处理与模拟信号处理是信号处理的子集。数字信号处理的目的是对真实世界的连续模拟信号进行测量或滤波。因此在进行数字信号处理之前需要将信号...

关键字: DSP 技术 信号处理

以5G为代表的无线技术对于创造更美好未来的关键作用,正变得越发凸显。作为全球领先的无线科技创新者,高通从2G到5G始终引领着每一代技术演进,并通过领先的技术推动着移动行业的发展。过去一年,全球通信产业遭遇重创,处在前所未...

关键字: 高通 技术 5G

目前,在智能手机的这个大家庭里面,4G已经普及到千家万户。但是,科技的发展日新月异,是不会就此在4G面前止步不前的。因此,5G就横空出世了。在5G这个目前最先进的通讯信号领域,华为,无疑站在了潮头。在5G领域,感觉华为就...

关键字: 手机 华为 技术

无人机的用途很广,但每个应用的规模又在初级阶段或者是已经到了天花板,很难有大的增长。初级规模的呢,主要还是技术不成熟以及有巨大的安全隐患。无人机是无人驾驶飞机的简称(Unmanned Aerial Vehicle),是利...

关键字: 无人机 技术 领域

开关电源模块所属商标类别为第9类。开关电源模块十大品牌数据由CN10排排榜技术研究部门和CNPP品牌数据研究部门通过资料收集整理,并基于大数据统计及人为根据市场和参数条件变化的分析研究专业测评而得出,是大数据、云计算、数...

关键字: 电路 开关电源 模块

自动驾驶是指在不需要测试驾驶员执行物理性驾驶操作的情况下,车辆能够对行驶任务进行指导与决策,并代替驾驶员操控使车辆完成安全行驶的功能。自动驾驶汽车应具备自动行驶功能、自动变速功能、自动刹车功能、自动监视周围环境功能、自动...

关键字: 自动驾驶 驾驶辅助 技术

摘要:分布式光伏项目因投资收益率较高,目前正处于快速发展的阶段。现首先对建设分布式光伏项目的意义及工程流程进行了说明,然后对施工中遇到的主要技术问题进行了分析,最后给出了解决方案,可供设计和工程技术人员参考。

关键字: 分布式光伏 方案 技术
关闭
关闭