Untitled
unknown
plain_text
9 months ago
2.3 kB
17
Indexable
`timescale 1ns / 1ps
module model_uart(/*AUTOARG*/
// Outputs
TX,
// Inputs
RX
);
output TX;
input RX;
parameter baud = 115200;
parameter bittime = 1000000000/baud;
parameter name = "UART0";
reg [7:0] rxData;
event evBit;
event evByte;
event evTxBit;
event evTxByte;
reg TX;
reg [7:0] rxBuffer [0:3];
integer byteCount = 0;
initial
begin
TX = 1'b1;
end
/*
always @ (negedge RX)
begin
rxData[7:0] = 8'h0;
#(0.5*bittime);
repeat (8)
begin
#bittime ->evBit;
//rxData[7:0] = {rxData[6:0],RX};
rxData[7:0] = {RX,rxData[7:1]};
end
->evByte;
$display ("%d %s Received byte %02x (%s)", $stime, name, rxData, rxData);
end*/
always @ (negedge RX)
begin
rxData[7:0] = 8'h0;
#(0.5*bittime);
repeat (8)
begin
#bittime ->evBit;
rxData[7:0] = {RX,rxData[7:1]};
end
// rxBuffer[byteCount] = rxData;
// byteCount = byteCount + 1;
if (rxData != 8'h0A && rxData != 8'h72) begin
rxBuffer[byteCount] = rxData;
byteCount = byteCount + 1;
end
if (byteCount == 4) begin
$display ("%d %s Received bytes %s",
$stime, name,
{rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3]});
byteCount = 0;
end
->evByte;
end
task tskRxData;
output [7:0] data;
begin
@(evByte);
data = rxData;
end
endtask // for
task tskTxData;
input [7:0] data;
reg [9:0] tmp;
integer i;
begin
tmp = {1'b1, data[7:0], 1'b0};
for (i=0;i<10;i=i+1)
begin
TX = tmp[i];
#bittime;
->evTxBit;
end
->evTxByte;
end
endtask // tskTxData
endmodule // model_uart
Editor is loading...
Leave a Comment