cpld与PC机通讯vhdl代码
2013-01-23
标签:

--功能:实现cpld与pc机通讯

--原理:模拟232的发送时序每次发送10bits,一个开始位,八个数据位,一个停止位.

--波特率:9600bps

--环境:cpld器件:epm7128stc100-10,外部1m 时钟,pc机端:串口调试助手.

--操作:从串口调试助手中发送一个byte.cpld接收到信号再返回到串口调试助手.

--本程序仅供学习,不得用与商业.

--作者:sagestar 

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY cpld232 IS

PORT(

clk:in std_logic;

rx:in std_logic;

tx:out std_logic;

rtx_control: in std_logic

);

END cpld232;

ARCHITECTURE cpld OF cpld232 IS

signal Rx_Buffer: std_logic_vector(7 downto 0);

signal Tx_Buffer: std_logic_vector(7 downto 0);

BEGIN

--receive subprogrammer

PROCESS(clk,rx)

variable Baud_Number1:integer range 0 to 100;

variable Rx_start: std_logic_vector(7 downto 0);

variable Rx_Over:std_logic;

variable Rx_Complete:std_logic;

BEGIN

if clk'event and clk='0' then

if rx='0'and Rx_Start="00000000"and Rx_Over='0'and Rx_Complete='0' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

--Rx_Buffer(0) <= rx;

Baud_Number1:=0;

Rx_Start(0):='1';

end if;

elsif Rx_Start(0)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(0) <= rx;

Baud_Number1:=0;

Rx_Start(0):='0';

Rx_Start(1):='1';

end if;

elsif Rx_Start(1)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(1) <= rx;

Baud_Number1:=0;

Rx_Start(1):='0';

Rx_Start(2):='1';

end if;

elsif Rx_Start(2)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(2) <= rx;

Baud_Number1:=0;

Rx_Start(2):='0';

Rx_Start(3):='1';

end if;

elsif Rx_Start(3)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(3) <= rx;

Baud_Number1:=0;

Rx_Start(3):='0';

Rx_Start(4):='1';

end if;

elsif Rx_Start(4)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(4) <= rx;

Baud_Number1:=0;

Rx_Start(4):='0';

Rx_Start(5):='1';

end if;

elsif Rx_Start(5)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(5) <= rx;

Baud_Number1:=0;

Rx_Start(5):='0';

Rx_Start(6):='1';

end if;

elsif Rx_Start(6)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(6) <= rx;

Baud_Number1:=0;

Rx_Start(6):='0';

Rx_Start(7):='1';

end if;

elsif Rx_Start(7)='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

Rx_Buffer(7) <= rx;

Baud_Number1:=0;

Rx_Start(7):='0';

Rx_Over:='1';

end if;

elsif Rx_Over='1' then

Baud_Number1:=Baud_Number1+1;

if Baud_Number1=100 then

if rx='1'then

Baud_Number1:=0;

Rx_Over:='0';

Rx_Complete:='1';

end if;

end if;

elsif Rx_Complete='1' then

Tx_Buffer<=Rx_Buffer;

Rx_Complete:='0';

else

Rx_Start:="00000000";

Rx_Over:='0';

Rx_Complete:='0';

end if;

end if;

END PROCESS;

--send subprogrammer

PROCESS(clk)

variable Baud_Number:integer range 0 to 200000;

variable Tx_start: std_logic_vector(7 downto 0);

variable Tx_Over:std_logic;

variable Tx_Complete:std_logic;

BEGIN

if clk'event and clk='0' then

if rtx_control='1' then

if Tx_Start="00000000"and Tx_Over='0'and Tx_Complete='0'then

--Baud_Number:=Baud_Number+1;

--if Baud_Number=100 then

tx <= '0';

--Baud_Number:=0;

Tx_Start(0):='1';

--end if;

elsif Tx_Start(0)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(0);

--tx<='1';

Baud_Number:=0;

Tx_Start(0):='0';

Tx_Start(1):='1';

end if;

elsif Tx_Start(1)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(1);

--tx<='1';

Baud_Number:=0;

Tx_Start(1):='0';

Tx_Start(2):='1';

end if;

elsif Tx_Start(2)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(2);

--tx<='0';

Baud_Number:=0;

Tx_Start(2):='0';

Tx_Start(3):='1';

end if;

elsif Tx_Start(3)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(3);

--tx<='1';

Baud_Number:=0;

Tx_Start(3):='0';

Tx_Start(4):='1';

end if;

elsif Tx_Start(4)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(4);

--tx<='1';

Baud_Number:=0;

Tx_Start(4):='0';

Tx_Start(5):='1';

end if;

elsif Tx_Start(5)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(5);

--tx<='0';

Baud_Number:=0;

Tx_Start(5):='0';

Tx_Start(6):='1';

end if;

elsif Tx_Start(6)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(6);

--tx<='0';

Baud_Number:=0;

Tx_Start(6):='0';

Tx_Start(7):='1';

end if;

elsif Tx_Start(7)='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<=Tx_Buffer(7);

--tx<='1';

Baud_Number:=0;

Tx_Start(7):='0';

Tx_Over:='1';

end if;

elsif Tx_Over='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=104 then

tx<='1';

Baud_Number:=0;

Tx_Over:='0';

Tx_Complete:='1';

end if;

elsif Tx_Complete='1' then

Baud_Number:=Baud_Number+1;

if Baud_Number=200000 then

Baud_Number:=0;

Tx_Complete:='0';

end if;

else

Tx_Start:="00000000";

Tx_Over:='0';

Tx_Complete:='0';

end if;

end if;

end if;

END PROCESS;

END cpld;

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号