OpenCores
URL https://opencores.org/ocsvn/simple_customized_counter/simple_customized_counter/trunk

Subversion Repositories simple_customized_counter

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 13 to Rev 14
    Reverse comparison

Rev 13 → Rev 14

/simple_customized_counter/trunk/CounterLib.psC
0,0 → 1,163
library CounterLib
{
// ===================================================================
// This is a library of counters
// Each counter supports:
// - resetting
// - counting up
// - counting down
// - loading a value from the input iLoad
//
// The code is straightforward, so you can easily create your own counter
// by changing the counter type or the operations
//
// The output always generates an event.
// If you don't want the event, remove the colon ':' in the value assignment
// change oValue := 0; to oValue = 0;
//
// There are four counters in the library:
// - CCounterEvent: executes the operation on input events
// - CCounterLevel: executes the operation at each step
// - CCounterOprEvent: executes the operation on input Opr event
// - CCounterOprLevel: executes the operation at each step
//
// TESTING:
// - CCounterEvent: Manual test with control panel
// - CCounterLevel: Using waveform editor and viewer
// - CCounterOprLevel: Using waveform editor and viewer
// - CCounterOprEvent: > Smulated DE1SoC board, you only need the BSP
// > Real DE1SoC board, you need the board
// > Controlled by a C++ program
// ===================================================================
// -------------------------------------------------------------------
// This counter executes the operation on input events
// There is a priority assigned to each function, in parenthesis
// 0 indicates highest priority
// and priority decreases with increasing value
// -------------------------------------------------------------------
component CCounterEvent (in active bit iReset,
in active bit iUp,
in active bit iDown,
in active bit iLoad,
in passive ubyte iLoadValue,
out active ubyte oValue)
{
DoReset(0) on iReset
{
oValue := 0ub;
}
 
CountUp(1) on iUp
{
oValue:++;
}
 
CountDown(2) on iDown
{
oValue:--;
}
 
LoadValue(3) on iLoad
{
oValue := iLoadValue;
}
};
// -------------------------------------------------------------------
// This counter executes the operation at each step or clock cycle
// The priority is implemented with if and else instructions
// -------------------------------------------------------------------
component CCounterLevel (in passive bit iReset,
in passive bit iUp,
in passive bit iDown,
in passive bit iLoad,
in passive ubyte iLoadValue,
out active ubyte oValue)
{
always()
{
if(iReset)
{
oValue := 0ub;
}
 
else if(iUp)
{
oValue:++;
}
 
else if(iDown)
{
oValue:--;
}
 
else if(iLoad)
{
oValue := iLoadValue;
}
}
};
 
// -------------------------------------------------------------------
// Define type and constants for the counter operation
// -------------------------------------------------------------------
enum Opr_t { cOprReset, cOprUp, cOprDown, cOprLoad };
 
// -------------------------------------------------------------------
// This counter executes the operation on iOpr input event
// The input iOpr has the type Opr_t, see above
// There is no priority on the operations
// -------------------------------------------------------------------
// The switch statement has no break, only one case is executed
// -------------------------------------------------------------------
component CCounterOprEvent (in active Opr_t iOpr,
in active ubyte iLoadValue,
out active ubyte oValue)
{
// This counter executes the operation on iOpr input event
// The input iOpr has the type Opr_t, see above
// There is no priority on the operations
//
// The switch statement has no break, only one case is executed
 
ExecuteOpr(0) on iOpr
{
switch(iOpr)
{
case cOprReset: oValue:= 0ub;
case cOprUp: oValue:++;
case cOprDown: oValue:--;
case cOprLoad: oValue := iLoadValue;
}
}
 
 
};
// -------------------------------------------------------------------
// This counter executes the operation at each step or clock cycle
// The priority is implemented with if and else instructions
// -------------------------------------------------------------------
component CCounterOprLevel (in active Opr_t iOpr,
in active ubyte iLoadValue,
out active ubyte oValue)
{
always()
{
// Send the event
oValue:;
 
// Assign the value
// The switch instruction returns a value
oValue = switch(iOpr)
{
case cOprReset: 0ub;
case cOprUp: oValue + 1ub;
case cOprDown: oValue - 1ub;
case cOprLoad: iLoadValue;
};
}
};
 
};

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.