文章目录
uart发送数据(driver)
CPU通过APB总线给uart写入数据,将数据保存在TX_FIFO中,然后通过uart_driver将并行数据串行的发送到总线上。注意:发送时,应该符合uart的通信协议,在不发送数据时,sline.data应该保持高电平,当其拉低以后,表明数据传输开始。同时,数据传输应该根据波特率配置,并采用16倍频发送。具体可看uart波特率模块
在发送完前四个数据以后,后续5到8位的数据发送应该由LCR寄存器配置决定,紧接着发送奇偶校验位和停止位,停止位的位数也根据LCR配置。
部分代码如下:
// Start bit
sline.sdata = 0;
bitPtr = 0;
bitPeriod;
// Data bits 0 to 4
while(bitPtr < 5)
begin
sline.sdata = pkt.data[bitPtr];
bitPeriod;
bitPtr++;
end
// Data bits 5 to 7
if (pkt.lcr[1:0] > 2'b00)
begin
sline.sdata = pkt.data[5];
bitPeriod;
end
....
....
uart接受数据(monitor)
在monitor中,Uart接受到另外一个uart传输过来的串行数据,并将其存储到RX_FIFO中。在monitor中,有两个task,分别为数据接受和起始位检测。为了保证采样稳定可靠,必须在连续监测到8个低电平的sdata,才能真正表示数据开始发送。
起始位task代码如下:
task startBitErrorDetect;
automatic integer i;
automatic int startbit = 0;
begin
sbe = 0;
s_char.sbe = 0;
i = 0;
while((sline.sdata == 1'b1) || (sline.sdata == 1'bx))
@(posedge clk);
startbit = 1;
begin : startBitErrorDetect
startbit = 99;
while ((sbe != 1) && i<8)
begin
@(posedge sline.clk);
if(sline.sdata == 1'b1)
begin
`uvm_warning("startBitErrorDetect", "False start bit detected")
startbit = 88;
sbe = 1;
s_char.sbe = 1;
end
i++;//i<8, i++,当i=7即检测8个时钟沿时结束循环,表明这段时间的sbe均不为1,成功检测到起始位
startbit = i;
end
if (sbe)
forever
@(posedge sline.clk);
end : startBitErrorDetect
end
endtask
数据接受的task中较为简单,和driver中相似,将driver串行发送过来的数据依次存入rxData中,需要注意的是,需要添加一个frame error位,当数据发送完时,停止位的电平应该拉高,否则拉高fe(frame error)。
repeat(8)
@(posedge sline.clk);
repeat(8)
begin
@(posedge sline.clk);
if (sline.sdata == 1'b0)
fe = 1;
end
driver与monitor间的数据流如下图所示: