⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialport_rx.vhd

📁 VHDL基础的编程源代码
💻 VHD
字号:
--/******************************************************************************-- * 源文件:	serialport_rx.vhd-- * 模块:   	串口接收-- * 版权:-- *         	Copyright(C) 北京联华众科科技有限公司-- *						www.lianhua-zhongke.com.cn-- * 版本:  	Version 1.0-- * -- * 功能说明:-- *		   	完成RS232串口数据接收,并输出接收到的数据,同时输出数据已好信号。-- *		   	波特率,停止位数,奇偶位,位宽等参数作为参数传入,可由外部设置。-- * 参数说明:-- *	       	输出参数-- *			data - 	接收到的数据,为 8bit-- *			data_ready - 数据已好信号,高电平有效,在接收到的数据稳定输出后-- *						data_read信号有效,用以通知其他模块取用接收到的数据。-- *-- *			输入参数-- *			rx - 串口输入数据-- *			bitnum - 串口通信时使用的数据位宽, bitnum为 3bit,取值范围为 0~7,本模块-- *					中使用 4~7来表示 5~8的数据位宽。-- *			has_parity - 通信时是否使用奇偶位, 1表示无奇偶位, 0表示有奇偶位-- *			parity_type - 奇偶位类型, 0表示偶校验, 1表示奇校验-- *			stopbits -  2bit,表示停止位 bit数, 0表示1bit, 1表示 1.5bit, 2表示 2bit,-- *					 3表示 1bit-- *			clock - 时钟,为波特率的16倍,用以采样rx上的数据-- *			reset - 复位信号,停电平有效-- *-- * 变更记录: -- *         2006.01.28, 新建-- *-- ******************************************************************************/LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY serialport_rx IS	PORT	(		data : OUT STD_LOGIC_VECTOR(7 downto 0);		data_ready : OUT STD_LOGIC;				rx : IN STD_LOGIC;		bitnum : IN STD_LOGIC_VECTOR(2 downto 0):="111";--4~7-->5~8		has_parity : IN STD_LOGIC:='1';--1-no parity, 0-parity		parity_type : IN STD_LOGIC;--0-even, 1-odd		stopbits : IN STD_LOGIC_VECTOR(1 downto 0):="00";--0-1bit, 1-1.5bit, 2-2bit, 3-1bit				clock : IN STD_LOGIC;--baudrate*16		reset : IN STD_LOGIC	);END serialport_rx;ARCHITECTURE serialport_rx_architecture OF serialport_rx IS	BEGIN		PROCESS(clock, reset)		VARIABLE currentState : INTEGER RANGE 0 TO 15 := 0;		VARIABLE nextState : INTEGER RANGE 0 TO 15 := 0;				VARIABLE rx_bit : STD_LOGIC := '0';				VARIABLE bit_index : INTEGER RANGE 0 TO 7 := 0;				VARIABLE sample_counter : INTEGER RANGE 0 TO 15 := 0;		VARIABLE idata : STD_LOGIC_VECTOR(7 downto 0) := "00000000";		VARIABLE parity_bit : STD_LOGIC;--在存在奇偶校验位时,指示校验是否正确		--VARIABLE tmp : STD_LOGIC;	BEGIN				IF (reset = '0') THEN			currentState := 0;			data_ready <= '0';		ELSIF(clock = '1' AND clock'EVENT) THEN			IF (currentState = 0) THEN				rx_bit := rx;				data_ready <= '0';				idata := "00000000";								bit_index := 0;				parity_bit := '0';								IF (rx = '0') THEN					IF (sample_counter = 8) THEN						sample_counter := 0;						nextState := 1;					ELSE						sample_counter := sample_counter+1;						--nextState := 0;					END IF;				ELSE					sample_counter := 0;					nextState := 0;				END IF;			ELSIF (currentState>=1 AND currentState<=10) THEN --start bit, bit0~7, parity bit				IF (has_parity = '1') THEN --无奇偶位					IF (CONV_INTEGER(bitnum) = bit_index) THEN						data <= idata;												IF (sample_counter = 7) THEN							sample_counter := 0;							nextState := 11;						ELSE							sample_counter := sample_counter+1;											END IF;					ELSE						IF (sample_counter = 15) THEN							sample_counter := 0;							idata(bit_index) := rx;							bit_index := bit_index+1;																		nextState := currentState + 1;						ELSE							sample_counter := sample_counter+1;											END IF;					END IF;				ELSE --有奇偶位(注:本版本串口接收程序为简化程序不支持带奇偶位的帧)					nextState := 0;				END IF;			ELSIF (currentState = 11) THEN				data_ready <= '1';				IF (sample_counter = 10) THEN					nextState := 0;				ELSE					sample_counter := sample_counter+1;				END IF;			ELSE				nextState := 0;			END IF;						currentState := nextState;		END IF;					END PROCESS;END serialport_rx_architecture;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -