📄 muart.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 + -