
useieee.std_logic_1164.all
entity correspondis
port(
clk,en:in std_logic
Send_data:in std_logic_vector(9 downto 0)
serial:out std_logic)
end correspond
architecturecorrespond_arc of correspond is--定义结构体
begin
process(clk)
variable count:integer range 0 to 9 :=0 --定义变量,初值为0
begin
if (en='0') then
--如果信号不允许发送,即EN= ‘0’,则计数0,串口输出高电平‘1’
count:=0
serial<='1'
elsif rising_edge(clk) then
--如果允许发送,即EN= ‘1’,开始发送
if (count=9) then--如果count=9,则不停的发送数据最高位send_data[9]
serial<=Send_data(9)
else--如果count/=9,则依次从0位到9位开始发送数据
serial<=Send_data(count)
count:=count+1
end if
end if
end process
endcorrespond_arc
RXD作高电平就可以了,如果你不想接收数据,可以不用去管它。因为RS232通信是半双工,即 RXD,TXD,CLK 三线控制,其中时钟频率由传输的波特率决定,接收和发送的波特率需要设置,FPGA是自己编程时加个时钟发生器来控制TXD的频率,接收的 如PC,可由串口软件设置。只要频率匹配,从机(FPFA)TXD的信号就可以按照协议发送过去,而在主机(PC)上RXD上就接收到了数据。
理论上误码率很低,所以用RXD接收PC机发回的反馈信号,比如奇偶校验,比如一个低电平,但也可以在PC机上接收多次或者自己写协议,对接收到的数据处理,毕竟没有反馈就不知道错误与否。
程序你对着RS232的时序自己写下就可以了,你看懂了就很简单,因为关键的时序在FPGA里很容易实现。
程序方面的传输方面,你可以设置一个数据寄存器 比如 8位,用来放要发送的内容,然后 低位(或者高位,忘记了)一位一位传,传完一个移一位就可以了
一般数据传输的开始信号为低电平,结束为高电平,空闲为高电平。
因为鄙人编程是C的,在ARM上,VHDL也忘差不多了,只能告诉你大概原理。
,供你参考吧。1. 顶层程序与仿真
(1)顶层程序
--文件名:top.vhd。
--功能:顶层映射。
--最后修改日期:2004.3.24。
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity top is
Port (clk32mhz,reset,rxd,xmit_cmd_p_in:in std_logic --总的输入输出信号的定义
rec_ready,txd_out,txd_done_out:out std_logic
txdbuf_in:in std_logic_vector(7 downto 0)--待发送数据输入
rec_buf:out std_logic_vector(7 downto 0)) --接收数据缓冲
end top
architecture Behavioral of top is
component reciever
Port (bclkr,resetr,rxdr:in std_logic
r_ready:out std_logic
rbuf:out std_logic_vector(7 downto 0))
end component
component transfer
Port (bclkt,resett,xmit_cmd_p:in std_logic
txdbuf:in std_logic_vector(7 downto 0)
txd:out std_logic
txd_done:out std_logic)
end component
component baud
Port (clk,resetb:in std_logic
bclk:out std_logic)
end component
signal b:std_logic
begin
u1:baud port map(clk=>clk32mhz,resetb=>reset,bclk=>b)--顶层映射
u2:reciever port map(bclkr=>b,resetr=>reset,rxdr=>rxd,r_ready=>rec_ready,
rbuf=>rec_buf)
u3:transfer port map(bclkt=>b,resett=>reset,xmit_cmd_p=>xmit_cmd_p_in,
txdbuf=>txdbuf_in,txd=>txd_out,txd_done=>txd_done_out)
end Behavioral
(2)程序仿真
仿真波形图如图8.8.5所示。
图8.8.5 仿真波形
2. 波特率发生器程序与仿真
(1)波特率发生器VHDL程序
--文件名:baud.vhd.
--功能:将外部输入的32MHz的信号分成频率为153600Hz的信号。
--最后修改日期:2004.3.24。
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity baud is
Port (clk,resetb:in std_logic
bclk:out std_logic)
end baud
architecture Behavioral of baud is
begin
process(clk,resetb)
variable cnt:integer
begin
if resetb='1' then cnt:=0bclk<='0' --复位
elsif rising_edge(clk) then
if cnt>=208 then cnt:=0bclk<='1' --设置分频系数
else cnt:=cnt+1bclk<='0'
end if
end if
end process
end Behavioral
(2)程序仿真
仿真波形如图8.8.6所示。
图8.8.6 波特率发生器的仿真波形
3. UART发送器程序与仿真
(1)UART发送器VHDL程序
--文件名:transfer.vhd。
--功能:UART发送器。
--说明:系统由五个状态(x_idle,x_start,x_wait,x_shift,x_stop)和一个进程构成。
--最后修改日期:2004.3.24。
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity transfer is
generic(framlent:integer:=8)
Port (bclkt,resett,xmit_cmd_p:in std_logic --定义输入输出信号
txdbuf:in std_logic_vector(7 downto 0):="11001010"
txd:out std_logic
txd_done:out std_logic)
end transfer
architecture Behavioral of transfer is
type states is (x_idle,x_start,x_wait,x_shift,x_stop) --定义个子状态
signal state:states:=x_idle
signal tcnt:integer:=0
begin
process(bclkt,resett,xmit_cmd_p,txdbuf) --主控时序、组合进程
variable xcnt16:std_logic_vector(4 downto 0):="00000" --定义中间变量
variable xbitcnt:integer:=0
variable txds:std_logic
begin
if resett='1' then state<=x_idletxd_done<='0'txds:='1' --复位
elsif rising_edge(bclkt) then
case state is
when x_idle=> --状态1,等待数据帧发送命令
if xmit_cmd_p='1' then state<=x_starttxd_done<='0'
else state<=x_idle
end if
when x_start=> --状态2,发送信号至起始位
if xcnt16>="01111" then state<=x_waitxcnt16:="00000"
else xcnt16:=xcnt16+1txds:='0'state<=x_start
end if
when x_wait=> --状态3,等待状态
if xcnt16>="01110" then
if xbitcnt=framlent then state<=x_stopxbitcnt:=0
else state<=x_shift
end if
xcnt16:="00000"
else xcnt16:=xcnt16+1state<=x_wait
end if
when x_shift=>txds:=txdbuf(xbitcnt)xbitcnt:=xbitcnt+1state<=x_wait --状态4,将待发数据进行并串转换
when x_stop=>--状态5,停止位发送状态
if xcnt16>="01111" then
if xmit_cmd_p='0' then state<=x_idlexcnt16:="00000"
else xcnt16:=xcnt16state<=x_stop
end iftxd_done<='1'
else xcnt16:=xcnt16+1txds:='1'state<=x_stop
end if
when others=>state<=x_idle
end case
end if
txd<=txds
end process
end Behavioral
UART发送器的仿真波形如图8.8.7所示。
图8.8.7 UART发送器的仿真波形
4. UART接收器程序与仿真
(1)UART接收器VHDL程序
--文件名:reciever.vhd。
--功能:UART接受器。
--说明:系统由五个状态(r_start,r_center,r_wait,r_sample,r_stop)和两个进程构成
--最后修改日期:2004.3.24。
library IEEE
use IEEE.STD_LOGIC_1164.ALL
use IEEE.STD_LOGIC_ARITH.ALL
use IEEE.STD_LOGIC_UNSIGNED.ALL
entity reciever is
generic(framlenr:integer:=8)
Port (bclkr,resetr,rxdr:in std_logic --定义输入输出信号
r_ready:out std_logic
rbuf:out std_logic_vector(7 downto 0))
end reciever
architecture Behavioral of reciever is
type states is (r_start,r_center,r_wait,r_sample,r_stop) --定义各子状态
signal state:states:=r_start
signal rxd_sync:std_logic
begin
pro1:process(rxdr)
begin
if rxdr='0' then rxd_sync<='0'
else rxd_sync<='1'
end if
end process
pro2:process(bclkr,resetr,rxd_sync)--主控时序、组合进程
variable count:std_logic_vector(3 downto 0) --定义中间变量
variable rcnt:integer:=0
variable rbufs:std_logic_vector(7 downto 0)
begin
if resetr='1' then state<=r_startcount:="0000" --复位
elsif rising_edge(bclkr) then
case state is
when r_start=>--状态1,等待起始位
if rxd_sync='0' then state<=r_centerr_ready<='0'rcnt:=0
else state<=r_startr_ready<='0'
end if
when r_center=> --状态2,求出每位的中点
if rxd_sync='0' then
if count="0100" then state<=r_waitcount:="0000"
else count:=count+1state<=r_center
end if
else state<=r_start
end if
when r_wait=> --状态3,等待状态
if count>="1110" then
if rcnt=framlenr then state<=r_stop
else state<=r_sample
end if
count:="0000"
else count:=count+1state<=r_wait
end if
when r_sample=>rbufs(rcnt):=rxd_syncrcnt:=rcnt+1state<=r_wait
--状态4,数据位采样检测
when r_stop=>r_ready<='1'rbuf<=rbufsstate<=r_start--状态4,输出帧接收完毕信号
when others=>state<=r_start
end case
end if
end process
end Behavioral
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)