FPGA 怎么实现UART串口和IIC口或SPI 通讯?可以大概说一下吗?

FPGA 怎么实现UART串口和IIC口或SPI 通讯?可以大概说一下吗?,第1张

1. FPGA与MCU,DSP,ARM等区别

MCU等是属于软件编程,程序是森清顺序执行,即使像DSP有多级流水线,但是程序总体还是顺序的。

FPGA是属于硬件编程,程序是并行执行的,可以有多个进程,同时执行芹春早不同的功能。

2. FPGA实现UART,IIC,SPI。

如果是简单的应用(比如说不用校验等等),完全可以自己写,例如下面的程序,VHDL写的,既可以作为UART发送程序(改改就是接收嫌雀),也可以做SPI发送或者接收(加一个时钟)。

如果需要较完善的功能的话,建议使用IP核,往上有很多免费的UART,IIC,SPI等接口的IP核,功能及代码都给你写好了的,提供输入输出接口,方便应用。

process(Clk)

variable temp : integer range 0 to 7

begin

if Clk'event and Clk='1' then

if Reset = '0' then

TxD <= '1'

BitCnt <= "00000"

SL<='1'

TReg<=(others=>'0')

temp:=0

elsif Load = '0' and temp=0 then

TxD <= '1'

SL<='1'

BitCnt <= "00000"

temp:=0

elsif Load='1' and temp=0 then

temp:=1

elsif temp=1 then

case BitCnt is

when "00000" =>

TReg <= Addr_Data

SL<='0'

TxD <= '0'

BitCnt <= BitCnt + 1

temp:=1

when "00001" | "00010" | "00011" |

"00100" | "00101" | "00110" |

"00111" | "01000" | "01001" |

"01010" | "01011" | "01100" |

"01101" | "01110" | "01111" =>

TxD <= TReg(0)

TReg <= '1' &TReg(14 downto 1)

BitCnt <= BitCnt + 1

temp:=1

when "10000" =>

SL<='1'

TxD <= '1'

TReg <= '1' &TReg(14 downto 1)

BitCnt <= "00000"

temp:=0

when others =>NULL

end case

ELSE

TXD<='1'

SL<='1'

end if

end if

end process

给你一个按115200bps的测试激励,这是连发12个字节的,楼主可以参考修改下。

initial

begin

reset = 1 //复位信号高有效

clk = 0// 20MHz

uart_data_in = 1// 串口数据线

#100000 reset = 0 //销谨颤1000us复位结束

shift_reg[95:0] = 96'dxx //待移位的字节寄存器(12个字节共96bit)

//以下是 按115200bps速率发送12字节

repeat(12)

begin

txd_reg = shift_reg[95:88]

p_check = ~(txd_reg[7]^txd_reg[6]^txd_reg[5]^txd_reg[4]^txd_reg[3]^txd_reg[2]^txd_reg[1]^txd_reg[0])// 奇校验,要是不用可以直接填0

#8681 f_in_data_a1 = 0//起始位

#8681 f_in_data_a1 = txd_reg[0] // 数据位[0]

#8681 f_in_data_a1 = txd_reg[1] // 数据位[1]

#8681 f_in_data_a1 = txd_reg[2] // 数据位[2]

#8681 f_in_data_a1 = txd_reg[3] //亏败 数据位[3]

#8681 f_in_data_a1 = txd_reg[4] // 数据位[4]

#8681 f_in_data_a1 = txd_reg[5] // 数据位[5]

#8681 f_in_data_a1 = txd_reg[6] // 数据位[6]

#8681 f_in_data_a1 = txd_reg[7] // 数晌誉据位[7]

#8681 f_in_data_a1 = p_check// 奇偶校验位

#8681 f_in_data_a1 = 1// 停止位

shift_reg = shift_reg<<8 // 准备下一个字节

end

ps: #8681,由于串口波特率是115200bps,因此1bit的发送时间是1/115200 ≈ 8681ns

你先仿真烂链下看看数据最后输出的对不对。。各部分都没有问题了你再下板子。。如果有错误分析下现象,不然错也不知道错在哪,直接看程序问题也没有重点不好找饥粗孙。。。

如果仿真是对的,看下你的串口助手的波特率设置的对不对,必须要和你FPGA程序里波特率一致,串口助手才可以显示出来你的数据。。。

如果是程序仿真都不对,那再追问,我帮你看这个程序,前年的时候我做过凳穗UART的东西。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12369806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存