Changes between Version 31 and Version 32 of Other/Summer/2020/FPGAspectrum


Ignore:
Timestamp:
Jul 30, 2020, 12:09:35 AM (4 years ago)
Author:
rgd51
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Other/Summer/2020/FPGAspectrum

    v31 v32  
    244244}}}
    245245
     246== Random Number Generation with LFSR ==
     247{{{#!go
     248\\ Jacob Morin
     249
     250// Call with either 1 or 3 command arguments:
     251// First command argument: amount of loops
     252// Second command argument: start
     253// Third command argument: end
     254package mainimport (
     255    "fmt"
     256    "os"
     257    "strconv"
     258)func lfsr3(sequence chan uint8, start int, end int, repititions int) {
     259    for i := 0; i <= repititions; i++ {
     260        //starting value
     261        var seed uint16 = uint16(i)
     262        //keeps track of the value at any given time
     263        var lfsr uint16 = seed        //number of times it takes for the lfsr to revert to its start state
     264        var period int = 0
     265        //last bit of lfsr
     266        var value uint16 = 0
     267        //number of 0's in lfsr
     268        var numZeros int = 0
     269        //number of 1's in lfsr
     270        var numOnes int = 0        stop := false
     271        //until LFSR goes back to its start state (stop will become true)
     272        for stop != true {
     273            //increments count
     274            period++            //shifts
     275            lfsr ^= lfsr >> 7  //7 right
     276            lfsr ^= lfsr << 9  //9 left
     277            lfsr ^= lfsr >> 13 //13 right            if (period > start) && (period < end) {
     278                //adds last bit to sequence
     279                value = lfsr & 1
     280                if value == 0 {
     281                    numZeros++
     282                    sequence <- 0
     283                }
     284                if value == 1 {
     285                    numOnes++
     286                    sequence <- 1
     287                }
     288            }            //if LFSR reaches startState, make stop true to exit the loop
     289            if lfsr == seed {
     290                stop = true
     291            }
     292        }    }}func main() {    //makes channel for the random number
     293    sequence := make(chan uint8)    //command line
     294    args := os.Args
     295    len := len(args)    //first argument in command line determines how many times to loop
     296    if len > 1 {
     297        repititions, err := strconv.Atoi(args[1])
     298        if err != nil {
     299            fmt.Println("error")
     300        }
     301        // assumed values
     302        start := 6000
     303        end := 7000        // second argument in command line overrides start
     304        // third argument in command line overrides end
     305        if len > 3 {
     306            y, err := strconv.Atoi(args[2])
     307            if err != nil {
     308                fmt.Println("error")
     309            }
     310            start = y            z, err := strconv.Atoi(args[3])
     311            if err != nil {
     312                fmt.Println("error")
     313            }
     314            end = z
     315        }
     316        //calls function
     317        go lfsr3(sequence, start, end, repititions)        printSequence := ""
     318        //Call lfsr3 'repitions' number of times
     319        for i := 1; i <= repititions; i++ {
     320            //number of values per sequences
     321            for j := 0; j < 999; j++ {
     322                //receives and prints value
     323                value := <-sequence
     324                printSequence += strconv.Itoa(int(value))
     325            }            fmt.Println("At", i, "got random number:", printSequence, "\n")
     326            printSequence = ""
     327        }
     328    }}
     329}}}
     330