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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)