Mirage? 2021-04-17 04:35 采纳率: 0%
浏览 12

如何设计UART和测试设计好的UART

`timescale 1ns / 1ps

module model_uart
# ( parameter SYSTEM_CLOCK_MHZ = 100,
    parameter BAUD_RATE = 115200 )
(
    input sysClk, nRst,
    output baudClk,
    // Transmitter interface
    input [7:0] dataout,
    input txWrite,
    output txEmpty, txUnderrun,
    output txD,
    // Receiver interface
    input  rxD,
    output [7:0] datain,
    input rxRead,
    output rxEmpty, rxOverrun, rxFramingError, rxBreakDetect    
    );

reg [9:0] txShiftReg, rxShiftReg;
reg bclk = 0;
reg framingError,rxInProgress,overrun,underrun,received;
integer txCount,rxCount;

localparam CLK_DIV = $rtoi(SYSTEM_CLOCK_MHZ*1e6/BAUD_RATE);
localparam BAUD_PERIOD_ns = 1000*CLK_DIV/SYSTEM_CLOCK_MHZ;
localparam HALF_PERIOD = BAUD_PERIOD_ns/2;
localparam START = 3'b001;
localparam STOP  = 3'b011;
 
always #(HALF_PERIOD) bclk=!bclk;

always @(posedge nRst) begin // reset deasserted
    txShiftReg = 10'bX; rxShiftReg = 10'bX;
    txCount = 0; rxCount=0; rxInProgress = 0; framingError=0; overrun=0; underrun=0; received=0;  
end

always @(posedge bclk) begin // transmit serial         
    if (txCount>0) begin
        txShiftReg = {1'bX, txShiftReg[9:1]};
        txCount=txCount-1;
    end
end

always @(negedge bclk) begin // receive serial
    case (rxCount)
        0: begin
            rxShiftReg=10'b0_XXXX_XXXX_X;
            if (rxInProgress==1) overrun=1;
            if (rxD==START) begin
                rxInProgress=1;
                rxCount=rxCount+1;
            end
          end                    
        10: begin
            rxInProgress=0;
            if (rxShiftReg[9]!=STOP) framingError=1;
            received=1;
            end    
        default: begin
            rxShiftReg={rxD,rxShiftReg[9:1]};
            rxCount=rxCount+1;
            end                
    endcase
end

always @(posedge sysClk) begin // bus interface
    if (txWrite) begin
        underrun = (txCount!=0);         
        txShiftReg = { STOP, dataout, START };
        @(posedge bclk) txCount=10;
    end
    if (rxRead) begin
        overrun=0; framingError=0; received=0;
        rxCount=0; // rxShiftReg = 10'bX;
    end
end

// continuous assignments
assign baudClk = bclk & nRst;
assign txEmpty = (txCount==0);
assign txUnderrun = underrun;
assign txD = txShiftReg[***TODO***];
assign datain = rxShiftReg[***TODO***];

如何写上述URAT的 关于 接收器和发射器的 单元测试? 上述txD和 detain变量该如何赋值?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料