CPLD的串口通信设计
IF reset='0' THEN
count:=0;
clk19200hz:='0';
ELSIF f10MHz'EVENT AND f10MHz='1' THEN
IF count=260 THEN
count:=0;clk19200hz:= NOT clk19200hz;
ELSE
count:=count+1;
END IF;
END IF;
baud_rate=clk19200hz;
END PROCESS;发送模块e#2. 发送模块
发送部分采用状态机t_state 进行编程,共设两个值:t-start 和t_shift,分别表示发送开始以及发送保持状态。复位键按下时设置到t-start 状态,并将发送数据位设为“1”, 发送的数据位数计数为0,在t-start 状态,状态机将处于这一个状态并等待波特率计数信号的电平上升沿到来。上升沿到来时,依据t_state 状态的不同值做不同处理,如果是t-start 开始状态则先读待发送的数据,并发送开始位“0”,然后将状态转到发送保持t_shift 状态,在发送保持t_shift 状态,不断判断发送的数据位数是否满8 位,如果满了则回归t-start 状态,否则继续发送,保持在t_shift 状态,为避免干扰将其余情况下的状态自动跳转到t-start 状态。程序如下:
PROCESS(baud_rate,reset,data)
-- 数据发送部分
VARIABLE t_no:INTEGER RANGE 0 TO 8;
-- 发送的数据各位的位序号
VARIABLE txds:STD_LOGIC;
VARIABLE dtmp:STD_LOGIC_VECTOR(7
DOWNTO 0);
BEGIN
IF reset='0' THEN
t_state=t_start;
txds:='1';
t_no:=0;
ELSIF baud_rate'event AND baud_rate='1' THEN
CASE t_state IS
WHEN t_start=>
dtmp:=data;
txds:='0'; -- 发送开始
t_state=t_shift;
WHEN t_shift=> IF t_no=d_len THEN
txds:='1'; -- 发送结束
t_no:=0;
t_state=t_start;
评论