Books | ALBI_Books | Fig_33

#include "Funcmi.h"

void Funcmi::main_proc()
{
    if (rst.read() == 1)
    {
        br.write(0);
        ext_in.write(0);
        idle.write(0);
        inpr.write(0);
        ir1.write(0);
        ir2.write(0);
        pc.write(0);
        ralu.write(0);
        rialu.write(0);
        for (unsigned int i = 0; i < 16; ++i)
        {
            bor[i].write(0);
        }
        for (unsigned int i = 0; i < 65536; ++i)
        {
            m0[i].write(0);
        }
        for (unsigned int i = 0; i < 65536; ++i)
        {
            m1[i].write(0);
        }

        currentState = a1;
        idle.write(1);
    }
    else
    {
        idle.write(0);
        proc_Funcmi();
    }
}

void Funcmi::proc_Funcmi()
{
    sc_uint<16> ir1_tmp = ir1.read();

    ext_in.write(0);
    idle.write(0);

    switch (currentState)
    {
    case a1:
        if (s.read() && dma.read() && ext_rdwr.read() && m.read())
        {
            m1_adr = ext_adr.read();
            currentState = a1;
            m1[m1_adr].write(ext_out.read());
            idle.write(1);
        }
        else if (s.read() && dma.read() && ext_rdwr.read() && !m.read())
        {
            m0_adr = ext_adr.read();
            currentState = a1;
            m0[m0_adr].write(ext_out.read());
            idle.write(1);
        }
        else if (s.read() && dma.read() && !ext_rdwr.read() && m.read())
        {
            m1_adr = ext_adr.read();
            currentState = a1;
            ext_in.write(m1[m1_adr].read());
            idle.write(1);
        }
        else if (s.read() && dma.read() && !ext_rdwr.read() && !m.read())
        {
            m0_adr = ext_adr.read();
            currentState = a1;
            ext_in.write(m0[m0_adr].read());
            idle.write(1);
        }
        else if (s.read() && !dma.read())
        {
            m0_adr = pc.read();
            currentState = a8;
            ir1.write(m0[m0_adr].read());
        }
        else 
        {
            currentState = a1;
            idle.write(1);
        }

        break;

    case a2:
        if (bit1.read())
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a1;
            bor[bor_adr].write(br.read());
            idle.write(1);
        }
        else 
        {
            currentState = a6;
            ir2.write(br.read());
        }

        break;

    case a3:
        
        {
            alu_in1 = br.read();
            alu_in2 = ir2.read();
            alu_ctr = ir1_tmp.range(15, 11);
            currentState = a5;
            alub(alu_in1, alu_in2, alu_ctr, alu);
            ralu.write(alu);
        }

        break;

    case a4:
        if (ir1_tmp[9])
        {
            m1_adr = ir2.read();
            currentState = a2;
            br.write(m1[m1_adr].read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a3;
            br.write(bor[bor_adr].read());
        }

        break;

    case a5:
        
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a1;
            bor[bor_adr].write(ralu.read());
            idle.write(1);
        }

        break;

    case a6:
        if (bit1.read())
        {
            m1_adr = ir2.read();
            currentState = a2;
            br.write(m1[m1_adr].read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a3;
            br.write(bor[bor_adr].read());
        }

        break;

    case a7:
        
        {
            currentState = a17;
            pc.write(pc.read()+1);
        }

        break;

    case a8:
        
        {
            currentState = a18;
            pc.write(pc.read()+1);
        }

        break;

    case a9:
        
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a1;
            bor[bor_adr].write(inpr.read());
            idle.write(1);
        }

        break;

    case a10:
        if (ir1_tmp[9])
        {
            currentState = a6;
            ir2.write(br.read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a1;
            bor[bor_adr].write(br.read());
            idle.write(1);
        }

        break;

    case a11:
        
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a1;
            bor[bor_adr].write(br.read());
            idle.write(1);
        }

        break;

    case a12:
        
        {
            ialu_in1 = ir2.read();
            ialu_in2 = br.read();
            currentState = a15;
            ialub(ialu_in1, ialu_in2, ialu);
            rialu.write(ialu);
        }

        break;

    case a13:
        
        {
            currentState = a16;
            ir2.write(br.read());
        }

        break;

    case a14:
        if (bit0.read())
        {
            m1_adr = ir2.read();
            currentState = a1;
            pc.write(m1[m1_adr].read());
            idle.write(1);
        }
        else 
        {
            m1_adr = ir2.read();
            currentState = a2;
            br.write(m1[m1_adr].read());
        }

        break;

    case a15:
        
        {
            currentState = a14;
            ir2.write(rialu.read());
        }

        break;

    case a16:
        if (bit0.read() && ir1_tmp.range(3, 0) == "0000")
        {
            m1_adr = ir2.read();
            currentState = a1;
            pc.write(m1[m1_adr].read());
            idle.write(1);
        }
        else if (!bit0.read() && ir1_tmp.range(3, 0) == "0000")
        {
            m1_adr = ir2.read();
            currentState = a2;
            br.write(m1[m1_adr].read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(3, 0);
            currentState = a12;
            br.write(bor[bor_adr].read());
        }

        break;

    case a17:
        if (ir1_tmp[8] && bit0.read())
        {
            currentState = a1;
            pc.write(ir2.read());
            idle.write(1);
        }
        else if (ir1_tmp[8] && !bit0.read() && bit1.read())
        {
            currentState = a11;
            br.write(ir2.read());
        }
        else if (ir1_tmp[8] && !bit0.read() && !bit1.read())
        {
            bor_adr = ir1_tmp.range(7, 4);
            currentState = a3;
            br.write(bor[bor_adr].read());
        }
        else if (!ir1_tmp[8] && ir1_tmp[9])
        {
            m1_adr = ir2.read();
            currentState = a13;
            br.write(m1[m1_adr].read());
        }
        else if (!ir1_tmp[8] && !ir1_tmp[9] && bit0.read() && ir1_tmp.range(3, 0) == "0000")
        {
            m1_adr = ir2.read();
            currentState = a1;
            pc.write(m1[m1_adr].read());
            idle.write(1);
        }
        else if (!ir1_tmp[8] && !ir1_tmp[9] && !bit0.read() && ir1_tmp.range(3, 0) == "0000")
        {
            m1_adr = ir2.read();
            currentState = a2;
            br.write(m1[m1_adr].read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(3, 0);
            currentState = a12;
            br.write(bor[bor_adr].read());
        }

        break;

    case a18:
        if (bit0.read() && bit1.read())
        {
            currentState = a9;
            inpr.write(data_in.read());
        }
        else if (bit0.read() && !bit1.read() && ir1_tmp[10])
        {
            m0_adr = pc.read();
            currentState = a7;
            ir2.write(m0[m0_adr].read());
        }
        else if (bit0.read() && !bit1.read() && !ir1_tmp[10])
        {
            bor_adr = ir1_tmp.range(3, 0);
            currentState = a1;
            pc.write(bor[bor_adr].read());
            idle.write(1);
        }
        else if (!bit0.read() && ir1_tmp[10])
        {
            m0_adr = pc.read();
            currentState = a7;
            ir2.write(m0[m0_adr].read());
        }
        else if (!bit0.read() && !ir1_tmp[10] && bit1.read())
        {
            bor_adr = ir1_tmp.range(3, 0);
            currentState = a10;
            br.write(bor[bor_adr].read());
        }
        else 
        {
            bor_adr = ir1_tmp.range(3, 0);
            currentState = a4;
            ir2.write(bor[bor_adr].read());
        }

        break;

    }
}

#ifdef MTI_SYSTEMC
SC_MODULE_EXPORT(Funcmi);
#endif

Synthezza logo White 2020.png

PRODUCTS

Synthagate—HLS & RTL

     Synthagate Overview

     What makes Synthagate different

     Examples of High Level and RTL Design

          Synthesis From GUI

          Synthesis From SystemC

          Synthesis From VHDL

Logic Synthesizer

     Overview
     Logic Synthesizer Experiments

     Benchmarks

DESIGN TECHNOLOGY

Algorithmic State machines in HLS

     What is Algorithmic State Machine?

     Time in ASM

     ASM in GUI, System C and VHDL

     ASM Transformations

          Asm Combining

          Asm Minimization

          SubAsm Inclusion

High Level Synthesis

     How Does Synthagate Work

     ASM Creator Short Manual

Synthesis at Register Transfer Level (RTL)

     Data Path

     Control Unit

     Top Design

BOOKS

  

DEMO SERIES

  

COMPANY

     About Us

     Contact US

  

Copyright © 2013 - 2020 Synthezza Corporation. All Rights Reserved

Synthezza logo navy.png