⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_tx.v

📁 sdram读写
💻 V
字号:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company		: 
// Engineer		: 
// Create Date	: 
// Design Name	: 
// Module Name	: uart_tx
// Project Name	: 
// Target Device: Cyclone EP1C3T144C8 
// Tool versions: Quartus II 8.1
// Description	: 串口数据发送底层模块
//					1bit起始位+8bit数据+1bit停止位
// Revision		: V1.0
// Additional Comments	:  
// 
////////////////////////////////////////////////////////////////////////////////
module uart_tx(
				clk,rst_n,
				tx_data,tx_start,clk_bps,
				rs232_tx,bps_start,fifo232_rdreq
			);

input clk;			// 25MHz主时钟
input rst_n;		//低电平复位信号
input[7:0] tx_data;	//待发送数据
input tx_start;		//串口发送数据启动标志位,高有效
input clk_bps;		//发送数据标志位,高有效

output rs232_tx;	// RS232发送数据信号
output bps_start;	//波特率时钟计数器启动信号,高有效
output fifo232_rdreq;	//FIFO读请求信号,高有效

//---------------------------------------------------------
reg tx_en;			//发送数据使能信号,高有效
reg[3:0] num;

always @ (posedge clk or negedge rst_n)
	if(!rst_n) tx_en <= 1'b0;
	else if(num==4'd11) tx_en <= 1'b0;	//数据发送完成			
	else if(tx_start) tx_en <= 1'b1;	//进入发送数据状态中

assign bps_start = tx_en;

//tx_en脉冲上升沿检测,作为FIFO读使能信号
reg tx_enr1,tx_enr2;	//tx_en寄存器
always @(posedge clk or negedge rst_n)
	if(!rst_n) begin
			tx_enr1 <= 1'b1;
			tx_enr2 <= 1'b1;
		end
	else begin
			tx_enr1 <= tx_en;
			tx_enr2 <= tx_enr1;
		end

assign fifo232_rdreq = tx_enr1 & ~tx_enr2;	//tx_en上升沿置高一个时钟周期

//---------------------------------------------------------
reg rs232_tx_r;		// RS232发送数据信号

always @ (posedge clk or negedge rst_n)
	if(!rst_n) begin
			num <= 4'd0;
			rs232_tx_r <= 1'b1;
		end
	else if(tx_en) begin
			if(clk_bps)	begin
					num <= num+1'b1;
					case (num)
						4'd0: rs232_tx_r <= 1'b0; 	//发送起始位
						4'd1: rs232_tx_r <= tx_data[0];	//发送bit0
						4'd2: rs232_tx_r <= tx_data[1];	//发送bit1
						4'd3: rs232_tx_r <= tx_data[2];	//发送bit2
						4'd4: rs232_tx_r <= tx_data[3];	//发送bit3
						4'd5: rs232_tx_r <= tx_data[4];	//发送bit4
						4'd6: rs232_tx_r <= tx_data[5];	//发送bit5
						4'd7: rs232_tx_r <= tx_data[6];	//发送bit6
						4'd8: rs232_tx_r <= tx_data[7];	//发送bit7
						4'd9: rs232_tx_r <= 1'b1;	//发送结束位
					 	default: rs232_tx_r <= 1'b1;
						endcase
				end
			else if(num==4'd11) num <= 4'd0;	//复位,实际发送一个数据时间为10.5个波特率时钟周期
		end

assign rs232_tx = rs232_tx_r;



endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -