//对发送使能信号uart_en延迟两个时钟周期 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin uart_en_d0 <= 1'b0; uart_en_d1 <= 1'b0; end elsebegin uart_en_d0 <= uart_en; uart_en_d1 <= uart_en_d0; end end
//当脉冲信号en_flag到达时,寄存待发送的数据,并进入发送过程 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin tx_flag <= 1'b0; tx_data <= 8'd0; end elseif (en_flag) begin//检测到发送使能上升沿 tx_flag <= 1'b1; //进入发送过程,标志位tx_flag拉高 tx_data <= uart_din; //寄存待发送的数据 end //计数到停止位结束时,停止发送过程 elseif ((tx_cnt == 4'd9) && (clk_cnt == BPS_CNT - (BPS_CNT/16))) begin tx_flag <= 1'b0; //发送过程结束,标志位tx_flag拉低 tx_data <= 8'd0; end elsebegin tx_flag <= tx_flag; tx_data <= tx_data; end end
//进入发送过程后,启动系统时钟计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) clk_cnt <= 16'd0; elseif (tx_flag) begin//处于发送过程 if (clk_cnt < BPS_CNT - 1) clk_cnt <= clk_cnt + 1'b1; else clk_cnt <= 16'd0; //对系统时钟计数达一个波特率周期后清零 end else clk_cnt <= 16'd0; //发送过程结束 end
//进入发送过程后,启动发送数据计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) tx_cnt <= 4'd0; elseif (tx_flag) begin//处于发送过程 if (clk_cnt == BPS_CNT - 1) //对系统时钟计数达一个波特率周期 tx_cnt <= tx_cnt + 1'b1; //此时发送数据计数器加1 else tx_cnt <= tx_cnt; end else tx_cnt <= 4'd0; //发送过程结束 end
always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin usart_down <= 1'b0; first <= 1'b1; end elseif (first)begin/ usart_down <= 1; first <= 0; end elseif(tx_cnt == 4'd0) begin usart_down <= 1; end else usart_down <= 0; end
always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin uart_en_d0 <= 1'b0; uart_en_d1 <= 1'b0; end elsebegin uart_en_d0 <= usart_down; uart_en_d1 <= uart_en_d0; end end
always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin tx_flag <= 1'b0; tx_data <= arry[0]; Data_Count <= 4'b0; end elseif(en_flag) begin tx_flag <= 1'b1; tx_data <= arry[Data_Count]; end elseif((tx_cnt == 4'd10)&&(clk_cnt == BPS_CNT/2)) begin tx_flag <= 1'b0; Data_Count<=Data_Count+4'b1; if (Data_Count==Data_Len) Data_Count<=4'b0; end end
always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin clk_cnt <= 16'd0; tx_cnt <= 4'd0; end elseif (tx_flag) begin if (clk_cnt < BPS_CNT - 1) begin clk_cnt <= clk_cnt + 1'b1; tx_cnt <= tx_cnt; end elsebegin clk_cnt <= 16'd0; tx_cnt <= tx_cnt + 1'b1; end end else be clk_cnt <= 16'd0; tx_cnt <= 4'd0; end end
//对UART接收端口的数据延迟两个时钟周期 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) begin uart_rxd_d0 <= 1'b0; uart_rxd_d1 <= 1'b0; end elsebegin uart_rxd_d0 <= uart_rxd; uart_rxd_d1 <= uart_rxd_d0; end end
//当脉冲信号start_flag到达时,进入接收过程 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) rx_flag <= 1'b0; elsebegin if(start_flag) //检测到起始位 rx_flag <= 1'b1; //进入接收过程,标志位rx_flag拉高 //计数到停止位中间时,停止接收过程 elseif((rx_cnt == 4'd9) && (clk_cnt == BPS_CNT/2)) rx_flag <= 1'b0; //接收过程结束,标志位rx_flag拉低 else rx_flag <= rx_flag; end end
//进入接收过程后,启动系统时钟计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) clk_cnt <= 16'd0; elseif ( rx_flag ) begin//处于接收过程 if (clk_cnt < BPS_CNT - 1) clk_cnt <= clk_cnt + 1'b1; else clk_cnt <= 16'd0; //对系统时钟计数达一个波特率周期后清零 end else clk_cnt <= 16'd0; //接收过程结束,计数器清零 end
//进入接收过程后,启动接收数据计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if (!sys_rst_n) rx_cnt <= 4'd0; elseif ( rx_flag ) begin//处于接收过程 if (clk_cnt == BPS_CNT - 1) //对系统时钟计数达一个波特率周期 rx_cnt <= rx_cnt + 1'b1; //此时接收数据计数器加1 else rx_cnt <= rx_cnt; end else rx_cnt <= 4'd0; //接收过程结束,计数器清零 end