Skip to content

Instantly share code, notes, and snippets.

@robertoalcantara
Last active August 20, 2017 19:50
Show Gist options
  • Save robertoalcantara/ce0e922f8fd4db2dcfe6acb5b5527ace to your computer and use it in GitHub Desktop.
Save robertoalcantara/ce0e922f8fd4db2dcfe6acb5b5527ace to your computer and use it in GitHub Desktop.
element CPU1() { //sincrono
#clkscale 1000
mode sleep: -5; //consumo de unidades de energia por 1k ciclo de clk
mode active_slow: -50;
mode active_fast: -100;
mode disable: 0;
}
element TEMP() { //assincrono
#timescale 1ms
mode enable: -5; // consumo do SPI + sensor. -5 unidades de energia por tempo unidade de tempo (1ms)
mode disable: 0;
}
element AD_MIC(){ //assincrono
#timescale 1ms
mode enable: -2; // consumo conversor AD
mode disable: 0;
}
element MIC(){ //assincrono
#timescale 1ms
mode enable: -20; // analogico do MIC, a cada 100ns ativo gasta 20 unidades de energia a cada 1ms
mode disable: -3; // pre-amp do MIC possui um consumo constante. A cada 100ns gasta 3 unidades de energia
}
element BATTERY(){ //assíncrono
#timescale 7s
mode running: -1; //self discharge 1 unidade de energia a cada 7s
mode disable: 0;
}
element CHARGER() { //assincrono
#timescale 60s
mode enable: +1;
mode disable: 0;
}
element LED() {
#timescale 100ms
mode enable: -10;
mode disable: 0;
}
element RADIO(){
#timescale 1ms
mode tx: -35;
mode rx: -10;
mode disable: 0;
}
//define os parametros inicias do modelo
startup {
#timescale 1us //quando nao definido, 1 us é o padrão
$ENERGY = 50000;
ON_AMOST = 0;
MIC.disable();
CPU1.disable();
AD_MIC.disable();
TEMP.disable();
RADIO.rx();
CHARGER.disable();
BATTERY.running();
}
task AMOST_MIC ( TMR(25us) || ON_AMOST_MIC ) {
0: ON_AMOST_MIC = 1; //no momento 0 faz tudo em paralelo
0: AD_MIC.enable()
0: MIC.enable()
0: CPU1.active_fast();
$48: ON_AMOST_MIC=0; //no ciclo de clock 48 faz isso em paralelo:
$48: MIC.disable();
$48: AD_MIC.disable(); //os perifericos permanecerama ativos pelos 48 ciclos;
$48: CPU1.disable();
}
task AMOST_TEMPERATURA ( TMR(5s) || ON_AMOST_TEMP ) {
#timescale 1ms;
0: ON_AMOST_TEMP = 1;
0: TEMP.enable() //esse sensor so fica pronto depois de 50ms
50: CPU1.active_slow(); //50ms depois de iniciar a cpu comeca a fazer algo
$10: ON_AMOST_TEMP=0; //computacao foi realizada em 10 ciclos lentos
$10: CPU1.disable();
}
//a ideia aqui eh modelar uma tarefa que o seu tempo de execucao de pior caso raramente
//é atingido, e dá p/ estimar estatisticamente qdo ocorrerá.
task AUDIO_ANALISYS ( TMR(100ms) || ON_AUDIO_AN ) {
#timescale 1ms;
0: ON_AUDIO_AN = 1;
0: CPU1.active_fast(); //computacao fft realizada em 2400 ciclos
$2400,99.9% { //no ciclo 2400, 99,9% das vezes faz isso
CPU1.disable();
ON_AUDIO_AN = 0;
}
$2400,0.1%: CPU1.active_slow();
$8000: CPU1.disable(); //alguma computacao que demorou 8000-2400 ciclos de clock
$8000: LED_ENABLE = 1;
$8000: SIG_TX_DATA = 1;
$8000: ON_AUDIO_AN = 0;
}
task LED( LED_ENABLE ) {
#timescale 1s
0:LED.enable();
5:LED.disable();
5:LED_ENABLE = 0;
}
task TX_DATA( SIG_TX_DATA) {
#timescale 1ms
0: RADIO.tx();
0: CPU1.active_fast();
$28: CPU1.disable();
$28 + 2000 + RANDOM(0,5000) { //radio fica ativo de 28 ciclos+ 2 a 7 segundos
RADIO.disable();
SIG_TX_DATA = 0;
}
}
task RX_DATA( INTERRUPT(RX) ) {
0: CPU1.active_slow();
$30,99.99%: { //30 ciclos para testar os dados
CPU1.disable();
INTERRUPT(RX) = 0;
}
$330: CPU1.disable();
$330: INTERRUPT(RX) = 0;
}
task CHARGER_EN( TMR(12h) || CHAR_RUN ) {
#timescale 1h
0: CHARGER.enable();
0: CHAR_RUN = 1;
1: CHARGER.disable(); //recarregou durante 1h, 60 unidades de energia. (1 minuto = 1 uniddes). Vai recarregar novamente 12h depois.
1: CHAR_RUN = 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment