working FIFO and TPSRAM without packet flter

This commit is contained in:
2026-04-15 23:54:00 +05:30
parent 77c69687d9
commit e4b91625ea
579 changed files with 1295759 additions and 0 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -0,0 +1,164 @@
//////////////////////////////////////////////////////////////////////
// Created by SmartDesign Mon Apr 13 21:41:13 2026
// Version: 2025.1 2025.1.0.14
//////////////////////////////////////////////////////////////////////
`timescale 1ns / 100ps
//////////////////////////////////////////////////////////////////////
// Component Description (Tcl)
//////////////////////////////////////////////////////////////////////
/*
# Exporting Component Description of CoreUARTapb_0 to TCL
# Family: PolarFire
# Part Number: MPF300TS-1FCG1152I
# Create and Configure the core component CoreUARTapb_0
create_and_configure_core -core_vlnv {Actel:DirectCore:CoreUARTapb:5.7.100} -component_name {CoreUARTapb_0} -params {\
"BAUD_VAL_FRCTN:0" \
"BAUD_VAL_FRCTN_EN:false" \
"BAUD_VALUE:1" \
"FIXEDMODE:0" \
"PRG_BIT8:0" \
"PRG_PARITY:0" \
"RX_FIFO:0" \
"RX_LEGACY_MODE:0" \
"TX_FIFO:0" \
"USE_SOFT_FIFO:0" }
# Exporting Component Description of CoreUARTapb_0 to TCL done
*/
// CoreUARTapb_0
module CoreUARTapb_0(
// Inputs
PADDR,
PCLK,
PENABLE,
PRESETN,
PSEL,
PWDATA,
PWRITE,
RX,
// Outputs
FRAMING_ERR,
OVERFLOW,
PARITY_ERR,
PRDATA,
PREADY,
PSLVERR,
RXRDY,
TX,
TXRDY
);
//--------------------------------------------------------------------
// Input
//--------------------------------------------------------------------
input [4:0] PADDR;
input PCLK;
input PENABLE;
input PRESETN;
input PSEL;
input [7:0] PWDATA;
input PWRITE;
input RX;
//--------------------------------------------------------------------
// Output
//--------------------------------------------------------------------
output FRAMING_ERR;
output OVERFLOW;
output PARITY_ERR;
output [7:0] PRDATA;
output PREADY;
output PSLVERR;
output RXRDY;
output TX;
output TXRDY;
//--------------------------------------------------------------------
// Nets
//--------------------------------------------------------------------
wire [4:0] PADDR;
wire PENABLE;
wire [7:0] APB_bif_PRDATA;
wire APB_bif_PREADY;
wire PSEL;
wire APB_bif_PSLVERR;
wire [7:0] PWDATA;
wire PWRITE;
wire FRAMING_ERR_net_0;
wire OVERFLOW_net_0;
wire PARITY_ERR_net_0;
wire PCLK;
wire PRESETN;
wire RX;
wire RXRDY_net_0;
wire TX_net_0;
wire TXRDY_net_0;
wire TXRDY_net_1;
wire RXRDY_net_1;
wire PARITY_ERR_net_1;
wire OVERFLOW_net_1;
wire TX_net_1;
wire FRAMING_ERR_net_1;
wire [7:0] APB_bif_PRDATA_net_0;
wire APB_bif_PREADY_net_0;
wire APB_bif_PSLVERR_net_0;
//--------------------------------------------------------------------
// Top level output port assignments
//--------------------------------------------------------------------
assign TXRDY_net_1 = TXRDY_net_0;
assign TXRDY = TXRDY_net_1;
assign RXRDY_net_1 = RXRDY_net_0;
assign RXRDY = RXRDY_net_1;
assign PARITY_ERR_net_1 = PARITY_ERR_net_0;
assign PARITY_ERR = PARITY_ERR_net_1;
assign OVERFLOW_net_1 = OVERFLOW_net_0;
assign OVERFLOW = OVERFLOW_net_1;
assign TX_net_1 = TX_net_0;
assign TX = TX_net_1;
assign FRAMING_ERR_net_1 = FRAMING_ERR_net_0;
assign FRAMING_ERR = FRAMING_ERR_net_1;
assign APB_bif_PRDATA_net_0 = APB_bif_PRDATA;
assign PRDATA[7:0] = APB_bif_PRDATA_net_0;
assign APB_bif_PREADY_net_0 = APB_bif_PREADY;
assign PREADY = APB_bif_PREADY_net_0;
assign APB_bif_PSLVERR_net_0 = APB_bif_PSLVERR;
assign PSLVERR = APB_bif_PSLVERR_net_0;
//--------------------------------------------------------------------
// Component instances
//--------------------------------------------------------------------
//--------CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb - Actel:DirectCore:CoreUARTapb:5.7.100
CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb #(
.BAUD_VAL_FRCTN ( 0 ),
.BAUD_VAL_FRCTN_EN ( 0 ),
.BAUD_VALUE ( 1 ),
.FAMILY ( 26 ),
.FIXEDMODE ( 0 ),
.PRG_BIT8 ( 0 ),
.PRG_PARITY ( 0 ),
.RX_FIFO ( 0 ),
.RX_LEGACY_MODE ( 0 ),
.TX_FIFO ( 0 ) )
CoreUARTapb_0_0(
// Inputs
.PCLK ( PCLK ),
.PRESETN ( PRESETN ),
.PADDR ( PADDR ),
.PSEL ( PSEL ),
.PENABLE ( PENABLE ),
.PWRITE ( PWRITE ),
.PWDATA ( PWDATA ),
.RX ( RX ),
// Outputs
.PRDATA ( APB_bif_PRDATA ),
.TXRDY ( TXRDY_net_0 ),
.RXRDY ( RXRDY_net_0 ),
.PARITY_ERR ( PARITY_ERR_net_0 ),
.OVERFLOW ( OVERFLOW_net_0 ),
.TX ( TX_net_0 ),
.PREADY ( APB_bif_PREADY ),
.PSLVERR ( APB_bif_PSLVERR ),
.FRAMING_ERR ( FRAMING_ERR_net_0 )
);
endmodule

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?><Component xmlns="http://actel.com/sweng/afi"><name>CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb</name><vendor/><library/><version/><fileSets><fileSet fileSetId="STIMULUS_FILESET"><file fileid="0"><name>coreparameters.v</name><fileType>verilogSource</fileType><vendorExtensions><isIncludeFile/><requireUniquify/></vendorExtensions></file><file fileid="1"><name>rtl\vlog\amba_bfm\bfm_ahbl.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="2"><name>rtl\vlog\amba_bfm\bfm_ahblapb.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="3"><name>rtl\vlog\amba_bfm\bfm_ahbslave.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="4"><name>rtl\vlog\amba_bfm\bfm_ahbslaveext.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="5"><name>rtl\vlog\amba_bfm\bfm_ahbtoapb.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="6"><name>rtl\vlog\amba_bfm\bfm_apb.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="7"><name>rtl\vlog\amba_bfm\bfm_apbslave.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="8"><name>rtl\vlog\amba_bfm\bfm_apbslaveext.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="9"><name>rtl\vlog\amba_bfm\bfm_apbtoapb.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="10"><name>rtl\vlog\amba_bfm\bfm_main.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="11"><name>rtl\vlog\test\user\testbench.v</name><fileType>verilogSource</fileType><vendorExtensions><ModuleUnderTest>testbench</ModuleUnderTest><SimulationTime>-all</SimulationTime><requireUniquify/></vendorExtensions></file></fileSet><fileSet fileSetId="ANY_SIMULATION_FILESET"><file fileid="12"><name>mti\scripts\bfmtovec_compile.do</name><userFileType>DO</userFileType><vendorExtensions><IncludeInRunDo/><requireUniquify/></vendorExtensions></file><file fileid="13"><name>mti\scripts\coreuart_usertb_apb_master.bfm</name><userFileType>BFM</userFileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="14"><name>mti\scripts\coreuart_usertb_include.bfm</name><userFileType>BFM</userFileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="15"><name>mti\scripts\wave_vlog_amba.do</name><userFileType>DO</userFileType><vendorExtensions><IncludeInRunDo/><requireUniquify/></vendorExtensions></file></fileSet><fileSet fileSetId="HDL_FILESET"><file fileid="16"><name>rtl\vlog\core\Clock_gen.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="17"><name>rtl\vlog\core\Rx_async.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="18"><name>rtl\vlog\core\Tx_async.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="19"><name>rtl\vlog\core\CoreUART.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="20"><name>rtl\vlog\core\CoreUARTapb.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file><file fileid="21"><name>rtl\vlog\core\fifo_256x8_g5.v</name><fileType>verilogSource</fileType><vendorExtensions><requireUniquify/></vendorExtensions></file></fileSet></fileSets><hwModel><views><view><fileSetRef>STIMULUS_FILESET</fileSetRef><fileSetRef>ANY_SIMULATION_FILESET</fileSetRef><name>SIMULATION</name></view><view><fileSetRef>HDL_FILESET</fileSetRef><name>HDL</name></view></views></hwModel></Component>

View File

@@ -0,0 +1,19 @@
//--------------------------------------------------------------------
// Created by Microsemi SmartDesign Mon Apr 13 21:41:13 2026
// Parameters for CoreUARTapb
//--------------------------------------------------------------------
parameter BAUD_VAL_FRCTN = 0;
parameter BAUD_VAL_FRCTN_EN = 0;
parameter BAUD_VALUE = 1;
parameter FAMILY = 26;
parameter FIXEDMODE = 0;
parameter HDL_license = "U";
parameter PRG_BIT8 = 0;
parameter PRG_PARITY = 0;
parameter RX_FIFO = 0;
parameter RX_LEGACY_MODE = 0;
parameter testbench = "User";
parameter TX_FIFO = 0;
parameter USE_SOFT_FIFO = 0;

View File

@@ -0,0 +1,23 @@
### script to compile Actel AMBA BFM source file into vector file for simulation
# 12Jan09 Production Release Version 3.0
quietly set linux_exe "./bfmtovec.lin"
quietly set windows_exe "./bfmtovec.exe"
quietly set bfm_src_in "./coreuart_usertb_apb_master.bfm"
quietly set bfm_vec_out "./coreuart_usertb_apb_master.vec"
# check OS type and use appropriate executable
if {$tcl_platform(os) == "Linux"} {
echo "--- Using Linux Actel DirectCore AMBA BFM compiler"
quietly set bfmtovec_exe "./bfmtovec.lin"
if {![file executable $bfmtovec_exe]} {
quietly set cmds "chmod +x $bfmtovec_exe"
eval $cmds
}
} else {
echo "--- Using Windows Actel DirectCore AMBA BFM compiler"
quietly set bfmtovec_exe "./bfmtovec.exe"
}
# compile BFM source files into vector outputs
echo "--- Compiling Actel DirectCore AMBA BFM source files ..."
quietly set cmd1 "exec $bfmtovec_exe -in $bfm_src_in -out $bfm_vec_out"
eval $cmd1
# echo "--- Done Compiling Actel DirectCore AMBA BFM source files."

View File

@@ -0,0 +1,100 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2009 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: Verification testbench APB master BFM script for CoreAI
//
// Revision Information:
// Date Description
//
//
// SVN Revision Information:
// SVN $Revision: $
// SVN $Date: $
//
// Resolved SARs
// SAR Date Who Description
//
// Notes:
// 1. best viewed with tabstops set to "4"
// 2. Most of the behavior is driven from the BFM script for the APB master.
// Consult the Actel AMBA BFM documentation for more information.
// 3. All procedures, variables, and constants used by the 'main' procedure
// are declared in the include file "coreai_veriftb_include.bfm"
//
// History: 11/05/08 - TFB created
//
// *********************************************************************
// include constants, and miscellaneous procedures used in this main file
include "coreuart_usertb_include.bfm"
procedure main
header "User Testbench for CoreUART: BFM APB Master Test Harness"
print "(c) Copyright 2009 Actel Corporation. All rights reserved."
print "AS: 03/23/09"
call pr_underscores
debug 1 // only text strings printed
//timeout 2000000 // timeout in cycles, in case BFM stalls
//wait 1
call init_parameter_vars
wait 1
// framing error test
ifnot FIXEDMODE
call set_config 0 0 0 5 1
call set_config 1 0 0 5 1
call framing_err_test
endif
// overflow test
call overflow_test
ifnot FIXEDMODE
// TEST FOR ALL CONFIGURATIONS (matching b/w DUTs)
// configure UART1 and 2 to the same config
print "FIXEDMODE=0: testing for all configurations"
call pr_underscores
loop x 0 1 1 // parity_en
loop y 0 1 1 // parity
loop z 0 1 1 // bit_num
call set_config 0 x y 1 z
call set_config 1 x y 1 z
call data_stream
call set_config 0 x y 3 z
call set_config 1 x y 3 z
call data_stream
endloop
endloop
endloop
endif
if FIXEDMODE
// TEST FOR ONE CONFIGURATION (FIXED)
print "FIXEDMODE=1: testing for current configuration only (as follows)"
print "BAUD_VALUE:%0d" BAUD_VALUE
print "PRG_BIT8:%0d" PRG_BIT8
print "PRG_PARITY:%0d" PRG_PARITY
call data_stream
endif
// parity error test
ifnot FIXEDMODE
call parity_err_test
endif
call pr_underscores
// enable
print "End of CoreUART User testbench."
return

View File

@@ -0,0 +1,468 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2009 Actel Corporation All rights reserved
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING
//
// Description: User testbench include file for CoreAI - contains
// various constants procedures etc used by main BFM script
//
// Revision Information:
// Date Description
// 19Jan09 Production Release Version 3 0
//
// SVN Revision Information:
// SVN $Revision: $
// SVN $Date: $
//
// Resolved SARs
// SAR Date Who Description
//
// Notes:
// 1 best viewed with tabstops set to "4"
//
// History:
//
// *********************************************************************
// PSEL[0] HSEL[0] used to access the AHB-to-APB bridge in the BFM_APB mod
// (for UART Transmitter)
memmap BASE1 0x10000000
// PSEL[1] HSEL[1] used to access the AHB-to-APB bridge in the BFM_APB mod
// (for UART Receiver)
memmap BASE2 0x11000000
// variables to store passed parameter values
int FAMILY
int TX_FIFO
int RX_FIFO
int FIXEDMODE
int BAUD_VALUE
int PRG_BIT8
int PRG_PARITY
int RX_LEGACY_MODE
int USE_SOFT_FIFO
// derived parameters
int FIFO_DEPTH
int TIMEOUT_VAL
int BYTE_WAIT_TIME
int BYTE_WAIT_256
int BYTE_WAIT_16
int BYTE_WAIT_8
// data variables
int rdata[256]
// other variables
int PRINT_VARS
int BITVAR
int data
// temp vars
int i j k l w x y z tc rc
int cmp
// CoreGPIO internal addresses
constant TXDATA 0x00
constant RXDATA 0x04
constant CTRL1 0x08
constant CTRL2 0x0C
constant STA 0x10
constant CRTL3 0x14
//BFM GPIN bit defs
constant RXRDY1 0
constant TXRDY1 1
constant PARITY_ERR1 2
constant OVERFLOW1 3
constant RXRDY2 4
constant TXRDY2 5
constant PARITY_ERR2 6
constant OVERFLOW2 7
//---------------------------------------------------------------------------
// procedures
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// initialize local variables from the ARGVALUE* BFM parameters passed
// down from the testbench HDL
//---------------------------------------------------------------------------
procedure init_parameter_vars
set FAMILY $ARGVALUE0
set TX_FIFO $ARGVALUE1
set RX_FIFO $ARGVALUE2
set FIXEDMODE $ARGVALUE3
set BAUD_VALUE $ARGVALUE4
set PRG_BIT8 $ARGVALUE5
set PRG_PARITY $ARGVALUE6
set RX_LEGACY_MODE $ARGVALUE7
set USE_SOFT_FIFO $ARGVALUE8
// derived parameters
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 255
endif
// check for SX or RTSX or RTAXS
// and set FIFO depth accordingly
// (these 3 have soft FIFOs)
set cmp FAMILY == 8
if cmp
set FIFO_DEPTH 15
endif
set cmp FAMILY == 9
if cmp
set FIFO_DEPTH 15
endif
// set cmp FAMILY == 12
// if cmp
// set FIFO_DEPTH 15
// endif
//check for SmartFusion2 or Igloo2 or RTG4
//and set FIFO depth accordingly
set cmp FAMILY == 19
if cmp
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 127
endif
endif
set cmp FAMILY == 24
if cmp
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 127
endif
endif
set cmp FAMILY == 25
if cmp
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 127
endif
endif
//check for PolarFire
//and set FIFO depth accordingly
set cmp FAMILY == 26
if cmp
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 255
endif
endif
//check for ProASICplus
//and set FIFO depth accordingly
set cmp FAMILY == 14
if cmp
if USE_SOFT_FIFO
set FIFO_DEPTH 15
else
set FIFO_DEPTH 254
endif
endif
set BYTE_WAIT_TIME BAUD_VALUE * 250
set BYTE_WAIT_256 BYTE_WAIT_TIME * 256
set BYTE_WAIT_16 BYTE_WAIT_TIME * 16
set BYTE_WAIT_8 BYTE_WAIT_TIME * 8
set TIMEOUT_VAL BYTE_WAIT_256 + 1
timeout TIMEOUT_VAL
set PRINT_VARS 1
if PRINT_VARS
header " Begin printing variables from APB Master BFM Script ..."
print "FAMILY:%0d" FAMILY
print "TX_FIFO:%0d" TX_FIFO
print "RX_FIFO:%0d" RX_FIFO
print "FIXEDMODE:%0d" FIXEDMODE
print "BAUD_VALUE:%0d" BAUD_VALUE
print "PRG_BIT8:%0d" PRG_BIT8
print "PRG_PARITY:%0d" PRG_PARITY
print "RX_LEGACY_MODE:%0d" RX_LEGACY_MODE
print "FIFO_DEPTH:%0d" FIFO_DEPTH
header " Done printing variables from APB Master BFM Script."
header " "
endif
return
//---------------------------------------------------------------------------
// get bit number (bnum) from given wval integer
//---------------------------------------------------------------------------
procedure get_bit wval bnum
int d01
set d01 wval >> bnum
// set global BITVAR variable
set BITVAR d01 & 0x1
return
//---------------------------------------------------------------------------
// print line of underscores
//---------------------------------------------------------------------------
procedure pr_underscores
print "____________________________________________________________________"
print " "
return
//---------------------------------------------------------------------------
// test procedures
//---------------------------------------------------------------------------
procedure set_config dn pe p bv bn
int dut_num // 1 = RX(DUT2), 0 = TX(DUT1)
int par_en // 1 = enabled, 0 = disabled
int par // 1 = odd, 0 = even
int baud_val // 13-bit baud-value (split into 2 config registers)
int bit_num // 1 = 8 bits, 0 = 7 bits
// temp vars
int baud1
int baud2
int ctrl2_val
set dut_num dn
set par_en pe
set par p
set baud_val bv
set bit_num bn
print "Configuring UART:%0d with par_en:%0d parity:%0d baud_val:%0d bit_num:%0d" dut_num par_en par baud_val bit_num
// Set config regsiter data
set baud1 baud_val << 8 >> 8 // CONFIG REG 1
set baud2 baud_val >> 8 // CONFIG REG 2
set par par << 2
set par_en par_en << 1
set baud2 baud2 << 3
set ctrl2_val par
set ctrl2_val ctrl2_val | par_en
set ctrl2_val ctrl2_val | baud2
set ctrl2_val ctrl2_val | bit_num
// set base address based on DUT selected
if dut_num == 1
// write control registers
//print "Writing %0d to CTRL1 and %0d to CTRL2" baud1 ctrl2_val
write b BASE2 CTRL1 baud1
write b BASE2 CTRL2 ctrl2_val
else
// write control registers
//print "Writing %0d to CTRL1 and %0d to CTRL2" baud1 ctrl2_val
write b BASE1 CTRL1 baud1
write b BASE1 CTRL2 ctrl2_val
endif
return
procedure data_stream
call pr_underscores
print "Testing Continuous Data Stream UART1 to UART2"
set rc 0
loop tc 0 FIFO_DEPTH 1
//print "Sending byte %0d" tc
iowaitbit TXRDY1 1 // wait until TXRDY
set data tc & 0x7F // mask byte
//print "Got TXRDY %0d times" tc
write b BASE1 TXDATA data // transmit a byte
ifnot TX_FIFO
iowaitbit TXRDY1 0 // wait until TXRDY deasserted
endif
ifnot RX_FIFO // must read immediately
iowaitbit RXRDY2 1 // wait until RXRDY
//print "Receiving byte %0d" tc
readstore b BASE2 RXDATA rdata[rc] // read received byte
set rc rc + 1
endif
endloop
if RX_FIFO // test out FIFO operation
wait BYTE_WAIT_16 // wait for data to be received
loop rc 0 FIFO_DEPTH 1
iowaitbit RXRDY2 1 // wait until RXRDY
readstore b BASE2 RXDATA rdata[rc] // read received byte
endloop
endif
// check data
loop i 0 FIFO_DEPTH 1
set j i & 0x7F
if rdata[i] != j
call pr_underscores
print "TEST FAILED"
print "Expected %0d, got %0d" i rdata[i]
setfail
endif
endloop
print "Continuous data stream successfull"
call pr_underscores
return
procedure framing_err_test
call pr_underscores
print "Performing framing error test by setting input to DUT2 low"
// set the input to UART2 RX line low
// (no stop bit)
iowrite 0x01
wait BYTE_WAIT_16
ifnot RX_FIFO
// back to normal:
iowrite 0x00
wait BYTE_WAIT_16
readmask b BASE2 STA 0x10 0x10 // check for framing_err bit set
read b BASE2 RXDATA // doing a read should clear this
readmask b BASE2 STA 0x00 0x10 // check for framing_err bit cleared
else
readmask b BASE2 STA 0x10 0x10 // check for framing_err bit set
iowrite 0x00
// transmit a byte to clear the framing error
iowaitbit TXRDY1 1 // wait until TXRDY
write b BASE1 TXDATA 0xAA
wait BYTE_WAIT_16
readmask b BASE2 STA 0x00 0x10 // check for framing_err bit cleared
//loop i 0 FIFO_DEPTH 1 // probably caused an overflow,
readstore b BASE2 STA x // read status
set x x & 0x02
set cmp x == 2
while cmp
iowaitbit RXRDY2 1 // wait until RXRDY
read b BASE2 RXDATA // need to clear
iowaitbit RXRDY2 0 // wait until RXRDY clear
wait 4
readstore b BASE2 STA x // read status
set x x & 0x02
set cmp x == 2
endwhile
endif
wait 10
print "Framing error test completed"
call pr_underscores
return
procedure overflow_test
call pr_underscores
print "Overflow test"
if RX_FIFO
loop tc 0 FIFO_DEPTH 1
iowaitbit TXRDY1 1 // wait until TXRDY
set data tc & 0x7F // mask byte
write b BASE1 TXDATA data // transmit a byte
ifnot TX_FIFO
iowaitbit TXRDY1 0 // wait until TXRDY deasserted
endif
endloop
iowaitbit TXRDY1 1 // wait until TXRDY
wait BYTE_WAIT_256
iotstbit OVERFLOW2 0 // check that overflow not set
write b BASE1 TXDATA 0xab // transmit a byte (0xab)
wait BYTE_WAIT_256 // worst case: 3 blocks (BAUD_VAL=1)
wait BYTE_WAIT_256
wait BYTE_WAIT_256
iotstbit OVERFLOW2 1 // check that overflow set
// read RX data
loop rc 0 FIFO_DEPTH 1
if rc == 1
iotstbit OVERFLOW2 0 // check
endif
iowaitbit RXRDY2 1 // wait until RXRDY
readstore b BASE2 RXDATA rdata[rc] // read received byte
endloop
// check data
loop i 0 FIFO_DEPTH 1
set j i & 0x7F
if rdata[i] != j
call pr_underscores
print "TEST FAILED"
print "Expected %0d, got %0d" i rdata[i]
setfail
endif
endloop
endif
call pr_underscores
return
procedure parity_err_test
call pr_underscores
print "Performing Parity Error Test"
call set_config 0 1 0 1 1
call set_config 1 1 1 1 1
// -- transmit a byte --
iotstbit PARITY_ERR2 0 // check that parity error is 0
iowaitbit txrdy1 1 // wait until txrdy
write b base1 txdata 0xab // transmit a byte (0xab)
iowaitbit PARITY_ERR2 1 // check that parity error asserted
if RX_FIFO
iowaitbit PARITY_ERR2 0 // check that parity error deasserted
call set_config 0 1 1 1 1 // match parity
iowaitbit txrdy1 1 // wait until txrdy
write b base1 txdata 0xac // transmit a new byte (0xab)
iowaitbit RXRDY2 1 // read byte
iotstbit PARITY_ERR2 0 // check that parity error NOT asserted
readstore b BASE2 RXDATA x // store
if x != 0xac
call pr_underscores
print "TEST FAILED"
print "Expected 0xac, got %0h" x
setfail
endif
else
// NO RX_FIFO
// clear parity error
read b BASE2 RXDATA // read should clear
wait 4
iotstbit PARITY_ERR2 0 // the parity error
call set_config 0 1 1 1 1 // match parity
iowaitbit txrdy1 1 // wait until txrdy
write b base1 txdata 0xac // transmit a new byte (0xab)
iowaitbit RXRDY2 1 // read byte
iotstbit PARITY_ERR2 0 // check that parity error NOT asserted
readstore b BASE2 RXDATA x // store
if x != 0xac
call pr_underscores
print "TEST FAILED"
print "Expected 0xac, got %0h" x
setfail
endif
endif
print "Parity Error Test Complete"
call pr_underscores
return

View File

@@ -0,0 +1,46 @@
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate -divider APB
add wave -noupdate -format Logic /testbench/SYSCLK_apb
add wave -noupdate -format Logic /testbench/PCLK
add wave -noupdate -format Literal /testbench/PADDR
add wave -noupdate -format Logic /testbench/PENABLE
add wave -noupdate -format Literal /testbench/PRDATA
add wave -noupdate -format Literal /testbench/PRDATA1
add wave -noupdate -format Literal /testbench/PRDATA2
add wave -noupdate -format Logic /testbench/PRESETN
add wave -noupdate -format Logic /testbench/PSEL1
add wave -noupdate -format Logic /testbench/PSEL2
add wave -noupdate -format Literal /testbench/PWDATA
add wave -noupdate -format Logic /testbench/PWRITE
add wave -noupdate -divider {UART1 (TX)}
add wave -noupdate -format Logic /testbench/DUT1/TXRDY
add wave -noupdate -format Logic /testbench/DUT1/TX
add wave -noupdate -format Logic /testbench/DUT1/RXRDY
add wave -noupdate -format Logic /testbench/DUT1/RX
add wave -noupdate -format Logic /testbench/DUT1/PARITY_ERR
add wave -noupdate -format Logic /testbench/DUT1/OVERFLOW
add wave -noupdate -divider UART2(RX)
add wave -noupdate -format Logic /testbench/DUT2/TXRDY
add wave -noupdate -format Logic /testbench/DUT2/TX
add wave -noupdate -format Logic /testbench/DUT2/RXRDY
add wave -noupdate -format Logic /testbench/DUT2/RX
add wave -noupdate -format Logic /testbench/DUT2/PARITY_ERR
add wave -noupdate -format Logic /testbench/DUT2/OVERFLOW
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {553305200 ps} 0}
configure wave -namecolwidth 365
configure wave -valuecolwidth 120
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ns
update
WaveRestoreZoom {543429100 ps} {546721100 ps}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,399 @@
// Actel Corporation Proprietary and Confidential
// Copyright 2007 Actel Corporation. All rights reserved.
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
// Revision Information:
// SVN Revision Information:
// SVN $Revision: 6419 $
// SVN $Date: 2009-02-04 04:34:22 -0800 (Wed, 04 Feb 2009) $
`timescale 1ns/100ps
module
CoreUARTapb_0_CoreUARTapb_0_0_BFM_AHBSLAVE
(
HCLK
,
HRESETN
,
HSEL
,
HWRITE
,
HADDR
,
HWDATA
,
HRDATA
,
HREADYIN
,
HREADYOUT
,
HTRANS
,
HSIZE
,
HBURST
,
HMASTLOCK
,
HPROT
,
HRESP
)
;
parameter
AWIDTH
=
10
;
parameter
DEPTH
=
256
;
parameter
INITFILE
=
" "
;
parameter
ID
=
0
;
parameter
ENFUNC
=
0
;
parameter
TPD
=
1
;
parameter
DEBUG
=
-
1
;
localparam
ENFIFO
=
0
;
localparam
EXT_SIZE
=
2
;
input
HCLK
;
input
HRESETN
;
input
HSEL
;
input
HWRITE
;
input
[
AWIDTH
-
1
:
0
]
HADDR
;
input
[
31
:
0
]
HWDATA
;
output
[
31
:
0
]
HRDATA
;
input
HREADYIN
;
output
HREADYOUT
;
input
[
1
:
0
]
HTRANS
;
input
[
2
:
0
]
HSIZE
;
input
[
2
:
0
]
HBURST
;
input
HMASTLOCK
;
input
[
3
:
0
]
HPROT
;
output
HRESP
;
wire
EXT_EN
;
wire
EXT_WR
;
wire
EXT_RD
;
wire
[
AWIDTH
-
1
:
0
]
EXT_ADDR
;
wire
[
31
:
0
]
EXT_DATA
;
assign
EXT_EN
=
1
'b
0
;
assign
EXT_WR
=
1
'b
0
;
assign
EXT_RD
=
1
'b
0
;
assign
EXT_ADDR
=
0
;
assign
EXT_DATA
=
{
32
{
1
'b
z
}
}
;
CoreUARTapb_0_CoreUARTapb_0_0_BFM_AHBSLAVEEXT
#
(
.AWIDTH
(
AWIDTH
)
,
.DEPTH
(
DEPTH
)
,
.EXT_SIZE
(
EXT_SIZE
)
,
.INITFILE
(
INITFILE
)
,
.ID
(
ID
)
,
.ENFUNC
(
ENFUNC
)
,
.ENFIFO
(
ENFIFO
)
,
.TPD
(
TPD
)
,
.DEBUG
(
DEBUG
)
)
BFMA1OI1II
(
.HCLK
(
HCLK
)
,
.HRESETN
(
HRESETN
)
,
.HSEL
(
HSEL
)
,
.HWRITE
(
HWRITE
)
,
.HADDR
(
HADDR
)
,
.HWDATA
(
HWDATA
)
,
.HRDATA
(
HRDATA
)
,
.HREADYIN
(
HREADYIN
)
,
.HREADYOUT
(
HREADYOUT
)
,
.HTRANS
(
HTRANS
)
,
.HSIZE
(
HSIZE
)
,
.HBURST
(
HBURST
)
,
.HMASTLOCK
(
HMASTLOCK
)
,
.HPROT
(
HPROT
)
,
.HRESP
(
HRESP
)
,
.TXREADY
(
BFMA1II1II
)
,
.RXREADY
(
BFMA1II1II
)
,
.EXT_EN
(
EXT_EN
)
,
.EXT_WR
(
EXT_WR
)
,
.EXT_RD
(
EXT_RD
)
,
.EXT_ADDR
(
EXT_ADDR
)
,
.EXT_DATA
(
EXT_DATA
)
)
;
endmodule

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,816 @@
`timescale 1ns/100ps
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
// Revision Information:
// SVN Revision Information:
// SVN $Revision: 6419 $
// SVN $Date: 2009-02-04 04:34:22 -0800 (Wed, 04 Feb 2009) $
module
CoreUARTapb_0_CoreUARTapb_0_0_BFMA1l1OII
(
HCLK
,
HRESETN
,
HSEL
,
HWRITE
,
HADDR
,
HWDATA
,
HRDATA
,
HREADYIN
,
HREADYOUT
,
HTRANS
,
HSIZE
,
HBURST
,
HMASTLOCK
,
HPROT
,
HRESP
,
PSEL
,
PADDR
,
PWRITE
,
PENABLE
,
PWDATA
,
PRDATA
,
PREADY
,
PSLVERR
)
;
parameter
TPD
=
1
;
input
HCLK
;
input
HRESETN
;
input
HSEL
;
input
HWRITE
;
input
[
31
:
0
]
HADDR
;
input
[
31
:
0
]
HWDATA
;
output
[
31
:
0
]
HRDATA
;
wire
[
31
:
0
]
HRDATA
;
input
HREADYIN
;
output
HREADYOUT
;
wire
HREADYOUT
;
input
[
1
:
0
]
HTRANS
;
input
[
2
:
0
]
HSIZE
;
input
[
2
:
0
]
HBURST
;
input
HMASTLOCK
;
input
[
3
:
0
]
HPROT
;
output
HRESP
;
wire
HRESP
;
output
[
15
:
0
]
PSEL
;
wire
[
15
:
0
]
PSEL
;
output
[
31
:
0
]
PADDR
;
wire
[
31
:
0
]
PADDR
;
output
PWRITE
;
wire
PWRITE
;
output
PENABLE
;
wire
PENABLE
;
output
[
31
:
0
]
PWDATA
;
wire
[
31
:
0
]
PWDATA
;
input
[
31
:
0
]
PRDATA
;
input
PREADY
;
input
PSLVERR
;
parameter
[
1
:
0
]
BFMA1OOIII
=
0
;
parameter
[
1
:
0
]
BFMA1IOIII
=
1
;
parameter
[
1
:
0
]
BFMA1lOIII
=
2
;
parameter
[
1
:
0
]
BFMA1OIIII
=
3
;
reg
[
1
:
0
]
BFMA1IIIII
;
reg
BFMA1lIIII
;
reg
BFMA1OlIII
;
reg
[
15
:
0
]
BFMA1IlIII
;
reg
[
31
:
0
]
BFMA1llIII
;
reg
BFMA1O0III
;
reg
BFMA1I0III
;
reg
[
31
:
0
]
BFMA1l0III
;
wire
[
31
:
0
]
BFMA1O1III
;
reg
BFMA1I1III
;
reg
BFMA1l1III
;
always
@
(
posedge
HCLK
or
negedge
HRESETN
)
begin
if
(
HRESETN
==
1
'b
0
)
begin
BFMA1IIIII
<=
BFMA1OOIII
;
BFMA1lIIII
<=
1
'b
1
;
BFMA1llIII
<=
{
32
{
1
'b
0
}
}
;
BFMA1l0III
<=
{
32
{
1
'b
0
}
}
;
BFMA1O0III
<=
1
'b
0
;
BFMA1I0III
<=
1
'b
0
;
BFMA1OlIII
<=
1
'b
0
;
BFMA1I1III
<=
1
'b
0
;
BFMA1l1III
<=
1
'b
0
;
end
else
begin
BFMA1OlIII
<=
1
'b
0
;
BFMA1lIIII
<=
1
'b
0
;
BFMA1I1III
<=
1
'b
0
;
case
(
BFMA1IIIII
)
BFMA1OOIII
:
begin
if
(
HSEL
==
1
'b
1
&
HREADYIN
==
1
'b
1
&
(
HTRANS
[
1
]
)
==
1
'b
1
)
begin
BFMA1IIIII
<=
BFMA1IOIII
;
BFMA1llIII
<=
HADDR
;
BFMA1O0III
<=
HWRITE
;
BFMA1l0III
<=
HWDATA
;
BFMA1I0III
<=
1
'b
0
;
BFMA1I1III
<=
HWRITE
;
BFMA1l1III
<=
1
'b
1
;
end
else
begin
BFMA1lIIII
<=
1
'b
1
;
end
end
BFMA1IOIII
:
begin
BFMA1I0III
<=
1
'b
1
;
BFMA1IIIII
<=
BFMA1lOIII
;
end
BFMA1lOIII
:
begin
if
(
PREADY
==
1
'b
1
)
begin
BFMA1I0III
<=
1
'b
0
;
BFMA1l1III
<=
1
'b
0
;
if
(
PSLVERR
==
1
'b
0
)
begin
BFMA1IIIII
<=
BFMA1OOIII
;
if
(
HSEL
==
1
'b
1
&
HREADYIN
==
1
'b
1
&
(
HTRANS
[
1
]
)
==
1
'b
1
)
begin
BFMA1IIIII
<=
BFMA1IOIII
;
BFMA1llIII
<=
HADDR
;
BFMA1O0III
<=
HWRITE
;
BFMA1I1III
<=
HWRITE
;
BFMA1l1III
<=
1
'b
1
;
end
end
else
begin
BFMA1OlIII
<=
1
'b
1
;
BFMA1IIIII
<=
BFMA1OIIII
;
end
end
end
BFMA1OIIII
:
begin
BFMA1OlIII
<=
1
'b
1
;
BFMA1lIIII
<=
1
'b
1
;
BFMA1IIIII
<=
BFMA1OOIII
;
end
endcase
if
(
BFMA1I1III
==
1
'b
1
)
begin
BFMA1l0III
<=
HWDATA
;
end
end
end
always
@
(
BFMA1llIII
or
BFMA1l1III
)
begin
BFMA1IlIII
<=
{
16
{
1
'b
0
}
}
;
if
(
BFMA1l1III
==
1
'b
1
)
begin
begin
:
BFMA1IO10
integer
BFMA1I0I0
;
for
(
BFMA1I0I0
=
0
;
BFMA1I0I0
<=
15
;
BFMA1I0I0
=
BFMA1I0I0
+
1
)
begin
BFMA1IlIII
[
BFMA1I0I0
]
<=
(
BFMA1llIII
[
27
:
24
]
==
BFMA1I0I0
)
;
end
end
end
end
assign
BFMA1O1III
=
(
BFMA1I1III
==
1
'b
1
)
?
HWDATA
:
BFMA1l0III
;
assign
#
TPD
HRDATA
=
PRDATA
;
assign
#
TPD
HREADYOUT
=
BFMA1lIIII
|
(
PREADY
&
BFMA1l1III
&
BFMA1I0III
&
~
PSLVERR
)
;
assign
#
TPD
HRESP
=
BFMA1OlIII
;
assign
#
TPD
PSEL
=
BFMA1IlIII
;
assign
#
TPD
PADDR
=
BFMA1llIII
;
assign
#
TPD
PWRITE
=
BFMA1O0III
;
assign
#
TPD
PENABLE
=
BFMA1I0III
;
assign
#
TPD
PWDATA
=
BFMA1O1III
;
endmodule

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,788 @@
`timescale 1ns/100ps
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
// Revision Information:
// SVN Revision Information:
// SVN $Revision: 6419 $
// SVN $Date: 2009-02-04 04:34:22 -0800 (Wed, 04 Feb 2009) $
module
CoreUARTapb_0_CoreUARTapb_0_0_BFM_APB2APB
(
PCLK_PM
,
PRESETN_PM
,
PADDR_PM
,
PWRITE_PM
,
PENABLE_PM
,
PWDATA_PM
,
PRDATA_PM
,
PREADY_PM
,
PSLVERR_PM
,
PCLK_SC
,
PSEL_SC
,
PADDR_SC
,
PWRITE_SC
,
PENABLE_SC
,
PWDATA_SC
,
PRDATA_SC
,
PREADY_SC
,
PSLVERR_SC
)
;
parameter
[
9
:
0
]
TPD
=
1
;
localparam
BFMA1Il1
=
TPD
*
1
;
input
PCLK_PM
;
input
PRESETN_PM
;
input
[
31
:
0
]
PADDR_PM
;
input
PWRITE_PM
;
input
PENABLE_PM
;
input
[
31
:
0
]
PWDATA_PM
;
output
[
31
:
0
]
PRDATA_PM
;
reg
[
31
:
0
]
PRDATA_PM
;
output
PREADY_PM
;
reg
PREADY_PM
;
output
PSLVERR_PM
;
reg
PSLVERR_PM
;
input
PCLK_SC
;
output
[
15
:
0
]
PSEL_SC
;
wire
[
15
:
0
]
#
BFMA1Il1
PSEL_SC
;
output
[
31
:
0
]
PADDR_SC
;
wire
[
31
:
0
]
#
BFMA1Il1
PADDR_SC
;
output
PWRITE_SC
;
wire
#
BFMA1Il1
PWRITE_SC
;
output
PENABLE_SC
;
wire
#
BFMA1Il1
PENABLE_SC
;
output
[
31
:
0
]
PWDATA_SC
;
wire
[
31
:
0
]
#
BFMA1Il1
PWDATA_SC
;
input
[
31
:
0
]
PRDATA_SC
;
input
PREADY_SC
;
input
PSLVERR_SC
;
parameter
[
0
:
0
]
BFMA1OOlII
=
0
;
parameter
[
0
:
0
]
BFMA1IOlII
=
1
;
reg
[
0
:
0
]
BFMA1lOlII
;
parameter
[
1
:
0
]
BFMA1OOIII
=
0
;
parameter
[
1
:
0
]
BFMA1OIlII
=
1
;
parameter
[
1
:
0
]
BFMA1IOIII
=
2
;
reg
[
1
:
0
]
BFMA1IIlII
;
reg
[
15
:
0
]
BFMA1IlIII
;
reg
[
31
:
0
]
BFMA1llIII
;
reg
BFMA1O0III
;
reg
BFMA1I0III
;
reg
[
31
:
0
]
BFMA1l0III
;
reg
BFMA1l1III
;
reg
[
31
:
0
]
BFMA1lIlII
;
reg
BFMA1OllII
;
reg
BFMA1IllII
;
reg
BFMA1lllII
;
reg
BFMA1O0lII
;
always
@
(
posedge
PCLK_PM
or
negedge
PRESETN_PM
)
begin
if
(
PRESETN_PM
==
1
'b
0
)
begin
BFMA1lOlII
<=
BFMA1OOlII
;
BFMA1lllII
<=
1
'b
0
;
PREADY_PM
<=
1
'b
0
;
PSLVERR_PM
<=
1
'b
0
;
PRDATA_PM
<=
{
32
{
1
'b
0
}
}
;
BFMA1IllII
<=
1
'b
0
;
end
else
begin
PREADY_PM
<=
1
'b
0
;
BFMA1IllII
<=
PENABLE_PM
;
case
(
BFMA1lOlII
)
BFMA1OOlII
:
begin
if
(
PENABLE_PM
==
1
'b
1
&
BFMA1IllII
==
1
'b
0
)
begin
BFMA1lllII
<=
1
'b
1
;
BFMA1lOlII
<=
BFMA1IOlII
;
end
end
BFMA1IOlII
:
begin
if
(
BFMA1O0lII
==
1
'b
1
)
begin
BFMA1lOlII
<=
BFMA1OOlII
;
BFMA1lllII
<=
1
'b
0
;
PREADY_PM
<=
1
'b
1
;
PSLVERR_PM
<=
BFMA1OllII
;
PRDATA_PM
<=
BFMA1lIlII
;
end
end
endcase
end
end
always
@
(
posedge
PCLK_SC
or
negedge
BFMA1lllII
)
begin
if
(
BFMA1lllII
==
1
'b
0
)
begin
BFMA1IIlII
<=
BFMA1OOIII
;
BFMA1O0lII
<=
1
'b
0
;
BFMA1lIlII
<=
{
32
{
1
'b
0
}
}
;
BFMA1OllII
<=
1
'b
0
;
BFMA1l1III
<=
1
'b
0
;
BFMA1I0III
<=
1
'b
0
;
BFMA1llIII
<=
{
32
{
1
'b
0
}
}
;
BFMA1l0III
<=
{
32
{
1
'b
0
}
}
;
BFMA1O0III
<=
1
'b
0
;
end
else
begin
case
(
BFMA1IIlII
)
BFMA1OOIII
:
begin
BFMA1IIlII
<=
BFMA1OIlII
;
BFMA1llIII
<=
PADDR_PM
;
BFMA1l0III
<=
PWDATA_PM
;
BFMA1O0III
<=
PWRITE_PM
;
BFMA1l1III
<=
1
'b
1
;
BFMA1I0III
<=
1
'b
0
;
BFMA1O0lII
<=
1
'b
0
;
end
BFMA1OIlII
:
begin
BFMA1IIlII
<=
BFMA1IOIII
;
BFMA1I0III
<=
1
'b
1
;
end
BFMA1IOIII
:
begin
if
(
PREADY_SC
==
1
'b
1
)
begin
BFMA1O0lII
<=
1
'b
1
;
BFMA1lIlII
<=
PRDATA_SC
;
BFMA1OllII
<=
PSLVERR_SC
;
BFMA1l1III
<=
1
'b
0
;
BFMA1I0III
<=
1
'b
0
;
BFMA1llIII
<=
{
32
{
1
'b
0
}
}
;
BFMA1l0III
<=
{
32
{
1
'b
0
}
}
;
BFMA1O0III
<=
1
'b
0
;
end
end
endcase
end
end
always
@
(
BFMA1llIII
or
BFMA1l1III
)
begin
BFMA1IlIII
<=
{
16
{
1
'b
0
}
}
;
if
(
BFMA1l1III
==
1
'b
1
)
begin
begin
:
BFMA1I0lII
integer
BFMA1I0I0
;
for
(
BFMA1I0I0
=
0
;
BFMA1I0I0
<=
15
;
BFMA1I0I0
=
BFMA1I0I0
+
1
)
begin
BFMA1IlIII
[
BFMA1I0I0
]
<=
(
BFMA1llIII
[
27
:
24
]
==
BFMA1I0I0
)
;
end
end
end
end
assign
PSEL_SC
=
BFMA1IlIII
;
assign
PADDR_SC
=
BFMA1llIII
;
assign
PWRITE_SC
=
BFMA1O0III
;
assign
PENABLE_SC
=
BFMA1I0III
;
assign
PWDATA_SC
=
BFMA1l0III
;
endmodule

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,338 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: CoreUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
//
// Notes:
// best viewed with tabstops set to "4"
`define false 1'b 0
`define FALSE 1'b 0
`define true 1'b 1
`define TRUE 1'b 1
`timescale 1 ns / 1 ns // timescale for following modules
module CoreUARTapb_0_CoreUARTapb_0_0_Clock_gen (clk,
reset_n,
baud_val,
baud_clock,
xmit_pulse,
BAUD_VAL_FRACTION);
parameter BAUD_VAL_FRCTN_EN = 0;
parameter SYNC_RESET = 0;
input clk; // system clock
input reset_n; // active low async reset
input [12:0] baud_val; // value loaded into cntr
input [2:0] BAUD_VAL_FRACTION; // used to modify baud value when BAUD_VAL_FRCTN_EN = 1
output baud_clock; // 16x baud clock pulse
output xmit_pulse;
// transmit pulse
wire baud_clock;
wire xmit_pulse;
reg [12:0] baud_cntr; // 16x clock division counter reg.
reg baud_clock_int; // internal 16x baud clock pulse
reg xmit_clock;
// ------------------------------------------------
// generate a x16 baud clock pulse
// ------------------------------------------------
reg [3:0] xmit_cntr; // baud tx counter reg.
// ------------------------------------------------
// Sync/Async Reset Mode
// ------------------------------------------------
wire aresetn;
wire sresetn;
assign aresetn = (SYNC_RESET==1) ? 1'b1 : reset_n;
assign sresetn = (SYNC_RESET==1) ? reset_n : 1'b1;
generate
if(BAUD_VAL_FRCTN_EN == 1'b1)
begin
// Add one cycle 1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8 of the time by freezing
// baud_cntr for one cycle when count reaches 0 for certain xmit_cntr values.
// xmit_cntr values are identifed by looking for bits of this counter
// being certain combinations.
reg baud_cntr_one;
always @(posedge clk or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
baud_cntr_one <= 1'b0;
end
else
begin
if (baud_cntr == 13'b0000000000001)
begin
baud_cntr_one <= 1'b1;
end
else
begin
baud_cntr_one <= 1'b0;
end
end
end
always @(posedge clk or negedge aresetn)
begin : make_baud_cntr
if ((!aresetn) || (!sresetn))
begin
baud_cntr <= 13'b0000000000000;
baud_clock_int <= 1'b0;
end
else
begin
case(BAUD_VAL_FRACTION)
3'b000: begin
if (baud_cntr === 13'b0000000000000) //0
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
else
begin
baud_cntr <= baud_cntr - 1'b 1;
baud_clock_int <= 1'b0;
end
end
3'b001: begin
if (baud_cntr == 13'b0000000000000)
begin
if ((xmit_cntr[2:0] == 3'b111) && (baud_cntr_one == 1'b1)) //0.125
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b010:begin
if (baud_cntr == 13'b0000000000000)
begin
if ((xmit_cntr[1:0] == 2'b11) && (baud_cntr_one == 1'b1)) //0.25
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b011: begin
if (baud_cntr == 13'b0000000000000)
begin
if ((((xmit_cntr[2] == 1'b1) || (xmit_cntr[1] == 1'b1)) && (xmit_cntr[0] == 1'b1)) && (baud_cntr_one == 1'b1)) //0.375
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b100: begin
if (baud_cntr == 13'b0000000000000)
begin
if ((xmit_cntr[0] == 1'b1) && (baud_cntr_one == 1'b1)) //0.5
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b101: begin
if (baud_cntr == 13'b0000000000000)
begin
if ((((xmit_cntr[2] == 1'b1) && (xmit_cntr[1] == 1'b1)) || (xmit_cntr[0] == 1'b1)) && (baud_cntr_one == 1'b1)) //0.625
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b110: begin
if (baud_cntr == 13'b0000000000000)
begin
if (((xmit_cntr[1] == 1'b1) || (xmit_cntr[0] == 1'b1)) && (baud_cntr_one == 1'b1)) //0.75
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
3'b111: begin
if (baud_cntr == 13'b0000000000000)
begin
if ((((xmit_cntr[1] == 1'b1) || (xmit_cntr[0] == 1'b1)) || (xmit_cntr[2:0] == 3'b100)) && (baud_cntr_one == 1'b1)) //0.875
begin
baud_cntr <= baud_cntr;
baud_clock_int <= 1'b0;
end
else
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
end
else
begin
baud_cntr <= baud_cntr - 1'b1;
baud_clock_int <= 1'b0;
end
end
default: begin
if (baud_cntr === 13'b0000000000000)
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
else
begin
baud_cntr <= baud_cntr - 1'b 1;
baud_clock_int <= 1'b0;
end
end
endcase
end
end
end
else if(BAUD_VAL_FRCTN_EN == 1'b0)
begin
always @(posedge clk or negedge aresetn)
begin : make_baud_cntr
if ((!aresetn) || (!sresetn))
begin
baud_cntr <= 13'b0000000000000;
baud_clock_int <= 1'b0;
end
else
begin
if (baud_cntr === 13'b0000000000000)
begin
baud_cntr <= baud_val;
baud_clock_int <= 1'b1;
end
else
begin
baud_cntr <= baud_cntr - 1'b 1;
baud_clock_int <= 1'b0;
end
end
end
end
endgenerate
// --------------------------------------------------
// generate a transmit clock pulse
// --------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : make_xmit_clock
if ((!aresetn) || (!sresetn))
begin
xmit_cntr <= 4'b 0000;
xmit_clock <= 1'b 0;
end
else
begin
if (baud_clock_int === 1'b 1)
begin
xmit_cntr <= xmit_cntr + 1'b 1;
if (xmit_cntr === 4'b 1111)
begin
xmit_clock <= 1'b 1;
end
else
begin
xmit_clock <= 1'b 0;
end
end
end
end
assign xmit_pulse = xmit_clock & baud_clock_int;
assign baud_clock = baud_clock_int;
endmodule // module CoreUARTapb_0_CoreUARTapb_0_0_Clock_gen

View File

@@ -0,0 +1,494 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: COREUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
//
// Notes:
// best viewed with tabstops set to "4"
`timescale 1 ns / 1 ns // timescale for following modules
module CoreUARTapb_0_CoreUARTapb_0_0_COREUART (RESET_N,
CLK,
WEN,
OEN,
CSN,
DATA_IN,
RX,
BAUD_VAL,
BIT8,
PARITY_EN,
ODD_N_EVEN,
PARITY_ERR,
OVERFLOW,
TXRDY,
RXRDY,
DATA_OUT,
TX,
FRAMING_ERR,
BAUD_VAL_FRACTION
);
// TX Parameters
parameter TX_FIFO = 0; // 0=without tx fifo
// 1=with tx fifo
// RX Parameters
parameter RX_FIFO = 0; // 0=without rx fifo
// 1=with rx fifo
parameter RX_LEGACY_MODE = 0;
// DEVICE FAMILY
parameter FAMILY = 15;
//Baud Fraction Enable
parameter BAUD_VAL_FRCTN_EN = 0; // 1 = enable baud fraction, 0 = disable baud fraction
// Sync/Async Parameter
parameter SYNC_RESET = (FAMILY == 25) ? 1 : 0; // Sync/Async Resets selected by family parameter
input RESET_N;
input CLK;
input WEN;
input OEN;
input CSN;
input [7:0] DATA_IN;
input RX;
input [12:0] BAUD_VAL;
input BIT8; // if set to one 8 data bits otherwise 7 data bits
input PARITY_EN; // if set to one parity is enabled otherwise disabled
input ODD_N_EVEN; // if set to one odd parity otherwise even parity
input [2:0] BAUD_VAL_FRACTION; // used to add extra precision to baud value when BAUD_VAL_FRCTN_EN = 1
output PARITY_ERR; // parity error indicator on recieved data
output OVERFLOW; // receiver overflow
output TXRDY; // transmit ready for another byte
output RXRDY; // receiver has a byte ready
output [7:0] DATA_OUT;
output TX;
output FRAMING_ERR;
// State name constant definitions
`define S0 2'b00
`define S1 2'b01
`define S2 2'b10
`define S3 2'b11
// Configuration bits
// Status bits
wire PARITY_ERR;
wire FRAMING_ERR;
wire OVERFLOW;
wire overflow_legacy;
wire TXRDY;
reg RXRDY;
wire receive_full;
wire fifo_write_rx;
wire fifo_write;
reg [7:0] DATA_OUT;
wire TX;
wire xmit_pulse; // transmit pulse
wire baud_clock; // 8x baud clock pulse
wire rst_tx_empty; // reset transmit empty
reg [7:0] tx_hold_reg; // transmit byte hold register
wire [7:0] tx_dout_reg; // transmit byte hold register
wire [7:0] rx_dout; // receive data out
wire read_rx_byte; // read rx byte register
reg [7:0] rx_dout_reg; // receive data out
wire [7:0] rx_byte; // receive byte register
wire [7:0] rx_byte_in; // receive byte register
wire fifo_empty_tx;
wire fifo_empty_rx;
reg fifo_read_rx;
reg fifo_write_tx;
wire fifo_read_tx;
wire fifo_full_tx;
wire fifo_full_rx;
wire clear_parity;
wire clear_framing_error;
wire clear_parity_en;
reg clear_parity_reg0;
reg clear_parity_reg;
// AS, added framing error self-clear mechanism (RX FIFO mode)
wire clear_framing_error_en;
reg clear_framing_error_reg0;
reg clear_framing_error_reg;
reg data_en;
reg data_ready;
reg rx_dout_reg_empty;
reg rx_dout_reg_empty_q;
reg [1:0] rx_state;
reg [1:0] next_rx_state;
// Added by AS, enable signal for sync'ing:
wire stop_strobe;
wire rx_idle;
reg overflow_reg;
wire clear_overflow;
// TS, sync/async mode select
wire aresetn;
wire sresetn;
assign aresetn = (SYNC_RESET==1) ? 1'b1 : RESET_N;
assign sresetn = (SYNC_RESET==1) ? RESET_N : 1'b1;
// ----------------------------------------------------------------------------
// Transmit related code
// ----------------------------------------------------------------------------
always @(posedge CLK or negedge aresetn)
begin : reg_write
if ((!aresetn) || (!sresetn))
begin
tx_hold_reg <= {8{1'b0}};
fifo_write_tx <= 1'b1;
end
else
begin
fifo_write_tx <= 1'b1;
if (CSN == 1'b0 & WEN == 1'b0)
begin
tx_hold_reg <= DATA_IN;
fifo_write_tx <= 1'b0;
end
end
end
assign rst_tx_empty = WEN == 1'b0 & CSN == 1'b0 ? 1'b1 : 1'b0;
// ----------------------------------------------------------------------------
// Receive related code
// ----------------------------------------------------------------------------
// Added by Hari
// Modified Sep 2006, ROK
always @(rx_byte or rx_dout_reg or PARITY_ERR)
begin
if (RX_FIFO == 1'b0)
begin
DATA_OUT = rx_byte;
end
else
begin
if (PARITY_ERR == 1'b1)
begin
DATA_OUT = rx_byte;
end
else
begin
DATA_OUT = rx_dout_reg;
end
end
end
assign read_rx_byte = (RX_FIFO == 1'b0) ? ((CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : 1'b0) : !fifo_full_rx;
assign clear_parity = (RX_FIFO == 1'b0) ?
((CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : 1'b0) : clear_parity_reg;
//assign clear_framing_error = (RX_FIFO == 1'b0) ? ((CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : 1'b0) : clear_framing_error_reg;
assign clear_framing_error = (RX_FIFO == 1'b0) ? ((CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : 1'b0) :((CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : clear_framing_error_reg) ;
assign clear_overflow = (CSN == 1'b0 & OEN == 1'b0) ? 1'b1 : 1'b0;
assign rx_byte_in = (PARITY_ERR == 1'b0) ? rx_byte : 8'b0;
generate
if (RX_LEGACY_MODE == 1'b1)
begin
always @ (receive_full or rx_dout_reg_empty)
begin
if (RX_FIFO == 1'b0)
begin
RXRDY = receive_full;
end
else
begin
RXRDY = !rx_dout_reg_empty;
end
end
end
else // sync to stop_strobe (stop bit and framing error)
begin
// always @ (receive_full or rx_dout_reg_empty or stop_strobe)
always @ (posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn)) begin
RXRDY <= 1'b0;
end
else begin
if (RX_FIFO == 1'b0)
begin
if (stop_strobe == 1'b1 || receive_full == 1'b0)
begin
RXRDY <= receive_full;
end
end
else
begin
// AS: filter out single clock cycle empty flag (might just be reading
// from fifo, waiting for next data byte
// if (stop_strobe == 1'b1 || (rx_dout_reg_empty == 1'b1))
if (stop_strobe == 1'b1 || (rx_dout_reg_empty == 1'b1) || ((rx_dout_reg_empty == 1'b0) && (rx_idle == 1'b1 || RX_FIFO==1)))
begin
RXRDY <= !rx_dout_reg_empty;
end
end
end
end // end process
end // RX_LEGACY_MODE == 0
endgenerate
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
clear_parity_reg <= 1'b0;
clear_parity_reg0 <= 1'b0;
end
else
begin
clear_parity_reg0 <= clear_parity_en;
clear_parity_reg <= clear_parity_reg0;
end
end
// AS: added self-clearing framing error
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
clear_framing_error_reg <= 1'b0;
clear_framing_error_reg0 <= 1'b0;
end
else
begin
clear_framing_error_reg0 <= clear_framing_error_en;
clear_framing_error_reg <= clear_framing_error_reg0;
end
end
// state machine to control reading from the rx fifo
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
rx_state <= `S0;
end
else
begin
rx_state <= next_rx_state;
end
end
always @(rx_state, rx_dout_reg_empty, fifo_empty_rx)
begin
next_rx_state = rx_state;
fifo_read_rx = 1'b1;
data_en = 1'b0;
case (rx_state)
`S0 : if (rx_dout_reg_empty == 1'b1 && fifo_empty_rx == 1'b0)
begin
next_rx_state = `S1;
fifo_read_rx = 1'b0; // active low
end
`S1 : next_rx_state = `S2;
`S2 : next_rx_state = `S3;
`S3 : begin
next_rx_state = `S0;
data_en = 1'b1;
end
endcase
end
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
rx_dout_reg <= {8{1'b0}};
end
else
begin
if (data_en == 1'b1)
begin
rx_dout_reg <= rx_dout;
end
end
end
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
rx_dout_reg_empty <= 1'b1;
rx_dout_reg_empty_q <= 1'b1;
end
else
begin
if (data_en == 1'b1)
begin
rx_dout_reg_empty <= 1'b0;
end
else
begin
if (CSN == 1'b0 && OEN == 1'b0)
begin
if(RX_FIFO == 1)
begin
if(!PARITY_ERR)
begin
rx_dout_reg_empty <= 1'b1;
end
end
else
begin
rx_dout_reg_empty <= 1'b1;
end
end
end
rx_dout_reg_empty_q <= rx_dout_reg_empty;
end
end
// AS: Added OVERFLOW logic (see below)
always @(posedge CLK or negedge aresetn)
begin
if ((!aresetn) || (!sresetn))
begin
overflow_reg <= 1'b0;
end
else
begin
// Note: received byte will happen before OVERFLOW clear
if (fifo_write == 1'b0 && fifo_full_rx == 1'b1)
overflow_reg <= 1'b1;
else if (clear_overflow == 1'b1)
overflow_reg <= 1'b0;
else
overflow_reg <= overflow_reg;
end
end
// AS: Changed OVERFLOW condition
// - We should not be assigning OVERFLOW to FIFO_FULL;
// instead, we should be asserting OVERFLOW if a write is
// requested while fifo_full_rx is high
//assign OVERFLOW = (RX_FIFO == 1'b0) ? overflow_legacy : fifo_full_rx;
assign OVERFLOW = (RX_FIFO == 1'b0) ? overflow_legacy : overflow_reg;
// AS: 16Jun09
// Added FRAMING_ERR to write condition for RX FIFO (removed)
// AS: 24Jun09
// Added OVERFLOW error condition: don't write when OVERFLOW is asserted
assign fifo_write_rx = ((PARITY_ERR == 1'b1) || fifo_full_rx == 1'b1) ? 1'b1 : fifo_write;
// ---------------------------------------------------------
// COMPONENT DECLARATIONS
// ---------------------------------------------------------
CoreUARTapb_0_CoreUARTapb_0_0_Clock_gen #(.BAUD_VAL_FRCTN_EN(BAUD_VAL_FRCTN_EN),
.SYNC_RESET(SYNC_RESET)
) make_CLOCK_GEN ( .clk(CLK),
.reset_n(RESET_N),
.baud_val(BAUD_VAL),
.baud_clock(baud_clock),
.xmit_pulse(xmit_pulse),
.BAUD_VAL_FRACTION(BAUD_VAL_FRACTION)
);
CoreUARTapb_0_CoreUARTapb_0_0_Tx_async #( .TX_FIFO(TX_FIFO),
.SYNC_RESET(SYNC_RESET)
) make_TX (.clk(CLK),
.xmit_pulse(xmit_pulse),
.reset_n(RESET_N),
.rst_tx_empty(rst_tx_empty),
.tx_hold_reg(tx_hold_reg),
.tx_dout_reg(tx_dout_reg),
.fifo_empty(fifo_empty_tx),
.fifo_full(fifo_full_tx),
.bit8(BIT8),
.parity_en(PARITY_EN),
.odd_n_even(ODD_N_EVEN),
.txrdy(TXRDY),
.tx(TX),
.fifo_read_tx(fifo_read_tx)
);
CoreUARTapb_0_CoreUARTapb_0_0_Rx_async #( .RX_FIFO(RX_FIFO),
.SYNC_RESET(SYNC_RESET)
) make_RX ( .clk(CLK),
.baud_clock(baud_clock),
.reset_n(RESET_N),
.bit8(BIT8),
.parity_en(PARITY_EN),
.odd_n_even(ODD_N_EVEN),
.read_rx_byte(read_rx_byte),
.clear_parity(clear_parity),
.framing_error(FRAMING_ERR),
.clear_framing_error(clear_framing_error),
.stop_strobe(stop_strobe),
.rx_idle(rx_idle),
.rx(RX),
.overflow(overflow_legacy),
.parity_err(PARITY_ERR),
.clear_parity_en(clear_parity_en),
.clear_framing_error_en(clear_framing_error_en),
.receive_full(receive_full),
.rx_byte(rx_byte),
.fifo_write(fifo_write)
);
generate
if (TX_FIFO == 1'b1)
begin
CoreUARTapb_0_CoreUARTapb_0_0_fifo_256x8 #(.SYNC_RESET(SYNC_RESET)) tx_fifo (.DO(tx_dout_reg), .RCLOCK(CLK), .WCLOCK(CLK), .DI(tx_hold_reg), .WRB(fifo_write_tx), .RDB(fifo_read_tx),
.RESET(RESET_N), .FULL(fifo_full_tx), .EMPTY(fifo_empty_tx));
end
else
begin
assign fifo_full_tx = 1'b0;
assign fifo_empty_tx = 1'b0;
assign tx_dout_reg = 8'b0;
end
endgenerate
generate
if (RX_FIFO == 1'b1)
begin
CoreUARTapb_0_CoreUARTapb_0_0_fifo_256x8 #(.SYNC_RESET(SYNC_RESET)) rx_fifo (.DO(rx_dout), .RCLOCK(CLK), .WCLOCK(CLK), .DI(rx_byte_in), .WRB(fifo_write_rx), .RDB(fifo_read_rx),
.RESET(RESET_N), .FULL(fifo_full_rx), .EMPTY(fifo_empty_rx));
end
else
begin
assign fifo_full_rx = 1'b0;
assign fifo_empty_rx = 1'b0;
assign rx_dout = 8'b0;
end
endgenerate
endmodule // module UART

View File

@@ -0,0 +1,360 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: COREUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
// 22093 4Sep10 AS Added PSLVERR and PREADY, missing APB3 signals
// (unused)
//
// Notes:
// best viewed with tabstops set to "4"
//
//
//
//==============================================================================
// AMBA APB wrapped COREUART
//
// Three control registers and one status register are implemented in this file
// i.e. at the wrapper level.
// Transmit and receive data registers are located in the UART module which is
// instantiated in this file.
//
// A separate word location is used for each (8-bit) register.
//
//
// Address Map:
//
// Offset Register Name Read/Write Width
// -------------------------------------------------------
// 0x00 Transmit data (Write only) 8 bits
// 0x04 Receive data (Read only) 8 bits
// 0x08 Control Register 1 (R/W) 8 bits
// 0x0C Control Register 2 (R/W) 8 bits
// 0x10 Status Register (Read Only) 4 bits
// 0x14 Control Register 3 (R/W) 3 bits
//==============================================================================
`timescale 1 ns / 1 ns
module CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb (
// APB interface
PCLK,
PRESETN,
PADDR,
PSEL,
PENABLE,
PWRITE,
PWDATA,
PRDATA,
// AS: Added PREADY and PSLVERR
PREADY,
PSLVERR,
// transmit-ready and receive-full indicators
TXRDY,
RXRDY,
// Flags
PARITY_ERR,
FRAMING_ERR,
OVERFLOW,
// Serial receive and transmit
RX,
TX
);
// DEVICE FAMILY
parameter FAMILY = 15;
// UART configuration parameters
parameter TX_FIFO = 0; // 1 = with tx fifo, 0 = without tx fifo
parameter RX_FIFO = 0; // 1 = with rx fifo, 0 = without rx fifo
parameter BAUD_VALUE = 0; // Baud value is set only when fixed buad rate is selected
parameter FIXEDMODE = 0; // fixed or programmable mode, 0: programmable; 1:fixed
parameter PRG_BIT8 = 0; // This bit value is selected only when FIXEDMODE is set to 1
parameter PRG_PARITY = 0; // This bit value is selected only when FIXEDMODE is set to 1
parameter RX_LEGACY_MODE = 0; // legacy mode for RXRDY signal operation
parameter BAUD_VAL_FRCTN = 0; // 0 = +0.0, 1 = +0.125, 2 = +0.25, 3 = +0.375, 4 = +0.5, 5 = +0.625, 6 = +0.75, 7 = +0.875,
parameter BAUD_VAL_FRCTN_EN = 0; // 1 = enable baudval fraction, 0 = disable baudval fraction
parameter SYNC_RESET = (FAMILY == 25) ? 1 : 0; // Sync/Async Resets selected by family parameter
// Inputs and Outputs
// APB signals
input PCLK; // APB system clock
input PRESETN; // APB system reset
input [4:0] PADDR; // Address
input PSEL; // Peripheral select signal
input PENABLE; // Enable (data valid strobe)
input PWRITE; // Write/nRead signal
input [7:0] PWDATA; // 8 bit write data
output [7:0] PRDATA; // 8 bit read data
output PREADY;
output PSLVERR;
// transmit ready and receive full indicators
output TXRDY;
output RXRDY;
// Serial receive and transmit data
input RX;
output TX;
// FLAGS
output FRAMING_ERR;
output PARITY_ERR;
output OVERFLOW;
//----------------------------------------------------------------------
// Constant declarations
//----------------------------------------------------------------------
`define UARTTXDATAA 3'b000
`define UARTRXDATAA 3'b001
`define UARTCTRLREG1A 3'b010
`define UARTCTRLREG2A 3'b011
`define UARTSTATUSREGA 3'b100
`define UARTCTRLREG3A 3'b101
//----------------------------------------------------------------------
// Signal declarations
//----------------------------------------------------------------------
// I/O signals
wire PCLK;
wire PRESETN;
wire [4:0] PADDR;
wire PSEL;
wire PENABLE;
wire PWRITE;
wire [7:0] PWDATA;
wire [7:0] PRDATA;
wire TXRDY;
wire RXRDY;
wire RX;
wire TX;
wire PREADY;
wire PSLVERR;
// Internal signals
reg [7:0] controlReg1;
reg [7:0] controlReg2;
reg [2:0] controlReg3;
reg [7:0] NxtPrdata;
reg [7:0] iPRDATA;
wire NxtPrdataEn; // valid read
wire [7:0] data_in;
wire [7:0] data_out;
wire [12:0] baud_val;
wire bit8;
wire parity_en;
wire odd_n_even;
wire WEn;
wire OEn;
wire csn;
wire OVERFLOW;
wire PARITY_ERR;
wire [1:0] gen_parity_en;
wire prg_parity_en;
wire prg_odd_even;
wire FRAMING_ERR;
wire [2:0] fixed_baudval_fraction;
wire [2:0] baudval_fraction;
wire aresetn;
wire sresetn;
assign aresetn = (SYNC_RESET==1) ? 1'b1 : PRESETN;
assign sresetn = (SYNC_RESET==1) ? PRESETN : 1'b1;
// AS: Added APB3 signals, tied off
assign PREADY = 1'b1;
assign PSLVERR = 1'b0;
//----------------------------------------------------------------------
// Write enable, output enable and select signals for UART
//----------------------------------------------------------------------
// WEn only asserted (low) when writing transmit data
assign WEn = !(PENABLE && PWRITE && (PADDR[4:2] == `UARTTXDATAA));
// OEn only asserted (low) when reading received data
assign OEn = !(PENABLE && !PWRITE && (PADDR[4:2] == `UARTRXDATAA));
assign csn = !PSEL;
// data_in input to UART is used for transmit data
assign data_in = PWDATA;
//----------------------------------------------------------------------
// APB read data
//----------------------------------------------------------------------
// NxtPrdataEn is asserted during the first cycle of a valid read
assign NxtPrdataEn = (PSEL & !PWRITE & (!PENABLE || PARITY_ERR));
always @(PADDR or NxtPrdataEn or iPRDATA or data_out or controlReg1
or controlReg2 or OVERFLOW or PARITY_ERR or RXRDY
or TXRDY or FRAMING_ERR or controlReg3)
begin : p_NxtPrdataComb
if (NxtPrdataEn)
case (PADDR[4:2])
`UARTTXDATAA : NxtPrdata = 8'b0; // transmit data location reads as 0x00
`UARTRXDATAA : NxtPrdata = data_out; // received data
`UARTCTRLREG1A : NxtPrdata = controlReg1; // control reg 1 - baud value
`UARTCTRLREG2A : NxtPrdata = controlReg2; // control reg 2 - bit8, parity_en, odd_n_even
`UARTSTATUSREGA : NxtPrdata = {3'b0, FRAMING_ERR, OVERFLOW, PARITY_ERR, RXRDY, TXRDY}; // status register
`UARTCTRLREG3A : NxtPrdata = {5'b0, controlReg3}; // control reg 3 - fractional part of baud value
default : NxtPrdata = iPRDATA;
endcase
else
NxtPrdata = iPRDATA;
end // block: p_NxtPrdataComb
assign gen_parity_en = PRG_PARITY;
// AS, fixed 01DEC08:
//assign prg_parity_en = (gen_parity_en == (2'd1 || 2'd2)) ? 1'b1 : 1'b0;
assign prg_parity_en = (gen_parity_en == 2'd1 || gen_parity_en == 2'd2) ? 1'b1 : 1'b0;
assign prg_odd_even = (gen_parity_en == 2'd1) ? 1'b1 : 1'b0;
// PRDATA output register
always @ (posedge PCLK or negedge aresetn)
begin : p_iPRDATASeq
if ((!aresetn) || (!sresetn))
iPRDATA <= 8'b0;
else
iPRDATA <= NxtPrdata;
end // block: p_iPRDATASeq
// Drive output with internal version.
assign PRDATA = ((RX_FIFO == 1) && (PARITY_ERR == 1'b1)) ? data_out : iPRDATA;
//----------------------------------------------------------------------
// Control register 1
// Holds 8-bit value to set baud rate.
//----------------------------------------------------------------------
always @(posedge PCLK or negedge aresetn)
begin : p_CtrlReg1Seq
if((!aresetn) || (!sresetn))
controlReg1 <= 8'b0;
else
if (PSEL && PENABLE && PWRITE && (PADDR[4:2] == `UARTCTRLREG1A))
controlReg1 <= PWDATA;
else
controlReg1 <= controlReg1;
end // block: p_CtrlReg1Seq
assign baud_val = FIXEDMODE ? BAUD_VALUE:{controlReg2[7:3],controlReg1};
//----------------------------------------------------------------------
// Control register 2
// Contents as follows:
// Bit 0: bit8 Data width is 8 bits when '1', 7 bits otherwise.
// Bit 1: parity_en Parity enabled when '1'.
// Bit 2: odd_n_even Odd parity when '1', even parity when '0'.
// Bits 3 to 7: Unused.
//----------------------------------------------------------------------
always @(posedge PCLK or negedge aresetn)
begin : p_CtrlReg2Seq
if ((!aresetn) || (!sresetn))
controlReg2 <= 8'b0;
else
if (PSEL && PENABLE && PWRITE && (PADDR[4:2] == `UARTCTRLREG2A))
controlReg2 <= PWDATA[7:0];
else
controlReg2 <= controlReg2;
end // block: p_CtrlReg2Seq
//----------------------------------------------------------------------
// Control register 3
// Controls the fractional baud value as follows:
// 000: Baud Value = baud_val + 0.0
// 001: Baud Value = baud_val + 0.125
// 010: Baud Value = baud_val + 0.25
// 011: Baud Value = baud_val + 0.375
// 100: Baud Value = baud_val + 0.5
// 101: Baud Value = baud_val + 0.625
// 110: Baud Value = baud_val + 0.75
// 111: Baud Value = baud_val + 0.875
//----------------------------------------------------------------------
generate
if(BAUD_VAL_FRCTN_EN == 1)
begin
always @(posedge PCLK or negedge aresetn)
begin : p_CtrlReg3Seq
if ((!aresetn) || (!sresetn))
controlReg3 <= 3'b0;
else
if (PSEL && PENABLE && PWRITE && (PADDR[4:2] == `UARTCTRLREG3A))
controlReg3 <= PWDATA[2:0];
else
controlReg3 <= controlReg3;
end //block: p_CtrlReg3Seq
end
endgenerate
assign fixed_baudval_fraction = (BAUD_VAL_FRCTN == 0) ? 3'b000 :
(BAUD_VAL_FRCTN == 1) ? 3'b001 :
(BAUD_VAL_FRCTN == 2) ? 3'b010 :
(BAUD_VAL_FRCTN == 3) ? 3'b011 :
(BAUD_VAL_FRCTN == 4) ? 3'b100 :
(BAUD_VAL_FRCTN == 5) ? 3'b101 :
(BAUD_VAL_FRCTN == 6) ? 3'b110 :
(BAUD_VAL_FRCTN == 7) ? 3'b111 : 3'b000;
assign bit8 = FIXEDMODE ? PRG_BIT8:controlReg2[0];
assign parity_en = FIXEDMODE ? prg_parity_en:controlReg2[1];
assign odd_n_even = FIXEDMODE ? prg_odd_even:controlReg2[2];
assign baudval_fraction = FIXEDMODE ? fixed_baudval_fraction : BAUD_VAL_FRCTN_EN ? controlReg3 : 3'b000;
//----------------------------------------------------------------------
// Instantiation of UART
//----------------------------------------------------------------------
CoreUARTapb_0_CoreUARTapb_0_0_COREUART
#(
.TX_FIFO (TX_FIFO),
.RX_FIFO (RX_FIFO),
.RX_LEGACY_MODE(RX_LEGACY_MODE),
.BAUD_VAL_FRCTN_EN(BAUD_VAL_FRCTN_EN),
.FAMILY(FAMILY)
)
uUART (
.RESET_N (PRESETN),
.CLK (PCLK),
.WEN (WEn),
.OEN (OEn),
.CSN (csn),
.DATA_IN (data_in),
.RX (RX),
.BAUD_VAL (baud_val),
.BIT8 (bit8),
.PARITY_EN (parity_en),
.ODD_N_EVEN (odd_n_even),
.FRAMING_ERR (FRAMING_ERR),
.PARITY_ERR (PARITY_ERR),
.OVERFLOW (OVERFLOW),
.TXRDY (TXRDY),
.RXRDY (RXRDY),
.DATA_OUT (data_out),
.TX (TX),
.BAUD_VAL_FRACTION (baudval_fraction)
);
endmodule
// ============================== End ==========================================

View File

@@ -0,0 +1,588 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: CoreUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
//
// Notes:
// best viewed with tabstops set to "4"
`timescale 1 ns / 1 ns // timescale for following modules
module CoreUARTapb_0_CoreUARTapb_0_0_Rx_async (clk,
baud_clock,
reset_n,
bit8,
parity_en,
odd_n_even,
read_rx_byte,
clear_parity,
rx,
overflow,
parity_err,
clear_parity_en,
receive_full,
rx_byte,
fifo_write,
framing_error,
clear_framing_error,
clear_framing_error_en,
stop_strobe,
rx_idle
);
parameter SYNC_RESET = 0;
// RX Parameters
parameter RX_FIFO = 0; // 0=without rx fifo, 1=with rx fifo
// TYPE receive_states:
parameter receive_states_rx_idle = 0;
parameter receive_states_rx_data_bits = 1;
parameter receive_states_rx_stop_bit = 2;
parameter receive_states_rx_wait_state = 3;
input clk; // system clock
input baud_clock; // 8x baud clock pulse
input reset_n; // active low async reset
input bit8; // if set to one 8 data bits otherwise 7 data bits
input parity_en; // if set to one parity is enabled otherwise disabled
input odd_n_even; // if set to one odd parity otherwise even parity
input read_rx_byte; // read rx byte register
input clear_parity; // clear parity error
input clear_framing_error; // clear framing error signal (AS)
input rx;
output overflow; // receiver overflow
output parity_err; // parity error indicator on recieved data
output clear_parity_en; // clear parity error enable
output receive_full; // receiver has a byte ready
output [7:0] rx_byte;
output fifo_write;
output framing_error; // stop bit not detected flag (AS)
output clear_framing_error_en; // clear framing error enable (AS)
output stop_strobe; // stop bit strobe (for RX legacy mode) (AS)
// AS: added idle wire for framing_err assigmnet using
// stop_strobe
output rx_idle;
reg framing_error; // stop bit not detected flag (AS)
reg stop_strobe; // stop bit strobe (for RX legacy mode) (AS)
reg overflow;
reg parity_err;
reg fifo_write;
// receive byte register
wire receive_full;
reg [7:0] rx_byte;
reg [1:0] rx_state; // receive state machine
reg [3:0] receive_count; // counts bits received
reg rx_filtered; // filtered rx data
reg [8:0] rx_shift; // receive shift register
reg rx_parity_calc; // received parity, calculated
reg [3:0] rx_bit_cnt; // count of received bits
reg receive_full_int; // receiver has a byte ready
reg [2:0] samples;
reg overflow_int;
reg framing_error_int; // internal framing error bit (AS)
reg clear_parity_en;
reg clear_framing_error_en; // clear framing error enable (AS)
reg [3:0] last_bit;
wire [1:0] shift_choice;
wire [1:0] parity_choice;
// ----------------------------------------------------------------------------
wire aresetn;
wire sresetn;
assign aresetn = (SYNC_RESET==1) ? 1'b1 : reset_n;
assign sresetn = (SYNC_RESET==1) ? reset_n : 1'b1;
// filter the receive data
// ----------------------------------------------------------------------------
// The receive data filter is a simple majority voter that accepts three
// samples of the "raw" data and reports the most populus result. This
// provides a simple single-cycle glitch filter.
// This input needs to go to both the state machine start bit detector as
// well as the data shift register as this filter introduces a three-clock
// delay and we need to keep the phases lined up.
//
always @(posedge clk or negedge aresetn)
begin : majority
if ((!aresetn) || (!sresetn))
begin
samples <= 3'b111;
end
else
begin
if (baud_clock == 1'b1)
begin
samples[1:0] <= samples[2:1];
samples[2] <= rx;
end
end
end
// our voter
always @(samples)
begin
case (samples)
3'b000:
begin
rx_filtered <= 1'b0;
end
3'b001:
begin
rx_filtered <= 1'b0;
end
3'b010:
begin
rx_filtered <= 1'b0;
end
3'b011:
begin
rx_filtered <= 1'b1;
end
3'b100:
begin
rx_filtered <= 1'b0;
end
3'b101:
begin
rx_filtered <= 1'b1;
end
3'b110:
begin
rx_filtered <= 1'b1;
end
default:
begin
rx_filtered <= 1'b1;
end
endcase
end
// ----------------------------------------------------------------------------
// receive bit counter
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : rcv_cnt
if ((!aresetn) || (!sresetn))
begin
receive_count <= 4'b0000;
end
else
begin
// no start bit yet or begin sample period for data
if (baud_clock == 1'b1)
begin
if ((rx_state == receive_states_rx_idle & (rx_filtered == 1'b1 | receive_count == 4'b1000)) || ((rx_state == receive_states_rx_wait_state) && (receive_count == 4'b0110)))
begin
receive_count <= 4'b0000;
end
else
begin
receive_count <= receive_count + 1'b1;
end
end
end
end
// ----------------------------------------------------------------------------
// registering of the overflow signal
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : make_overflow
if ((!aresetn) || (!sresetn))
begin
overflow <= 1'b0;
end
else
begin
if (baud_clock == 1'b1)
begin
if (overflow_int == 1'b1)
begin
overflow <= 1'b1;
end
end
if (read_rx_byte == 1'b1)
begin
overflow <= 1'b0;
end
end
end
// ----------------------------------------------------------------------------
// registering of the framing_error signal
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : make_framing_error
if ((!aresetn) || (!sresetn))
begin
framing_error <= 1'b0;
end
else if (baud_clock == 1'b1)
begin
if (framing_error_int == 1'b1)
begin
framing_error <= 1'b1;
end
else if (clear_framing_error == 1'b1)
begin
framing_error <= 1'b0;
end
end
else if (clear_framing_error == 1'b1)
begin
framing_error <= 1'b0;
end
else
begin
framing_error <= framing_error;
end
end
// ----------------------------------------------------------------------------
// receive state machine & byte register
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin
if((!aresetn) || (!sresetn))
begin
last_bit <= 4'b1001;
end
else
begin
if((rx_state == receive_states_rx_idle) && (receive_count == 4'b1000))
begin
case({bit8,parity_en})
2'b00 : last_bit <= 4'b0111;
2'b01 : last_bit <= 4'b1000;
2'b10 : last_bit <= 4'b1000;
2'b11 : last_bit <= 4'b1001;
endcase
end
else
begin
last_bit <= last_bit;
end
end
end
assign rx_idle = (rx_state == receive_states_rx_idle);
always @(posedge clk or negedge aresetn)
begin : rcv_sm
if ((!aresetn) || (!sresetn))
begin
rx_state <= receive_states_rx_idle;
rx_byte <= 8'b00000000;
overflow_int <= 1'b0;
framing_error_int <= 1'b0;
stop_strobe <= 1'b0;
end
else
begin
if (baud_clock == 1'b1)
begin
overflow_int <= 1'b0;
stop_strobe <= 1'b0;
framing_error_int <= 1'b0;
case (rx_state)
receive_states_rx_idle:
begin
if (receive_count == 4'b1000)
begin
rx_state <= receive_states_rx_data_bits;
end
else
begin
rx_state <= receive_states_rx_idle;
end
end
receive_states_rx_data_bits:
begin
// last bit has been received
if (rx_bit_cnt == last_bit )
begin
// overflow
rx_state <= receive_states_rx_stop_bit ;
overflow_int <= receive_full_int;
if (receive_full_int == 1'b0)
begin
rx_byte <= {(bit8 & rx_shift[7]), rx_shift[6:0]};
end
end
else
begin
rx_state <= receive_states_rx_data_bits; // still clocking in bits
end
end
receive_states_rx_stop_bit :
begin
// framing error
if (receive_count == 4'b1110)
begin
if (rx_filtered == 1'b0)
begin
framing_error_int <= 1'b1;
end
end
else if (receive_count == 4'b1111)
begin
stop_strobe <= 1'b1;
rx_state <= receive_states_rx_wait_state;
end
else
begin
rx_state <= receive_states_rx_stop_bit;
end
end
receive_states_rx_wait_state :
begin
if ((rx_filtered == 1'b1) || (receive_count == 4'b0110))
begin
rx_state <= receive_states_rx_idle;
end
else
begin
rx_state <= receive_states_rx_wait_state;
end
end
default:
begin
rx_state <= receive_states_rx_idle;
end
endcase
end
end
end
// ----------------------------------------------------------------------------
// receive shift register and parity calculation
// ----------------------------------------------------------------------------
assign shift_choice = {bit8, parity_en};
always @(posedge clk or negedge aresetn)
begin : receive_shift
if ((!aresetn) || (!sresetn))
begin
rx_shift[8:0] <= 9'b000000000;
rx_bit_cnt <= 4'b0000;
end
else
begin
if (baud_clock == 1'b1)
begin
if (rx_state == receive_states_rx_idle)
begin
rx_shift[8:0] <= 9'b000000000;
rx_bit_cnt <= 4'b0000;
end
else if (receive_count == 4'b1111 )
begin
// sample new data bit
rx_bit_cnt <= rx_bit_cnt + 1'b1;
case (shift_choice)
2'b00:
begin
rx_shift[5:0] <= rx_shift[6:1];
rx_shift[6] <= rx_filtered;
end
2'b11:
begin
rx_shift[7:0] <= rx_shift[8:1];
rx_shift[8] <= rx_filtered;
end
default:
begin
rx_shift[6:0] <= rx_shift[7:1];
rx_shift[7] <= rx_filtered;
end
endcase
end
end
end
end
// ----------------------------------------------------------------------------
// receiver parity calculation
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : rx_par_calc
if ((!aresetn) || (!sresetn))
begin
rx_parity_calc <= 1'b0;
end
else
begin
if (baud_clock == 1'b1)
begin
if (receive_count == 4'b1111 & parity_en == 1'b1)
begin
rx_parity_calc <= rx_parity_calc ^ rx_filtered;
end
if (rx_state == receive_states_rx_stop_bit)
begin
rx_parity_calc <= 1'b0;
end
end
end
end
// ----------------------------------------------------------------------------
// latch parity error for even or odd parity
// ----------------------------------------------------------------------------
assign parity_choice = {bit8, odd_n_even};
always @(posedge clk or negedge aresetn)
begin : make_parity_err
if ((!aresetn) || (!sresetn))
begin
parity_err <= 1'b0;
end
else
begin
if (baud_clock == 1'b1 & parity_en == 1'b1 & receive_count == 4'b1111)
begin
case (parity_choice)
2'b00:
begin
if (rx_bit_cnt == 4'b0111)
begin
parity_err <= rx_parity_calc ^ rx_filtered;
end
end
2'b01:
begin
if (rx_bit_cnt == 4'b0111)
begin
parity_err <= ~(rx_parity_calc ^ rx_filtered);
end
end
2'b10:
begin
if (rx_bit_cnt == 4'b1000)
begin
parity_err <= rx_parity_calc ^ rx_filtered;
end
end
2'b11:
begin
if (rx_bit_cnt == 4'b1000)
begin
parity_err <= ~(rx_parity_calc ^ rx_filtered);
end
end
default:
begin
parity_err <= 1'b0;
end
endcase
end
if (clear_parity == 1'b1)
begin
parity_err <= 1'b0;
end
end
end
// ----------------------------------------------------------------------------
// receive full indicator process
// ----------------------------------------------------------------------------
always @(posedge clk or negedge aresetn)
begin : receive_full_indicator
if ((!aresetn) || (!sresetn))
begin
receive_full_int <= 1'b0;
fifo_write <= 1'b1;
clear_parity_en <= 1'b0;
clear_framing_error_en <= 1'b0;
end
else
begin
fifo_write <= 1'b1;
clear_parity_en <= 1'b0;
clear_framing_error_en <= 1'b0;
if (baud_clock == 1'b1)
// last bit has been received
begin
if (bit8 == 1'b1)
begin
if (parity_en == 1'b1)
begin
if (rx_bit_cnt == 4'b1001 & rx_state == receive_states_rx_data_bits)
begin
fifo_write <= 1'b0;
clear_parity_en <= 1'b1;
clear_framing_error_en <= 1'b1;
if (RX_FIFO == 1'b0)
begin
receive_full_int <= 1'b1;
end
end
end
else
begin
if (rx_bit_cnt == 4'b1000 & rx_state == receive_states_rx_data_bits)
begin
fifo_write <= 1'b0;
clear_parity_en <= 1'b1;
clear_framing_error_en <= 1'b1;
if (RX_FIFO == 1'b0)
begin
receive_full_int <= 1'b1;
end
end
end
end
else
begin
if (parity_en == 1'b1)
begin
if (rx_bit_cnt == 4'b1000 & rx_state == receive_states_rx_data_bits)
begin
fifo_write <= 1'b0;
clear_parity_en <= 1'b1;
clear_framing_error_en <= 1'b1;
if (RX_FIFO == 1'b0)
begin
receive_full_int <= 1'b1;
end
end
end
else
begin
if (rx_bit_cnt == 4'b0111 & rx_state == receive_states_rx_data_bits)
begin
fifo_write <= 1'b0;
clear_parity_en <= 1'b1;
clear_framing_error_en <= 1'b1;
if (RX_FIFO == 1'b0)
begin
receive_full_int <= 1'b1;
end
end
end
end
end
if (read_rx_byte == 1'b1)
begin
receive_full_int <= 1'b0;
end
end
end
assign receive_full = receive_full_int;
endmodule // module CoreUARTapb_0_CoreUARTapb_0_0_Rx_async

View File

@@ -0,0 +1,368 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: CoreUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
//
// Notes:
// best viewed with tabstops set to "4"
`timescale 1 ns / 1 ns // timescale for following modules
module CoreUARTapb_0_CoreUARTapb_0_0_Tx_async (clk, xmit_pulse, reset_n, rst_tx_empty, tx_hold_reg, tx_dout_reg, fifo_empty, fifo_full, bit8,
parity_en, odd_n_even, txrdy, tx, fifo_read_tx);
parameter SYNC_RESET = 0;
// TX Parameters
parameter TX_FIFO = 0; // 0=without tx fifo
// 1=with tx fifo
input clk;
input xmit_pulse;
input reset_n;
input rst_tx_empty;
input[7:0] tx_hold_reg;
input[7:0] tx_dout_reg;
input fifo_empty;
input fifo_full;
input bit8;
input parity_en;
input odd_n_even;
output txrdy;
wire txrdy;
output tx;
output fifo_read_tx;
reg tx;
parameter tx_idle = 0;
parameter tx_load = 1;
parameter start_bit = 2;
parameter tx_data_bits = 3;
parameter parity_bit = 4;
parameter tx_stop_bit = 5;
parameter delay_state = 6;
integer xmit_state; // transmit state machine
reg txrdy_int; // transmit ready for another byte
reg[7:0] tx_byte; // transmit byte
reg[3:0] xmit_bit_sel; // selects transmit bit
reg tx_parity; // transmit parity
// AS: changed to wire
// removed unused signals
//reg fifo_read_tx;
wire fifo_read_tx;
reg fifo_read_en0;
//reg fifo_read_en1;
//wire fifo_read_en;
// ----------------------------------------------------------------------------
wire aresetn;
wire sresetn;
assign aresetn = (SYNC_RESET==1) ? 1'b1 : reset_n;
assign sresetn = (SYNC_RESET==1) ? reset_n : 1'b1;
// Modified Sep 2006, ROK
// ----------------------------------------------------------
// AS, Sep10: synchronized to start bit, rather than load bit
// since txload now happens on start bit state
always @(posedge clk or negedge aresetn)
begin : make_txrdy
if ((!aresetn) || (!sresetn))
begin
txrdy_int <= 1'b1 ;
end
else
begin
if (TX_FIFO == 1'b0)
begin
if (xmit_pulse)
begin
if (xmit_state == start_bit)
begin
txrdy_int <= 1'b1;
end
end
if (rst_tx_empty)
begin
txrdy_int <= 1'b0;
end
end
else
begin
txrdy_int <= !fifo_full;
end
end
end
// Modified Sep10, AS
// FIFO load state transitions and outputs and outputs registered on system
// clock (clk):
always @(posedge clk or negedge aresetn)
begin : xmit_sm
if ((!aresetn) || (!sresetn))
begin
xmit_state <= tx_idle ;
tx_byte <= 8'b0 ;
fifo_read_en0 <= 1'b1;
end
else
begin
// AS:
// (1) state on sysclk for tx_idle, tx_load, delay_state since these operations run
// off the system clock, not the baud clock
// (2) perform tx byte load on start bit state to ensure that data is
// valid at that point
if (xmit_pulse || (xmit_state == tx_idle) || (xmit_state == delay_state) || (xmit_state == tx_load))
begin
fifo_read_en0 <= 1'b1;
case (xmit_state)
tx_idle :
begin
if (TX_FIFO == 1'b0)
begin
if (!txrdy_int)
begin
xmit_state <= tx_load ;
end
else
begin
xmit_state <= tx_idle ;
end
end
else
begin
if (fifo_empty == 1'b0)
begin
fifo_read_en0 <= 1'b0;
xmit_state <= delay_state;
end
else
begin
xmit_state <= tx_idle ;
fifo_read_en0 <= 1'b1;
end
end
end
tx_load :
begin
xmit_state <= start_bit ;
end
start_bit :
begin
xmit_state <= tx_data_bits ;
if (TX_FIFO == 1'b0)
begin
tx_byte <= tx_hold_reg ;
end
else
begin
tx_byte <= tx_dout_reg ;
end
end
tx_data_bits :
begin
if (bit8)
begin
if (xmit_bit_sel == 4'b0111)
begin
if (parity_en)
begin
xmit_state <= parity_bit ;
end
else
begin
xmit_state <= tx_stop_bit ;
end
end
else
begin
xmit_state <= tx_data_bits ;
end
end
else
begin
if (xmit_bit_sel == 4'b0110)
begin
if (parity_en)
begin
xmit_state <= parity_bit ;
end
else
begin
xmit_state <= tx_stop_bit ;
end
end
else
begin
xmit_state <= tx_data_bits ;
end
end
end
parity_bit :
begin
xmit_state <= tx_stop_bit ;
end
tx_stop_bit :
begin
xmit_state <= tx_idle ;
end
delay_state :
begin
xmit_state <= tx_load ;
end
default :
begin
xmit_state <= tx_idle ;
end
endcase
end
end
end
// AS: Need to remove clock delay of fifo read, since tx_load state is
// registered on sys clk now and fifo_read_en needs to be made available
// immediately
// Added by Hari
//always @(posedge clk or negedge reset_n)
//begin : read_fifo
// if (!reset_n)
// begin
// fifo_read_tx <= 1'b1;
// fifo_read_en1 <= 1'b1;
// end
// else
// begin
// fifo_read_tx <= 1'b1;
// fifo_read_en1 <= fifo_read_en0;
// if (fifo_read_en == 1'b0)
// begin
// fifo_read_tx <= 1'b0;
// end
// end
//end
//assign fifo_read_en = (!fifo_read_en1 | fifo_read_en0);
//assign fifo_read_en = fifo_read_en0;
assign fifo_read_tx = fifo_read_en0;
always @(posedge clk or negedge aresetn)
begin : xmit_cnt
if ((!aresetn) || (!sresetn))
begin
xmit_bit_sel <= 4'b0000 ;
end
else
begin
if (xmit_pulse)
begin
if (xmit_state != tx_data_bits)
begin
xmit_bit_sel <= 4'b0000 ;
end
else
begin
xmit_bit_sel <= xmit_bit_sel + 1'b1 ;
end
end
end
end
always @(posedge clk or negedge aresetn)
begin : xmit_sel
if ((!aresetn) || (!sresetn))
begin
tx <= 1'b1 ;
end
else
begin
// AS:
// state on sysclk for tx_idle, tx_load, delay_state since these operations run
// off the system clock, no the baud clock
if (xmit_pulse || (xmit_state == tx_idle) || (xmit_state == delay_state) || (xmit_state == tx_load))
begin
case (xmit_state)
tx_idle :
begin
tx <= 1'b1 ;
end
tx_load :
begin
tx <= 1'b1 ;
end
start_bit :
begin
tx <= 1'b0 ;
end
tx_data_bits :
begin
//tx <= tx_byte[conv_integer(xmit_bit_sel)] ;
tx <= tx_byte[xmit_bit_sel] ;
end
parity_bit :
begin
tx <= odd_n_even ^ tx_parity ;
end
tx_stop_bit :
begin
tx <= 1'b1 ;
end
default :
begin
tx <= 1'b1 ;
end
endcase
end
end
end
always @(posedge clk or negedge aresetn)
begin : xmit_par_calc
if ((!aresetn) || (!sresetn))
begin
tx_parity <= 1'b0 ;
end
else
begin
if (xmit_pulse & parity_en)
begin
if (xmit_state == tx_data_bits)
begin
//tx_parity <= tx_parity ^ tx_byte[conv_integer(xmit_bit_sel)] ;
tx_parity <= tx_parity ^ tx_byte[xmit_bit_sel] ;
end
else
begin
tx_parity <= tx_parity ;
end
end
if (xmit_state == tx_stop_bit)
begin
tx_parity <= 1'b0 ;
end
end
end
assign txrdy = txrdy_int ;
endmodule

View File

@@ -0,0 +1,280 @@
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2008 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: CoreUART/ CoreUARTapb UART core
//
//
// Revision Information:
// Date Description
// Jun09 Revision 4.1
// Aug10 Revision 4.2
//
//
// SVN Revision Information:
// SVN $Revision: 8508 $
// SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
//
// Resolved SARs
// SAR Date Who Description
// 20741 2Sep10 AS Increased baud rate by ensuring fifo ctrl runs off
// sys clk (not baud clock). See note below.
//
// Notes:
// best viewed with tabstops set to "4"
`timescale 1 ns/100 ps
module CoreUARTapb_0_CoreUARTapb_0_0_fifo_256x8(DO, RCLOCK, WCLOCK, DI, WRB, RDB, RESET, FULL, EMPTY);
output [7:0] DO;
input RCLOCK;
input WCLOCK;
input [7:0] DI;
input WRB;
input RDB;
input RESET;
output FULL;
output EMPTY;
parameter SYNC_RESET = 0;
parameter [6:0] LEVEL = 128;
wire [7:0] DO;
wire AEMPTY, AFULL, FULL, EMPTY;
CoreUARTapb_0_CoreUARTapb_0_0_fifo_ctrl_256 #(.SYNC_RESET(SYNC_RESET)) fifo_256x8_g5 (.data_in(DI), .data_out(DO), .write_n(WRB), .read_n(RDB), .clock(WCLOCK),
.full(FULL), .empty(EMPTY), .half(GEQTH), .reset_n(RESET), .LEVEL(LEVEL) );
endmodule
/*********************************************************/
// MODULE: Synchronous FIFO
//
// FILE NAME: fifo_ctl.v
//
// CODE TYPE: Register Transfer Level
//
// DESCRIPTION: This module defines a Synchronous FIFO. The
// FIFO memory is implemented as a ring buffer. The read
// pointer points to the beginning of the buffer, while the
// write pointer points to the end of the buffer. Note that
// in this RTL version, the memory has one more location than
// the FIFO needs in order to calculate the FIFO count
// correctly.
//
/*********************************************************/
// fifo control logic
module CoreUARTapb_0_CoreUARTapb_0_0_fifo_ctrl_256(
clock,
reset_n,
data_in,
read_n,
write_n,
LEVEL,
data_out,
full,
empty,
half);
parameter SYNC_RESET = 0;
parameter FIFO_DEPTH = 256; // Depth of FIFO (number of bytes)
parameter FIFO_BITS = 8; // Number of bits required to
parameter FIFO_WIDTH = 8; // Width of FIFO data
// INPUTS
input clock; // Clock input
input reset_n; // Active low reset
input [FIFO_WIDTH-1:0] data_in; // Data input to FIFO
input read_n; // Read FIFO (active low)
input write_n; // Write FIFO (active low)
input [6:0] LEVEL;
// OUTPUTS
output [FIFO_WIDTH-1:0] data_out; // FIFO output data
output full; // FIFO is full
output empty; // FIFO is empty
output half; // FIFO is half full
// or more
// INOUTS
// SIGNAL DECLARATIONS
wire clock;
wire reset_n;
wire [FIFO_WIDTH-1:0] data_in;
wire read_n;
wire write_n;
reg [FIFO_WIDTH-1:0] data_out;
wire full;
wire empty;
wire half;
wire [FIFO_WIDTH-1:0] data_out_0;
reg read_n_hold;
// How many locations in the FIFO
// are occupied?
reg [FIFO_BITS-1:0] counter;
// FIFO read pointer points to
// the location in the FIFO to
// read from next
reg [FIFO_BITS-1:0] rd_pointer;
// FIFO write pointer points to
// the location in the FIFO to
// write to next
reg [FIFO_BITS-1:0] wr_pointer;
wire aresetn;
wire sresetn;
// ASSIGN STATEMENTS
assign aresetn = (SYNC_RESET==1) ? 1'b1 : reset_n;
assign sresetn = (SYNC_RESET==1) ? reset_n : 1'b1;
assign full = (counter == FIFO_DEPTH-1) ? 1'b1 : 1'b0;
assign empty = (counter == 0) ? 1'b1 : 1'b0;
assign half = (counter >= LEVEL) ? 1'b1 : 1'b0;
// MAIN CODE
// This block contains all devices affected by the clock
// and reset inputs
always @(posedge clock or negedge aresetn ) begin
if ((!aresetn) || (!sresetn)) begin
// Reset the FIFO pointer
rd_pointer <= {FIFO_BITS{1'b0}};
wr_pointer <= {FIFO_BITS{1'b0}};
counter <= {FIFO_BITS{1'b0}};
end
else begin
if (~read_n) begin
// If we are doing a simultaneous read and write,
// there is no change to the counter
if (write_n) begin
// Decrement the FIFO counter
counter <= counter - 1;
end
// Increment the read pointer
// Check if the read pointer has gone beyond the
// depth of the FIFO. If so, set it back to the
// beginning of the FIFO
if (rd_pointer == FIFO_DEPTH-1)
rd_pointer <= {FIFO_BITS{1'b0}};
else
rd_pointer <= rd_pointer + 1;
end
if (~write_n) begin
// Check for FIFO overflow
if (counter >= FIFO_DEPTH) begin
$display("\nERROR at time %0t:", $time);
$display("FIFO Overflow\n");
// Use $stop for debugging
$stop;
end
// If we are doing a simultaneous read and write,
// there is no change to the counter
if (read_n) begin
// Increment the FIFO counter
counter <= counter + 1;
end
// Increment the write pointer
// Check if the write pointer has gone beyond the
// depth of the FIFO. If so, set it back to the
// beginning of the FIFO
if (wr_pointer == FIFO_DEPTH-1)
wr_pointer <= {FIFO_BITS{1'b0}};
else
wr_pointer <= wr_pointer + 1;
end
end
end
always @(posedge clock or negedge aresetn )
begin
if ((!aresetn) || (!sresetn))
begin
read_n_hold <= 1'b0;
data_out <= 1'b0;
end
else
begin
read_n_hold <= read_n;
if (read_n_hold == 1'b0)
begin
data_out <= data_out_0;
end
else
begin
data_out <= data_out;
end
end
end
CoreUARTapb_0_CoreUARTapb_0_0_ram256x8_g5 ram256x8_g5(.Data(data_in), .Q(data_out_0), .WAddress(wr_pointer),
.RAddress(rd_pointer), .WE(write_n), .RE(read_n), .WClock(clock),
.RClock(clock), .reset_n(reset_n) );
endmodule
module CoreUARTapb_0_CoreUARTapb_0_0_ram256x8_g5(Data,Q,WAddress,RAddress,WE,RE,WClock,RClock,reset_n);
input [7:0] Data;
input [7:0] WAddress, RAddress;
input WE, RE, WClock, RClock, reset_n;
output [7:0] Q;
wire [19:0] DOUT_RAM_0;
wire [13:0] RADDR_int;
wire [13:0] WADDR_int;
wire INV_0_Y, VCC, GND;
VCC VCC_1_net(.Y(VCC));
GND GND_1_net(.Y(GND));
INV INV_0(.A(WE), .Y(INV_0_Y));
INV INV_1(.A(RE), .Y(INV_1_Y));
assign Q = DOUT_RAM_0[7:0];
assign RADDR_int = {2'b0, RAddress[7:0], 4'b0};
assign WADDR_int = {2'b0, WAddress[7:0], 4'b0};
RAM1K20
RAM_R0C0 ( .A_DOUT (DOUT_RAM_0),
.B_DOUT (/*NC*/),
.ACCESS_BUSY (/*NC*/),
.BUSY_FB (1'b1),
.ECC_EN (1'b0),
.ECC_BYPASS (1'b0),
.DB_DETECT (/*NC*/),
.SB_CORRECT (/*NC*/),
.A_CLK (RClock),
.A_DOUT_EN (1'b1),
.A_DOUT_SRST_N (1'b1),
.A_DOUT_ARST_N (1'b1),
.A_BYPASS (1'b1),
.A_BLK_EN ({INV_1_Y, 2'b11}),
.A_DIN (20'b0),
.A_ADDR (RADDR_int),
.A_WEN (2'b00),
.A_REN (1'b1),
.A_WIDTH (3'b100),
.A_WMODE (2'b0),
.B_CLK (WClock),
.B_DOUT_EN (1'b1),
.B_DOUT_SRST_N (1'b1),
.B_DOUT_ARST_N (1'b1),
.B_BYPASS (1'b1),
.B_BLK_EN ({INV_0_Y, 2'b11}),
.B_DIN ({12'b0, Data[7:0]}),
.B_ADDR (WADDR_int),
.B_WEN (2'b11),
.B_REN (1'b0),
.B_WIDTH (3'b100),
.B_WMODE (2'b0)
);
endmodule

View File

@@ -0,0 +1,300 @@
`timescale 1 ns / 1 ns
// ********************************************************************
// Actel Corporation Proprietary and Confidential
// Copyright 2009 Actel Corporation. All rights reserved.
//
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
//
// Description: User testbench for CoreAI (Analog Interface)
//
// Revision Information:
// Date Description
// ---- -----------------------------------------
// 03Mar09 Initial Version 2.0
//
// SVN Revision Information:
// SVN $Revision: $
// SVN $Date: $
//
// Resolved SARs
// SAR Date Who Description
//
// Notes:
// 1. best viewed with tabstops set to "4"
// 2. Most of the behavior is driven from the BFM scripts for the APB master.
// Consult the Actel AMBA BFM documentation for more information.
//
// History: 04/22/09 - AS created
//
// *********************************************************************
module testbench;
//`include "coreparameters.v"
//`include "../../../coreparameters.v"
`include "../../../../coreparameters.v"
// vector file for driving the APB master BFM
// NOTE: location of the following files can be overridden at run time
parameter APB_MASTER_VECTFILE = "coreuart_usertb_apb_master.vec";
// propagation delay in ns
parameter TPD = 3;
//-----------------------------------------------------------------------------
// constants
//-----------------------------------------------------------------------------
parameter APB_MASTER_CLK_CYCLE = 100;
parameter APB_MASTER_CLK_CYCLE_LO_TIME = (APB_MASTER_CLK_CYCLE/2);
// add 1 if APB_MASTER_CLK_CYCLE is odd number to compensate for PCLK period
parameter APB_MASTER_CLK_CYCLE_HI_TIME = (APB_MASTER_CLK_CYCLE/2);
parameter [31:0] ADDR_IN = 32'h00000000;
parameter [31:0] ADDR_OUT = 32'h00000001;
parameter [31:0] ADDR_INT = 32'h00000002;
parameter [31:0] ADDR_OE = 32'h00000003;
//----------------------------------------------------------------------------
// signals
//-----------------------------------------------------------------------------
// system
reg SYSRSTN_apb;
reg SYSCLK_apb;
// APB
wire PCLK;
wire PRESETN;
wire [31:0] PADDR_apb_bfm_wide;
wire [4:0] PADDR;
wire [15:0] PSEL_apb_bfm_wide;
wire PSEL1; // DUT1 PSEL
wire PSEL2; // DUT2 PSEL
wire PENABLE;
wire PWRITE;
wire [31:0] PWDATA_apb_bfm_wide;
wire [7:0] PWDATA;
// BFM
wire [31:0] PRDATA_apb_bfm_wide;
wire [7:0] PRDATA;
wire [7:0] PRDATA1;
wire [7:0] PRDATA2;
wire PREADY;
wire PSLVERR;
wire [31:0] GP_IN_apb_bfm;
wire [31:0] GP_OUT_apb_bfm;
wire FINISHED_apb_bfm;
wire FAILED_apb_bfm;
// DUT1
wire TXRDY1;
wire RXRDY1;
wire TX1;
wire RX1;
wire PARITY_ERR1;
wire FRAMING_ERR1;
wire OVERFLOW1;
// DUT2
wire TXRDY2;
wire RXRDY2;
wire TX2;
wire RX2;
wire PARITY_ERR2;
wire FRAMING_ERR2;
wire OVERFLOW2;
wire RX_SEL;
// BFM memory interface
// not used
wire [31:0] BFM_ADDR;
wire [31:0] BFM_DATA;
wire [31:0] BFM_DATA_i;
wire BFM_RD;
wire BFM_WR;
// misc. signals
wire [255:0] GND256;
wire [31:0] GND32;
wire [7:0] GND8;
wire [4:0] GND5;
wire [3:0] GND4;
wire GND1;
reg [0:0] stopsim;
// APB ASSIGNS
assign PADDR = PADDR_apb_bfm_wide[4:0];
assign PSEL1 = PSEL_apb_bfm_wide[0];
assign PSEL2 = PSEL_apb_bfm_wide[1];
assign PWDATA = PWDATA_apb_bfm_wide[7:0];
assign PRDATA = ((PSEL1 == 1'b1)) ? PRDATA1 :
((PSEL2 == 1'b1)) ? PRDATA2 :
8'h00;
assign PRDATA_apb_bfm_wide[31:0] = {24'h000000, PRDATA[7:0]};
// PREADY and PSLVERR not used, tie off
assign PREADY = 1'b1;
assign PSLVERR = 1'b0;
// DUT
// pull-down for Framing Error Test
assign RX2 = ((RX_SEL == 1'b0)) ? TX1 :
1'b0;
// monitor flags / select signals in BFM
assign GP_IN_apb_bfm = {24'h000000, OVERFLOW2, PARITY_ERR2, TXRDY2, RXRDY2, OVERFLOW1, PARITY_ERR1, TXRDY1, RXRDY1};
assign RX_SEL = GP_OUT_apb_bfm[0];
// System clock
// System clock
initial SYSCLK_apb = 1'b0;
always
begin
#APB_MASTER_CLK_CYCLE_LO_TIME SYSCLK_apb = 1'b1;
#APB_MASTER_CLK_CYCLE_HI_TIME SYSCLK_apb = 1'b0;
end
// Main simulation
initial
begin: main_sim
SYSRSTN_apb = 0;
@ (posedge SYSCLK_apb); #TPD;
SYSRSTN_apb = 1;
@ (posedge SYSCLK_apb); #TPD;
// wait until BFM is finished
while (!(FINISHED_apb_bfm===1'b1))
begin
@ (posedge SYSCLK_apb); #TPD;
end
stopsim=1;
#1;
$stop;
end
// ------------------------------------------------------
// BFM register interface
// not used for this core
// End BFM register interface RTL
// ------------------------------------------------------
// BFM instantiation
// passing testbench parameters to BFM ARGVALUE* parameters
CoreUARTapb_0_CoreUARTapb_0_0_BFM_APB #(
.VECTFILE(APB_MASTER_VECTFILE),
.TPD(TPD),
.ARGVALUE0(FAMILY),
.ARGVALUE1(TX_FIFO),
.ARGVALUE2(RX_FIFO),
.ARGVALUE3(FIXEDMODE),
.ARGVALUE4(BAUD_VALUE),
.ARGVALUE5(PRG_BIT8),
.ARGVALUE6(PRG_PARITY),
.ARGVALUE7(RX_LEGACY_MODE),
.ARGVALUE8(USE_SOFT_FIFO)
) U_APB_MASTER(
.SYSCLK(SYSCLK_apb),
.SYSRSTN(SYSRSTN_apb),
.PCLK(PCLK),
.PRESETN(PRESETN),
.PADDR(PADDR_apb_bfm_wide),
.PSEL(PSEL_apb_bfm_wide),
.PENABLE(PENABLE),
.PWRITE(PWRITE),
.PWDATA(PWDATA_apb_bfm_wide),
.PRDATA(PRDATA_apb_bfm_wide),
.PREADY(PREADY),
.PSLVERR(PSLVERR),
.INTERRUPT(GND256),
// NEED TO ADD GPIN
.GP_OUT(GP_OUT_apb_bfm),
.GP_IN(GP_IN_apb_bfm),
.EXT_WR(BFM_WR),
.EXT_RD(BFM_RD),
.EXT_ADDR(BFM_ADDR),
.EXT_DATA(BFM_DATA),
.EXT_WAIT(GND1),
.FINISHED(FINISHED_apb_bfm),
.FAILED(FAILED_apb_bfm)
);
// DUT1 (TX)
CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb #(
.FAMILY(FAMILY),
.TX_FIFO(TX_FIFO),
.RX_FIFO(RX_FIFO),
.FIXEDMODE(FIXEDMODE),
.BAUD_VALUE(BAUD_VALUE),
.PRG_BIT8(PRG_BIT8),
.PRG_PARITY(PRG_PARITY),
.RX_LEGACY_MODE(RX_LEGACY_MODE),
.BAUD_VAL_FRCTN(BAUD_VAL_FRCTN),
.BAUD_VAL_FRCTN_EN(BAUD_VAL_FRCTN_EN)
) DUT1(
.PRESETN(PRESETN),
.PCLK(PCLK),
.PSEL(PSEL1),
.PENABLE(PENABLE),
.PWRITE(PWRITE),
.PADDR(PADDR),
.PWDATA(PWDATA),
.PRDATA(PRDATA1),
.PREADY(),
.PSLVERR(),
// OTHER SIGNALS
.TXRDY(TXRDY1),
.RXRDY(RXRDY1),
.PARITY_ERR(PARITY_ERR1),
.FRAMING_ERR(FRAMING_ERR1),
.OVERFLOW(OVERFLOW1),
.RX(RX1),
.TX(TX1)
);
// DUT2 (RX)
CoreUARTapb_0_CoreUARTapb_0_0_CoreUARTapb #(
.FAMILY(FAMILY),
.TX_FIFO(TX_FIFO),
.RX_FIFO(RX_FIFO),
.FIXEDMODE(FIXEDMODE),
.BAUD_VALUE(BAUD_VALUE),
.PRG_BIT8(PRG_BIT8),
.PRG_PARITY(PRG_PARITY),
.RX_LEGACY_MODE(RX_LEGACY_MODE),
.BAUD_VAL_FRCTN(BAUD_VAL_FRCTN),
.BAUD_VAL_FRCTN_EN(BAUD_VAL_FRCTN_EN)
) DUT2(
.PRESETN(PRESETN),
.PCLK(PCLK),
.PSEL(PSEL2),
.PENABLE(PENABLE),
.PWRITE(PWRITE),
.PADDR(PADDR),
.PWDATA(PWDATA),
.PRDATA(PRDATA2),
.PREADY(),
.PSLVERR(),
// OTHER SIGNALS
.TXRDY(TXRDY2),
.RXRDY(RXRDY2),
.PARITY_ERR(PARITY_ERR2),
.FRAMING_ERR(FRAMING_ERR2),
.OVERFLOW(OVERFLOW2),
.RX(RX2),
.TX(TX2)
);
endmodule
// testbench

View File

@@ -0,0 +1,36 @@
Microchip Technology Inc. - Microchip Libero Software Release 2025.1 (Version 2025.1.0.14)
Date : Mon Apr 13 21:41:13 2026
Project : E:\AbhishekV\rising\ethernet_reference_design\hw\Libero_Project
Component : CoreUARTapb_0
Family : PolarFire
HDL source files for all Synthesis and Simulation tools:
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/Clock_gen.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/Rx_async.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/Tx_async.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/CoreUART.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/CoreUARTapb.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/core/fifo_256x8_g5.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0.v
Stimulus files for all Simulation tools:
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/mti/scripts/bfmtovec_compile.do
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/mti/scripts/coreuart_usertb_apb_master.bfm
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/mti/scripts/coreuart_usertb_include.bfm
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/mti/scripts/wave_vlog_amba.do
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/coreparameters.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_ahbl.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_ahblapb.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_ahbslave.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_ahbslaveext.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_ahbtoapb.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_apb.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_apbslave.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_apbslaveext.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_apbtoapb.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/amba_bfm/bfm_main.v
E:/AbhishekV/rising/ethernet_reference_design/hw/Libero_Project/component/work/CoreUARTapb_0/CoreUARTapb_0_0/rtl/vlog/test/user/testbench.v