03_串口 RS232( 四 )

<= rx_data;//po_flag:输出数据有效标志(比rx_flag延后一个时钟周期,为了和po_data同步)always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)po_flag <= 1'b0;elsepo_flag <= rx_flag;endmodule
7.2
`timescale1ns/1nsmoduleuart_tx#(parameterUART_BPS='d9600,//串口波特率parameterCLK_FREQ='d50_000_000//时钟频率)(inputwiresys_clk,//系统时钟50MHzinputwiresys_rst_n,//全局复位inputwire[7:0]pi_data,//模块输入的8bit数据inputwirepi_flag,//并行数据有效标志信号outputregtx//串转并后的1bit数据);//********************************************************************////****************** Parameter and Internal Signal *******************////********************************************************************////localparamdefinelocalparamBAUD_CNT_MAX=CLK_FREQ/UART_BPS;//regdefinereg [12:0]baud_cnt;regbit_flag;reg [3:0]bit_cnt ;regwork_en ;//********************************************************************////***************************** Main Code ****************************////********************************************************************////work_en:接收数据工作使能信号always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)work_en <= 1'b0;elseif(pi_flag == 1'b1)work_en <= 1'b1;elseif((bit_flag == 1'b1) && (bit_cnt == 4'd9))work_en <= 1'b0;//baud_cnt:波特率计数器计数,从0计数到BAUD_CNT_MAX - 1always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)baud_cnt <= 13'b0;elseif((baud_cnt == BAUD_CNT_MAX - 1) || (work_en == 1'b0))baud_cnt <= 13'b0;elseif(work_en == 1'b1)baud_cnt <= baud_cnt + 1'b1;//bit_flag:当baud_cnt计数器计数到1时让bit_flag拉高一个时钟的高电平always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)bit_flag <= 1'b0;elseif(baud_cnt == 13'd1)bit_flag <= 1'b1;elsebit_flag <= 1'b0;//bit_cnt:数据位数个数计数,10个有效数据(含起始位和停止位)到来后计数器清零always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)bit_cnt <= 4'b0;elseif((bit_flag == 1'b1) && (bit_cnt == 4'd9))bit_cnt <= 4'b0;elseif((bit_flag == 1'b1) && (work_en == 1'b1))bit_cnt <= bit_cnt + 1'b1;//tx:输出数据在满足rs232协议(起始位为0,停止位为1)的情况下一位一位输出always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)tx <= 1'b1; //空闲状态时为高电平elseif(bit_flag == 1'b1)case(bit_cnt)0: tx <= 1'b0;1: tx <= pi_data[0];2: tx <= pi_data[1];3: tx <= pi_data[2];4: tx <= pi_data[3];5: tx <= pi_data[4];6: tx <= pi_data[5];7: tx <= pi_data[6];8: tx <= pi_data[7];9: tx <= 1'b1;default : tx <= 1'b1;endcaseendmodule
7.3 rs232
`timescale1ns/1nsmodulers232(inputwiresys_clk,//系统时钟50MHzinputwiresys_rst_n,//全局复位inputwirerx,//串口接收数据outputwiretx//串口发送数据);//********************************************************************////****************** Parameter and Internal Signal *******************////********************************************************************////parameter defineparameterUART_BPS=14'd9600,//比特率CLK_FREQ=26'd50_000_000;//时钟频率//wiredefinewire[7:0]po_data;wirepo_flag;//********************************************************************////*************************** Instantiation **************************////********************************************************************////------------------------ uart_rx_inst ------------------------uart_rx#(.UART_BPS(UART_BPS),//串口波特率.CLK_FREQ(CLK_FREQ)//时钟频率)uart_rx_inst(.sys_clk(sys_clk),//inputsys_clk.sys_rst_n(sys_rst_n),//inputsys_rst_n.rx(rx),//inputrx.po_data(po_data),//output[7:0]po_data.po_flag(po_flag)//outputpo_flag);//------------------------ uart_tx_inst ------------------------uart_tx#(.UART_BPS(UART_BPS),//串口波特率.CLK_FREQ(CLK_FREQ)//时钟频率)uart_tx_inst(.sys_clk(sys_clk),//inputsys_clk.sys_rst_n(sys_rst_n),//inputsys_rst_n.pi_data(po_data),//input[7:0]pi_data.pi_flag(po_flag),//inputpi_flag.tx(tx)//outputtx);endmodule