串口通信Verilog代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Verilog串口通信代码moduleck(clk,rst_n,rs232_rx,rs232_tx);inputclk;//50MHz主时钟inputrst_n;//低电平复位信号inputrs232_rx;//RS232接收数据信号outputrs232_tx;//RS232发送数据信号wirebps_start;//接收到数据后,波特率时钟启动信号置位wireclk_bps;//clk_bps的高电平为接收或者发送数据位的中间采样点wire[7:0]rx_data;//接收数据寄存器,保存直至下一个数据来到wirerx_int;//接收数据中断信号,接收到数据期间始终为高电平//----------------------------------------------------speed_selectspeed_select(.clk(clk),//波特率选择模块,接收和发送模块复用,不支持全双工通信.rst_n(rst_n),.bps_start(bps_start),.clk_bps(clk_bps));my_uart_rxmy_uart_rx(.clk(clk),//接收数据模块.rst_n(rst_n),.rs232_rx(rs232_rx),.clk_bps(clk_bps),.bps_start(bps_start),.rx_data(rx_data),.rx_int(rx_int));my_uart_txmy_uart_tx(.clk(clk),//发送数据模块.rst_n(rst_n),.clk_bps(clk_bps),.rx_data(rx_data),.rx_int(rx_int),.rs232_tx(rs232_tx),.bps_start(bps_start));endmodulemodulespeed_select(clk,rst_n,bps_start,clk_bps);inputclk;//50MHz主时钟inputrst_n;//低电平复位信号inputbps_start;//接收到数据后,波特率时钟启动信号置位outputclk_bps;//clk_bps的高电平为接收或者发送数据位的中间采样点parameterbps9600=5207,//波特率为9600bpsbps19200=2603,//波特率为19200bpsbps38400=1301,//波特率为38400bpsbps57600=867,//波特率为57600bpsbps115200=433;//波特率为115200bpsparameterbps9600_2=2603,bps19200_2=1301,bps38400_2=650,bps57600_2=433,bps115200_2=216;reg[12:0]bps_para;//分频计数最大值reg[12:0]bps_para_2;//分频计数的一半reg[12:0]cnt;//分频计数regclk_bps_r;//波特率时钟寄存器//----------------------------------------------------------reg[2:0]uart_ctrl;//uart波特率选择寄存器,怎样配置uart_ctr??//----------------------------------------------------------always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginuart_ctrl=3'd0;//默认波特率为9600bpsendelsebegincase(uart_ctrl)//波特率设置3'd0:beginbps_para=bps9600;bps_para_2=bps9600_2;end3'd1:beginbps_para=bps19200;bps_para_2=bps19200_2;end3'd2:beginbps_para=bps38400;bps_para_2=bps38400_2;end3'd3:beginbps_para=bps57600;bps_para_2=bps57600_2;end3'd4:beginbps_para=bps115200;bps_para_2=bps115200_2;enddefault:;endcaseendendalways@(posedgeclkornegedgerst_n)if(!rst_n)cnt=13'd0;elseif(cntbps_para&&bps_start)cnt=cnt+1'b1;//波特率时钟计数启动elsecnt=13'd0;always@(posedgeclkornegedgerst_n)if(!rst_n)clk_bps_r=1'b0;elseif(cnt==bps_para_2&&bps_start)clk_bps_r=1'b1;//clk_bps_r高电平为接收或者发送数据位的!中间!采样点elseclk_bps_r=1'b0;assignclk_bps=clk_bps_r;endmodulemodulemy_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data,rx_int);inputclk;//50MHz主时钟inputrst_n;//低电平复位信号inputrs232_rx;//RS232接收数据信号!!inputclk_bps;//clk_bps的高电平为接收或者发送数据位的中间采样点outputbps_start;//接收到数据后,波特率时钟启动信号置位output[7:0]rx_data;//接收数据寄存器,保存直至下一个数据来到outputrx_int;//接收数据中断信号,接收到数据期间始终为高电平//----------------------------------------------------------------regrs232_rx0,rs232_rx1,rs232_rx2;//接收数据寄存器,滤波用wireneg_rs232_rx;//表示数据线接收到下降沿always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginrs232_rx0=1'b1;rs232_rx1=1'b1;rs232_rx2=1'b1;endelsebeginrs232_rx0=rs232_rx;rs232_rx1=rs232_rx0;rs232_rx2=rs232_rx1;endendassignneg_rs232_rx=rs232_rx2&~rs232_rx1;//接收到下降沿后neg_rs232_rx置高一个时钟周期??//----------------------------------------------------------------regbps_start_r;reg[3:0]num;//移位次数regrx_int;//接收数据中断信号,接收到数据期间始终为高电平always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginbps_start_r=1'bz;rx_int=1'b0;endelseif(neg_rs232_rx)beginbps_start_r=1'b1;//启动接收数据rx_int=1'b1;//接收数据中断信号使能endelseif(num==4'd12)begin//??bps_start_r=1'bz;//数据接收完毕rx_int=1'b0;//接收数据中断信号关闭endendassignbps_start=bps_start_r;//----------------------------------------------------------------reg[7:0]rx_data_r;//接收数据寄存器,保存直至下一个数据来到//----------------------------------------------------------------reg[7:0]rx_temp_data;//当前接收数据寄存器regrx_data_shift;//数据移位标志always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginrx_data_shift=1'b0;rx_temp_data=8'd0;num=4'd0;rx_data_r=8'd0;endelseif(rx_int)begin//接收数据处理if(clk_bps)begin//读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位rx_data_shift=1'b1;num=num+1'b1;if(num=4'd8)rx_temp_data[7]=rs232_rx;//锁存9bit(1bit起始位,8bit数据)??如何配置rs232_rxendelseif(rx_data_shift)begin//数据移位处理rx_data_shift=1'b0;if(num=4'd8)rx_temp_data=rx_temp_data1'b1;//移位8次,第1bit起始位移除,剩下8bit正好是接收数据elseif(num==4'd12)beginnum=4'd0;//接收到STOP位后结束,num清零rx_data_r=rx_temp_data;//把数据锁存到数据寄存器rx_data中endendendendassignrx_data=rx_data_r;endmodulemodulemy_uart_tx(clk,rst_n,clk_bps,rx_data,rx_int,rs232_tx,bps_start);inputclk;//50MHz主时钟inputrst_n;//低电平复位信号inputclk_bps;//clk_bps的高电平为接收或者发送数据位的中间采样点input[7:0]rx_data;//接收数据寄存器inputrx_int;//接收数据中断信号,接收到数据期间始终为高电平,在次利用它的下降沿来启动发送数据outputrs232_tx;//RS232发送数据信号outputbps_start;//接收或者要发送数据,波特率时钟启动信号置位//---------------------------------------------------------regrx_int0,rx_int1,rx_int2;//rx_int信号寄存器,捕捉下降沿滤波用wireneg_rx_int;//rx_int下降沿标志位always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginrx_int0=1'b0;rx_int1=1'b0;rx_int2=1'b0;endelsebeginrx_int0=rx_int;rx_int1=rx_int0;rx_int2=rx_int1;endendassignneg_rx_int=~rx_int1&rx_int2;//捕捉到下降沿后,neg_rx_int拉地保持一个主时钟周期??//---------------------------------------------------------reg[7:0]tx_data;//待发送数据的寄存器//---------------------------------------------------------regbps_start_r;regtx_en;//发送数据使能信号,高有效reg[3:0]num;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginbps_start_

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功