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

📄 muart.v

📁 UART verilog hdl 实现
💻 V
字号:
//`include "ClkUNIT.v"
//`include "TxUNIT.v"
//`include "RxUNIT.v"

module MUART(SysClk, Reset, CS_N, RD_N, WR_N, TxD, RxD, IntRx_N, IntTx_N, Addr, DataIn, DataOut);

input SysClk;              //系统时脉输入
input Reset;               //系统重设输入
input CS_N;                //芯片读写使能
input RD_N;                //芯片读取信号输入
input WR_N;                //芯片写入信号输入
input RxD;                 //UART 的信号接收端
output TxD;                //UART 的信号发送端
output IntRx_N;            //UART 的接收完成中断信号输出
output IntTx_N;            //UART 的发送完成中断信号输出
input[1:0] Addr;           //芯片内部寄存器的寻址选择
input[7:0] DataIn;         //芯片内部寄存器写入端
output[7:0] DataOut;       //芯片内部寄存器输出端
//
//output EnabRx;
//output EnabTx;
//output[4:0] StatM;
//output TRegE;
//output TBufE;
//

//内部信号定义
wire EnabRx;               //使能RX接收的同步信号
wire EnabTx;               //使能TX发送的同步信号
wire DRdy;                 //接收数据已备妥标志
wire TRegE;                //发送寄存器内数据已发送而空闲标志
wire TBufE;                //发送缓冲寄存器已转入TREG而空闲标志
wire FErr;                 //接收数据的停止位错误的标志
wire OErr;                 //接收数据产生叠误的标志
wire[7:0] RxData;

reg[7:0] TxData;
reg[7:0] DataOut;
reg[7:0] DataOutp;
reg[7:0] RxDatap;
reg[7:0] TxDatap;
reg[7:0] CSReg;           //内部状态和控制标志寄存器
reg[4:0] StatM;
reg      Read;
reg      Load;
reg      IntRx_N;
reg      IntTx_N;

//实例化
//ClkUNIT
ClkUNIT clkunit(.SysClk(SysClk),
				.EnableRx(EnabRx),
				.EnableTx(EnabTx),
				.Reset(Reset));

//TxUNIT
TxUNIT txunit(.Clk(SysClk),
			  .Reset(Reset),
              .Enable(EnabTx),
			  .TxD(RxD),
			  .Load(Load),
			  .TRegE(TRegE),
			  .TBufE(TBufE),
			  .DataO(TxData));	

//RxUNIT
RxUNIT rxunit(.Clk(SysClk),
			  .Reset(Reset),
  			  .Enable(EnabRx),
   			  .RxD(TxD),
			  .RD(Read),
			  .FErr(FErr),
			  .OErr(OErr),
			  .DRdy(DRdy),
			  .DataIn(RxData));

always@(posedge SysClk)
begin
	if(Reset==0)begin
		StatM = 5'b00000;
	end else begin
		StatM[0] = DRdy;
		StatM[1] = FErr;
		StatM[2] = OErr;
		StatM[3] = TBufE;
		StatM[4] = TRegE;
	end

	if(Reset==0)begin
		IntTx_N = 1;
		IntRx_N = 1;
		CSReg[7:0] = 8'b11110000; 
	end else begin 

    if(Read==1)begin
		StatM[2] = 0;
		IntRx_N = 1;
	end else begin 
    	case(StatM)
		5'b00001:begin
				 IntRx_N = 0;
				 CSReg[2] = 1;
				 end
		5'b10001:begin
			     IntRx_N = 0;
                 CSReg[2] = 1;
				 end
        default: ;
	    endcase
    end

    if(Load==1)begin
		StatM[3] = 0;
		IntTx_N = 1;
	end else begin
		case(StatM)
		5'b01000:IntTx_N = 0;
		5'b11000:begin
				 IntTx_N = 0;
				 CSReg[3] = 1;
				 end
        default: ;
		endcase
	end
    end
end

always@(SysClk)
begin
	if((CS_N==0)&&(RD_N==0))begin
		Read = 1;
	end else begin
		Read = 0;
	end

	if((CS_N==0)&&(WR_N==0))begin
		Load = 1;
	end else begin
		Load = 0;
    end

	if(Read==0)begin
		DataOut[7:0] = 8'bzzzzzzzz; 
	end else begin
		DataOut = DataOutp;
	end
   
    if((Read==1)&&(Addr==2'b00))begin
		DataOutp = RxData;
	end else if((Read==1)&&(Addr==2'b01))begin
		DataOutp = CSReg;
	end 

	if(Load==0)begin
		TxData = 8'b11111111;
	end else begin
		TxData = TxDatap;
	end

	if((Load==1)&&(Addr==2'b00))begin
		TxDatap = DataIn;
	end
end
endmodule		



⌨️ 快捷键说明

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