当前位置:首页 > 工业控制 > 电子设计自动化
[导读]一、摘要: 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次

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

在当今数字化时代,边缘 AI 正以前所未有的态势改变着我们的生活与产业格局。从智能安防到自动驾驶,从医疗健康到工业制造,边缘 AI 的身影无处不在。然而,要实现边缘 AI 的全面适用,仍面临诸多挑战,而负责任的赋能技术则...

关键字: 边缘 技术 数字化

在科技飞速发展的当下,汽车行业正经历着一场深刻变革,汽车通信系统作为其中的关键领域,展现出了极为光明的前景。其中,车对车(V2V)和车对基础设施(V2I)技术凭借其在避免事故方面的卓越潜力,成为了人们关注的焦点。

关键字: 汽车 通信系统 技术

在全球经济格局深度调整的当下,企业面临着日益激烈的市场竞争。为了在这一浪潮中脱颖而出,实现可持续发展,数字化转型已成为企业的必然选择。而技术创新作为推动数字化转型的核心驱动力,正引领着企业迈向高 “智” 量发展的新征程。

关键字: 数字化 技术 创新

随着人工智能、大数据、物联网等新一代技术的蓬勃发展,物流行业正经历着前所未有的变革。物流智慧化改造,即以智能化、自动化为核心,通过引入先进的技术手段,优化物流流程,提升运营效率,已成为物流行业发展的重要趋势。智能物流系统...

关键字: 物流 智能 技术

近年来,随着科技的飞速发展,自动驾驶技术正逐步从概念走向现实,并在全球范围内掀起了一场新的技术革命。在这场革命中,L3级自动驾驶作为迈向更高阶自动驾驶的关键一步,成为了各大车企和技术提供商竞相角逐的重头戏。本文将深入探讨...

关键字: 自动驾驶 技术 L3级

在21世纪的科技浪潮中,人类社会正以前所未有的速度迈向智能化时代。从智能家居到智慧城市,从智能制造到智慧医疗,技术的每一次飞跃都在深刻改变着我们的生活、工作与思维方式。在这个充满无限可能的时代,汇聚全球领先技术,共同绘制...

关键字: 智能化 技术 智慧蓝图

“罗彻斯特电子很荣幸地宣布我们与u-blox合作。这一战略合作增强了双方在市场上的地位,丰富了产品在众多行业中多样化应用。我们致力于为广大客户提供持续可靠的支持。”

关键字: 芯片 模块 物联网

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

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

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

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

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

关键字: 科学 技术 工程
关闭