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

📄 m3s003an.v

📁 mentor UART IP verilog源码 以通过验证.
💻 V
字号:
// Address Decode and Output Data Mux// Copyright Mentor Graphics Corporation and Licensors 1999// V1.200// This module provides the address decoding, register file and output data muxing// for the M16550a UART.// Revision history:// V1.200  - 15 June 1999//           Changed constants from 2'b0 to 2'b00 to clear lint warning (ECN 1242)// V1.100  - 12 May 1999//           Baud divider register addresses decoded// V1.000  - 26/9/96//           Originalmodule m3s003an (  CLK, MR, NCE, NRD, RD, NWR,   A, DI, IIR, IER, DIV, RXD,  LOOP1, OUT1, OUT2, RTS, DTR, TSRE, THRE,  BI, FE, PE, OE, DR, ERF, DCD, RI,  DSR, CTS, DDCD, TERI, DDSR, DCTS, RxBlank,  PEN, WLS0, WLS1, STB, EPS, SP, SB, NDVL,  DA, ADD0, ADD1, ADD2, ADD4, ADD5, ADD6, ADD0B, ADD1B,  FIFOE, IFIFOE, DMA, IDMA, RTL, RTM  ); input        CLK, MR, NCE, NRD, RD, NWR;input  [2:0] A;input  [7:0] DI;input  [3:0] IIR, IER;input [15:0] DIV;input  [7:0] RXD;input        LOOP1, OUT1, OUT2, RTS, DTR, TSRE, THRE;input        BI, FE, PE, OE, DR, ERF, DCD, RI;input        DSR, CTS, DDCD, TERI, DDSR, DCTS, RxBlank;output       PEN, WLS0, WLS1, STB, EPS, SP, SB, NDVL;output [7:0] DA; output       ADD0, ADD1, ADD2, ADD4, ADD5, ADD6, ADD0B, ADD1B;output       FIFOE, IFIFOE, DMA, IDMA, RTL, RTM;reg       ADD0, ADD1, ADD2, ADD3, ADD4, ADD5, ADD6, ADD7;reg [7:0] LCR, SCR, DA, IDA;reg       WLS0, WLS1, STB, PEN, EPS, SP, SB;reg       IFIFOE, IDMA, IRTL, IRTM, DMA, RTL, RTM;reg [4:0] DA_reg;reg       BLANK_ADD5, FIFOE, NDVL;reg       ADD0B, ADD1B;// Decode addressalways @(NCE or A or LCR)begin  ADD0 = ~NCE & ~A[2] & ~A[1] & ~A[0] & ~LCR[7];  ADD1 = ~NCE & ~A[2] & ~A[1] &  A[0] & ~LCR[7];  ADD2 = ~NCE & ~A[2] &  A[1] & ~A[0];  ADD3 = ~NCE & ~A[2] &  A[1] &  A[0];  ADD4 = ~NCE &  A[2] & ~A[1] & ~A[0];  ADD5 = ~NCE &  A[2] & ~A[1] &  A[0];  ADD6 = ~NCE &  A[2] &  A[1] & ~A[0];  ADD7 = ~NCE &  A[2] &  A[1] &  A[0];  ADD0B = ~NCE & ~A[2] & ~A[1] & ~A[0] & LCR[7];  ADD1B = ~NCE & ~A[2] & ~A[1] &  A[0] & LCR[7];end// Line Control Register// Controls the format of the RX and TX wordsalways @(posedge NWR or posedge MR)begin  if (MR)    LCR <= 0;  else if (ADD3)    LCR <= DI;end// Synchronise CPU channel to TX & RX Channels with a flip-flopalways @(posedge CLK)begin  WLS0 <= LCR[0];  WLS1 <= LCR[1];  STB <= LCR[2];  PEN <= LCR[3];  EPS <= LCR[4];  SP <= LCR[5];endalways @(posedge CLK or posedge MR)  if (MR)    SB <= 1'b0;  else    SB <= LCR[6];// FIFO Control Register (write only)//// CPU timing domain// Reset signals not stored as self clearing. They are dealt with in m3s008 & m3s007always @(posedge NWR or posedge MR)begin  if (MR)  begin    IFIFOE <= 1'b0;    IDMA <= 1'b0;    IRTL <= 1'b0;    IRTM <= 1'b0;  end  else if (ADD2 & DI[0])  // bit 0 must be set to program other bits  begin    IFIFOE <= DI[0];     IDMA <= DI[3];    IRTL <= DI[6];    IRTM <= DI[7];  end  else if (ADD2)  begin    IFIFOE <= DI[0];    IDMA <= IDMA;    IRTL <= IRTL;    IRTM <= IRTM;  endend// Synchronise CPU, TX and RX channelsalways @(posedge CLK)begin  FIFOE <= IFIFOE;   DMA <= IDMA;  RTL <= IRTL;  RTM <= IRTM;end// Scratch Register doesn't need to be synchronised since read only// by CPU timing channel// Note that it is not resetalways @(posedge NWR)  if (ADD7)    SCR[7:0] <= DI[7:0];// Output data multiplexeralways @(ADD0 or ADD1 or ADD2 or ADD3 or ADD4 or ADD5 or ADD6 or ADD7 or  ADD0B or ADD1B or  RXD or IER or FIFOE or IIR or LCR or  LOOP1 or OUT2 or OUT1 or RTS or DTR or ERF or TSRE or THRE or BI or FE or PE or OE or DR or  DCD or RI or DSR or CTS or DDCD or TERI or DDSR or DCTS or SCR or DIV)begin  IDA = ({8{ADD0}} & RXD) |        ({4'h0, ({4{ADD1}} & IER)}) |        ({(ADD2 & FIFOE), (ADD2 & FIFOE), 2'b00, ({4{ADD2}} & IIR)}) |        ({8{ADD3}} & LCR) |        ({3'b000, (ADD4 & LOOP1), (ADD4 & OUT2), (ADD4 & OUT1), (ADD4 & RTS),	  (ADD4 & DTR)}) |        ({(ADD5 & ERF), (ADD5 & TSRE), (ADD5 & THRE), (ADD5 & BI),	  (ADD5 & FE), (ADD5 & PE), (ADD5 & OE), (ADD5 & DR)}) |        ({(ADD6 & DCD), (ADD6 & RI), (ADD6 & DSR), (ADD6 & CTS),	  (ADD6 & DDCD), (ADD6 & TERI), (ADD6 & DDSR), (ADD6 & DCTS)}) |        ({8{ADD7}} & SCR) |        ({8{ADD0B}} & DIV[7:0]) | ({8{ADD1B}} & DIV[15:8]);end// Latch data on rising edge of RD so that it is frozen// (Equates to falling edge of NRD)//// Blank LSR data on read-back if in M16C450 modealways @(posedge RD)begin    DA[7:5] <= IDA[7:5];    DA_reg[4:0] <= IDA[4:0];    if (RxBlank & ADD5)       BLANK_ADD5 <= 1'b0;    else BLANK_ADD5 <= 1'b1;endalways @(BLANK_ADD5 or DA_reg)begin    DA[4] <= DA_reg[4] & BLANK_ADD5;    DA[3] <= DA_reg[3] & BLANK_ADD5;    DA[2] <= DA_reg[2] & BLANK_ADD5;    DA[1] <= DA_reg[1] & BLANK_ADD5;    DA[0] <= DA_reg[0] & BLANK_ADD5;end// Generate NDVL - Output TRI-State buffer enable from // NCE and NRDalways @(NCE or NRD)  NDVL = NCE | NRD;endmodule	

⌨️ 快捷键说明

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