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

FPGA 怎么实现UART串口和IIC口或SPI 通讯?
我原来只用过MCU,通过配置内部寄存器或模拟端口都很容易实现。FPGA好象弄,和MCU、DSP、ARM有什么区别吗?现在没一点头绪,各位大侠可以给点建议吗?谢谢
很感谢大家的回答
再次追加悬赏30分

第1个回答  2011-12-08
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;追问

您好,真心感谢
还想请问下,FPGA通讯比如UART,也可以设置帧头如(0xee,0xee,0xee)+数据包+帧尾(0xfe,0xfe,0xfe)这样格式,接收数据包后保存吗?
FPGA里也应有一定的RAM空间供你的上面所说“ FPGA是属于硬件编程,程序是并行执行的,可以有多个进程,同时执行不同的功能”去运行使用还是怎么的?内部都自带RAM吗?
我看到一般的FPGA都外接flash。。。供每次上电时flash内程序下载到FPGA。都是这样吗?
EEPROM有没有使用?

追答

怎么回答N次了,都回答不上啊,

第2个回答  2011-12-06
你有以下方法可以实现:
  1、参照UART串口、I2C、SPI协议,用状态机来模拟master和slave;UART的程序可见参考资料,I2C的我也只写过slave,SPI相对来说简单一点。
  2、既然你对MCU很熟悉,更简单的你可以在FPGA内部内建MCU的IP,这样你就可以直接用MCU来实现的你通讯了;
希望这些对你有帮助,欢迎追问。追问

您好,用状态机来模拟master和slave?
请问“状态机”指的是什么?
是使用仿真软件上的 tool 还是什么?

追答

状态机在FPGA应用中非常普遍,用于实现不同状态之间的切换的。如果你不清楚状态机的话,建议你先学习下VHDL或verilog的书,任何一本入门的书籍中都会有的。

第3个回答  2011-12-06
MCU内部集成了I2C和SPI总线控制模块,通过设置相应的寄存器即可产生总线时序,而在FPGA里面,所有的总线时序都需要你自己模拟产生。所以,关键是要清楚总线协议,并且查阅器件的时序图,通过硬件描述语言产生读写时序,即可正常读写器件。
第4个回答  2011-12-05
既然是FPGA,对方是啥接口你设计啥接口.追问

谢谢你的回答
是不是FPGA的引脚,比如a,b,c,d四个脚,通过设置内部时序及逻辑。
可以把它设置成与外部UART相连,也可以改变下内部时序及逻辑把它作SPI、IIC甚至CAN BUS使用吗???
RAM内部也有使用吧

追答

理解正确. 但有些细节需要注意:
1. CAN略有不同,就是一定要选择能配成差分对的IO.
2. SPI的SCK最好选能配成时钟的io, 但然由于SPI速度也不高, 用io未尝不可.
3. 接不同外设, 需考虑电平一致性. 譬如外设用3.3, 你FPGA相应io对应的Bank电压得是3.3, 否则配成UART后端口电平譬如是2.5V了就不合格.
4. FPGA内RAM块是用于实现高速算法用的, 容量都很小. 拿用作MCU实在太浪费了, 宁愿闲着. 用FPGA的io接到SRAM是很方便的. 但接DDR,DDR2有点难度, 因为差分,速度, 最好看芯片手册确信支持,有无MegaCore/IPcode可例化.

本回答被提问者采纳
相似回答