名稱:通用UART串口收發(fā)RS232接口VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
通用UART串口收發(fā)RS232接口
1、具有串口發(fā)送和接收功能。
2、波特率、數(shù)據(jù)位長(zhǎng)度、停止位長(zhǎng)度、校驗(yàn)位長(zhǎng)度、校驗(yàn)位奇偶可設(shè)置。
默認(rèn)為:115200波特率,數(shù)據(jù)位長(zhǎng)度8bit,停止位長(zhǎng)度1bit,校驗(yàn)位1bit,奇校驗(yàn)。
波特率、數(shù)據(jù)位長(zhǎng)度、停止位長(zhǎng)度、校驗(yàn)位長(zhǎng)度、校驗(yàn)位奇偶可通過以下代碼設(shè)置:
uart_baudrate<="11100001000000000";--115200
uart_data_len? ?<= "1000";--8bit--輸入數(shù)據(jù)位長(zhǎng)度
uart_stop_len? ?<= "01"? ;--輸入停止位長(zhǎng)度
uart_check_len? <= '1'? ?;--輸入校驗(yàn)位長(zhǎng)度
uart_check_mode <= '0'? ?;--輸入校驗(yàn)位奇偶
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 管腳分配
6. Testbench
7. 仿真圖
整體仿真
波特率產(chǎn)生模塊
發(fā)送模塊
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; ???USE?ieee.std_logic_arith.all; --接收模塊 ENTITY?uart_rx?IS ???PORT?( ??????clk??????????????????:?IN?STD_LOGIC; ??????rst_n????????????????:?IN?STD_LOGIC; ?????? ??????data_len?????????????:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0);--數(shù)據(jù)長(zhǎng)度--?5~8 ??????stop_len?????????????:?IN?STD_LOGIC_VECTOR(1?DOWNTO?0);--停止位長(zhǎng)度--?1~2 ??????check_len????????????:?IN?STD_LOGIC;--校驗(yàn)位長(zhǎng)度--?0~1 ??????check_mode???????????:?IN?STD_LOGIC;--奇偶--?0~1 ?????? ??????baud16_tick??????????:?IN?STD_LOGIC; ?????? ??????uart_rx_buf_wr_en????:?OUT?STD_LOGIC;--接收使能 ??????uart_rx_buf_wr_data??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--接收數(shù)據(jù) ?????? ??????uart_rx_err??????????:?OUT?STD_LOGIC; ?????? ??????uart_rxd?????????????:?IN?STD_LOGIC ???); END?uart_rx; ARCHITECTURE?trans?OF?uart_rx?IS ??? --???SIGNAL?uart_rxd_sync_r???????????:?STD_LOGIC_VECTOR(2?DOWNTO?0); ??? ???SIGNAL?uart_rxd_bit_inv??????????:?STD_LOGIC; ??? ???SIGNAL?Bau16_Tick_shift_r????????:?STD_LOGIC_VECTOR(1?DOWNTO?0); ???SIGNAL?Bau16_Tick_rising?????????:?STD_LOGIC; ??? ???SIGNAL?state?????????????????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?next_state????????????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?cnt_baud16_tick???????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?cnt_rx_bit????????????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ??? ???SIGNAL?rx_shift_reg??????????????:?STD_LOGIC_VECTOR(8?DOWNTO?0); ??? ???SIGNAL?rx_check_sum??????????????:?STD_LOGIC; ???SIGNAL?local_check_sum???????????:?STD_LOGIC; ???SIGNAL?uart_rx_buf_wr_data_buf?:?STD_LOGIC_VECTOR(7?DOWNTO?0); BEGIN ???--?Drive?referenced?outputs ???uart_rx_buf_wr_data?<=?uart_rx_buf_wr_data_buf;--輸出接收數(shù)據(jù) --???PROCESS?(clk) --???BEGIN --??????IF?(clk'EVENT?AND?clk?=?'1')?THEN --?????????uart_rxd_sync_r?<=?(uart_rxd_sync_r(1?DOWNTO?0)?&?uart_rxd);--移位 --??????END?IF; --???END?PROCESS; ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????uart_rxd_bit_inv?<=?uart_rxd;--同步到時(shí)鐘下 ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????Bau16_Tick_shift_r?<=?(Bau16_Tick_shift_r(0)?&?baud16_tick); ??????END?IF; ???END?PROCESS; ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????if(Bau16_Tick_shift_r?=?"01")then--檢測(cè)Bau16_Tick_shift_r上升沿 Bau16_Tick_rising<='1';--上升沿 else Bau16_Tick_rising<='0'; end?if; ??????END?IF; ???END?PROCESS; ??? --狀態(tài)機(jī) ???PROCESS?(clk,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????state?<=?"0000"; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????state?<=?next_state; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(state,?uart_rxd_bit_inv,?Bau16_Tick_rising,?cnt_baud16_tick,?data_len,?check_len) ???BEGIN ??????CASE?state?IS ?????????WHEN?"0000"?=>--?IDLE ????????????IF?((NOT(uart_rxd_bit_inv))?=?'1')?THEN ???????????????next_state?<=?"0001"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"0001"?=>--?Start ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"1000"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1000"?=>?--?Bit?0 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"1001"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1001"?=>--?Bit?1 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"1010"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1010"?=>--?Bit?2 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"1011"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1011"?=>--?Bit?3 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????IF?(data_len?>?"0101")?THEN ??????????????????next_state?<=?"1100"; ???????????????ELSE ??????????????????next_state?<=?"1111"; ???????????????END?IF; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1100"?=>--?Bit?4 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????IF?(data_len?>?"0110")?THEN ??????????????????next_state?<=?"1101"; ???????????????ELSE ??????????????????next_state?<=?"1111"; ???????????????END?IF; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1101"?=>--?Bit?5 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????IF?(data_len?>?"0111")?THEN ??????????????????next_state?<=?"1110"; ???????????????ELSE ??????????????????next_state?<=?"1111"; ???????????????END?IF; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1110"?=>--?Bit?6 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"1111"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"1111"?=>--?Bit?Last ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????IF?(check_len?>?'0')?THEN ??????????????????next_state?<=?"0111"; ???????????????ELSE ??????????????????next_state?<=?"0110"; ???????????????END?IF; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"0111"?=>--?Check ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"0110"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?"0110"?=>--?Stop?1 ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????next_state?<=?"0000"; ????????????ELSE ???????????????next_state?<=?state; ????????????END?IF; ?????????WHEN?OTHERS?=> ????????????next_state?<=?"0000"; ??????END?CASE; ???END?PROCESS; ??? --?count?baud16_tick?to?check?the?center?of?uart_rxd ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"0000")?THEN ????????????cnt_baud16_tick?<=?"0000"; ?????????ELSIF?(state?>?"0000"?AND?Bau16_Tick_rising?=?'1')?THEN ????????????cnt_baud16_tick?<=?cnt_baud16_tick?+?"0001"; ?????????ELSE ????????????cnt_baud16_tick?<=?cnt_baud16_tick; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? --?count?rx?bit ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?>?"0110")?THEN ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1110")?THEN ???????????????cnt_rx_bit?<=?cnt_rx_bit?+?"0001"; ????????????ELSE ???????????????cnt_rx_bit?<=?cnt_rx_bit; ????????????END?IF; ?????????ELSIF?(state?<=?"0110"?AND?state?>?"0000")?THEN ????????????cnt_rx_bit?<=?cnt_rx_bit; ?????????ELSE ????????????cnt_rx_bit?<=?"0000"; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? --rx?shift?register ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?>?"0110")?THEN ????????????IF?(Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"0111")?THEN ???????????????IF?(cnt_rx_bit?<?data_len)?THEN ??????????????????rx_shift_reg(Conv_Integer(cnt_rx_bit))?<=?uart_rxd_bit_inv; ???????????????ELSE ??????????????????rx_shift_reg(8)?<=?uart_rxd_bit_inv; ???????????????END?IF; ????????????ELSE ???????????????rx_shift_reg?<=?rx_shift_reg; ????????????END?IF; ?????????ELSIF?(state?<=?"0110"?AND?state?>?"0000")?THEN ????????????rx_shift_reg?<=?rx_shift_reg; ?????????ELSE ????????????rx_shift_reg?<=?"000000000"; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--rx?data?checksum ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(check_len?>?'0')?THEN ????????????rx_check_sum?<=?rx_shift_reg(8); ????????????local_check_sum?<=?rx_shift_reg(7)?xor?rx_shift_reg(6)?xor?rx_shift_reg(5)?xor?rx_shift_reg(4)?xor?rx_shift_reg(3)?xor?rx_shift_reg(2)?xor?rx_shift_reg(1)?xor?rx_shift_reg(0)?xor?check_mode; ?????????ELSE ????????????rx_check_sum?<=?'0'; ????????????local_check_sum?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--output?uart?rx?data ???PROCESS?(clk,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????uart_rx_buf_wr_data_buf?<=?"00000000"; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"0110"?AND?cnt_baud16_tick?=?"1010")?THEN ????????????uart_rx_buf_wr_data_buf?<=?rx_shift_reg(7?DOWNTO?0); ?????????ELSE ????????????uart_rx_buf_wr_data_buf?<=?uart_rx_buf_wr_data_buf; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--數(shù)據(jù)有效指示 ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"0110"?AND?Bau16_Tick_rising?=?'1'?AND?cnt_baud16_tick?=?"1011")?THEN ????????????uart_rx_buf_wr_en?<=?'1'; ?????????ELSE ????????????uart_rx_buf_wr_en?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--校驗(yàn)錯(cuò)誤 ???PROCESS?(clk,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????uart_rx_err?<=?'0'; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"0110"?AND?cnt_baud16_tick?=?"1010")?THEN ????????????IF?(local_check_sum?=?rx_check_sum)?THEN ???????????????uart_rx_err?<=?'0'; ????????????ELSE ???????????????uart_rx_err?<=?'1'; ????????????END?IF; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ??? END?trans;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=447