名稱:UART通訊模塊設計Verilog代碼vivado仿真
軟件:vivado
語言:Verilog
代碼功能:
具體要求如下:
1.分組進行設計實踐,每組10~11人,組內(nèi)人員自行分工開發(fā)任務:模塊開發(fā)與testbench仿真驗證。
2.技術參數(shù)要求:
?用戶收發(fā)數(shù)據(jù)位寬:8bit;
?用戶時鐘:100MHz;
?數(shù)據(jù)發(fā)送緩存:不小于4KByte;
?附加功能:串行波特率可配;是否添加校驗位可配。
3.通訊控制模塊對外接口約定如下:
module uart_intf#
(
parameter? ?BaudRate? ? ? ? =? ?868? ? ? ? ? ? ? ? ? ? ? ? ?,? ?//波特率:時鐘/波特率,如:100Mhz,115200bps,100_000000/115200 = 868
parameter? ?CheckMode? ? ? ?=? ?0? ? ? ? ? ? ? ? ? ? ? ? ? ?,? ?//奇偶校驗:0-無,1-奇校驗(ODD),2-偶校驗(EVEN),3-高校驗,4-低校驗
parameter? ?BitNum? ? ? ? ? =? ?8? ? ? ? ? ? ? ? ? ? ? ? ? ?)? ?//數(shù)據(jù)位寬度
(
input? ?wire? ? [00:00]? ? ?uart_refclk? ? ? ? ? ? ? ? ? ? ?,
input? ?wire? ? [00:00]? ? ?uart_refrst? ? ? ? ? ? ? ? ? ? ?,
input? ?wire? ? [00:00]? ? ?uart_txdata_en? ? ? ? ? ? ? ? ? ,
input? wire? [BitNum - 1:00]? ? ?uart_txdata? ? ? ? ? ? ? ? ? ? ?,
output? wire? ? [00:00]? ? ?uart_rxdata_en? ? ? ? ? ? ? ? ? ,
output wire? [BitNum - 1:00]? ? ?uart_rxdata? ? ? ? ? ? ? ? ? ? ?,
input? ?wire? ? [00:00]? ? ?uart_rx_sig? ? ? ? ? ? ? ? ? ? ?,
output? wire? ? [00:00]? ? ?uart_tx_sig? ? ? ? ? ? ? ? ? ? ?);
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. Testbench
6. 仿真圖
整體仿真圖
將發(fā)送接收回環(huán),依次發(fā)送0x24,0x3a,0x19,接收到的也為0x24,0x3a,0x19。故發(fā)送接收正確。
波特率控制模塊
FIFO模塊
串口發(fā)送模塊
接收串口模塊
部分代碼展示:
module?my_uart_rx(clk,rst_n,rs232_rx,clk_bps,rx_data,rx_en); input?clk;//?100MHz主時鐘 input?rst_n;//低電平復位信號 input?rs232_rx;//?RS232接收數(shù)據(jù)信號 input?clk_bps;//?clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點 output[7:0]?rx_data;//接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到? output?rx_en;//接收數(shù)據(jù)有效 //---------------------------------------------------------------- reg?rs232_rx0,rs232_rx1,rs232_rx2;//接收數(shù)據(jù)寄存器,濾波用 wire?neg_rs232_rx;//表示數(shù)據(jù)線接收到下降沿 always?@?(posedge?clk?or?negedge?rst_n)?begin if(!rst_n)?begin rs232_rx0?<=?1'b1; rs232_rx1?<=?1'b1; rs232_rx2?<=?1'b1; end else?begin rs232_rx0?<=?rs232_rx; rs232_rx1?<=?rs232_rx0; rs232_rx2?<=?rs232_rx1; end end assign?neg_rs232_rx?=?rs232_rx2?&?~rs232_rx1;//接收到下降沿后neg_rs232_rx置高一個時鐘周期 //---------------------------------------------------------------- reg[3:0]num;//移位次數(shù) reg?rx_int;//接收數(shù)據(jù)中斷信號,接收到數(shù)據(jù)期間始終為高電平 always?@?(posedge?clk?or?negedge?rst_n)?begin if(!rst_n)?begin rx_int?<=?1'b0; end else?if(neg_rs232_rx)?begin rx_int?<=?1'b1;//接收數(shù)據(jù)中斷信號使能 end else?if(num==4'd11)?begin rx_int?<=?1'b0;//接收數(shù)據(jù)中斷信號關閉 end end? //---------------------------------------------------------------- reg[7:0]?rx_data_r;//接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到 //---------------------------------------------------------------- reg[7:0]rx_temp_data;//但前接收數(shù)據(jù)寄存器 reg?rx_data_shift;//數(shù)據(jù)移位標志 always?@?(posedge?clk?or?negedge?rst_n)?begin if(!rst_n)?begin rx_data_shift?<=?1'b0; rx_temp_data?<=?8'd0; num?<=?4'd0; rx_data_r?<=?8'd0; end else?if(rx_int)?begin//接收數(shù)據(jù)處理 if(clk_bps)?begin//讀取并保存數(shù)據(jù),接收數(shù)據(jù)為一個起始位,8bit數(shù)據(jù),一個結(jié)束位 rx_data_shift?<=?1'b1; num?<=?num+1'b1; if(num<=4'd8)?rx_temp_data[7]?<=?rs232_rx;//鎖存9bit(1bit起始位,8bit數(shù)據(jù)) end else?if(rx_data_shift)?begin//數(shù)據(jù)移位處理 rx_data_shift?<=?1'b0; if(num<=4'd8)?rx_temp_data?<=?rx_temp_data?>>?1'b1;//移位8次,第1bit起始位移除,剩下8bit正好時接收數(shù)據(jù) else?if(num==4'd11)?begin num?<=?4'd0;//接收到STOP位后結(jié)束,num清零 rx_data_r?<=?rx_temp_data;//把數(shù)據(jù)鎖存到數(shù)據(jù)寄存器rx_data中 end end ???end end reg?rx_int_buf=0; always?@?(posedge?clk?)?begin rx_int_buf<=rx_int; end assign?rx_en=?rx_int_buf?&?(~rx_int);//rx_int下降沿 assign?rx_data?=?rx_data_r;//數(shù)據(jù) endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=483