Showing posts with label Assembly programming assignment. Show all posts
Showing posts with label Assembly programming assignment. Show all posts

Tuesday, August 4, 2009

Convolution Computer Architecture Assignment

1) Write an assembly language program in MIPS32 assembly language to

a) Input two one-dimensional arrays of size L and M.

b) Compute the convolution of the above entered arrays.

c) Print the answer y and plot the graphs of x, h and y

Given:

1) Discrete Convolution of two functions x and h is given by the following formula

clip_image002

Where N = L + M -1

2) L=4 and M = 5

3) Choose any integer values for array elements

# Write an assembly language program in MIPS32 assembly language to find
# Discrete Convolution of two functions  x and h     
# Author - Sunil Doiphode

        .data         # data declaration section

funx:     .word 0 : 8 # array one address x()
funh:    .word 0    : 8 # array two address h()
funy:     .word 0 : 8 # array two address y()
sizex:     .word 4     # Size of array 1 (L)
sizeh:  .word 5     # size of array 2 (M)
sizey:     .word 9        # size of resulting array (N)

        .text          # program steps starts

#read First Array X(n)

        la $t0,funx         # load array xn address
        la $t5,sizex           # load size of array address
        lw $t4,0($t5)       # load array size number to tmp counter
        lw $t5, 0($t5)      # load array size
loop1:    li $v0,5             # set readint instruction
        syscall                # call the system call
        sw   $v0, 0($t0)      # store the read value
        addi $t0, $t0, 4      # increment the array address to the next location
        addi $t4, $t4, -1     # decrement the counter
        bgtz $t4, loop1      # loop1

# Read Second array h(n)

        la $t0,funh         # load array hn address
        la $t6, sizeh        # load size of array address
        lw $t4, 0($t6)       # load array size number to tmp variable
        lw $t6, 0($t6)        # load array size number
loop2:        li $v0,5         # set readint instruction
        syscall                # call the system call
        sw   $v0, 0($t0)     # store the read value
        addi $t0, $t0, 4      # increment the array address to the next location
        addi $t4, $t4, -1     # decrement the counter
        bgtz $t4, loop2      # loop2

# N = L + M -1

        add $t4,$t5,$t6       # N = L + M
        addi $t3,$t4,-1       # N = L + M -1 (Hold value) -- N  ---   t3
# t7 = x(k) & t8 = h(n-k)
        sub $t4,$t4,$t4     # (Counter yn initialised to zero ---   t4
           la $t0,sizey         # load array size address 
          lw $s4,0($t0)       # load yn array size to tmp ynloopcount
        lw $t5,0($t0)       # load yn array size
        la $s7,funy            #---------------------------yaddress -- t7
loop3:    la $t7,funx         #---------------------------xaddress -- t7
         la $t8,funh         #-------------------------- haddress -- t8
         li $t9, 0             # summation count k =0------------- k --t9
        addi $s0,$t3,0         # summation loopcount = N
        li $s3,0             # summation amt -------summation amt ---s3

# nested loop loop4

loop4:    sub $s1,$t4, $t9      # s1 =  ----------------------- n-k --- s1

# (n-k) should be greater than 0 if less than zero jump to skip
        li $s5, 0
        slt $s6, $s5, $s1     # slt d,s,t if s < t d <-- 1 else  d <-- 0
        blez $s6, skip

        li $s2,4
        mul $s1,$s2,$s1
         add $s6, $t8, $s1     # address of n-kth location

        lw $s6, 0($s6)        # s6 = x(n-k)
        multu $s2,$t9       
        mflo $s1
        add $s5,$t7, $s1
        lw $s5, 0($s5)        # s5 = h(k)
        multu $s6,$s5       
        mflo $s1            # s1= h(k)*x(n-k)
        add $s3,$s3,$s1        # Add the result to summation

skip:     addi $t9,$t9,1        # increment the index counter
        addi $s0,$s0,-1        # decrement the loop counter
        bgtz $s0, loop4      # End of summation loop4
        # store the yn values in the array

        li $s2,4
        multu $t4,$s2
         mflo $s1 
        add $s1,$s7, $s1
        sw $s3, 0($s1)
        addi $t4, $t4, 1
        addi $s4, $s4, -1
        bgtz $s4, loop3        # End of loop3

# print y(n)

        la $t0,funy         # load array xn address
        la $t5, sizey        # load size of array address
        lw $t4, 0($t5)       # load array size number to tmp counter
        lw $t5, 0($t5)      # load array size
loop5:    lw $a0, 0($t0)

        li $v0,1            # set writeint instruction
        syscall                # call the system call
        addi $t0, $t0, 4      # increment the array address to the next location
        addi $t4, $t4, -1     # decrement the counter
        bgtz $t4, loop5      # End of printing loop5

 mips

Input1 X=2,2,2,2

H=2,2,2,2,2

Y= 0,4,8,12,16,12,8,4,0

convolution

Input2 X=1,2,3,4

H=1,2,3,4,5

Y= 0,2,7,16,30,34,31,20,0

Digital Signal Processing

Input3 X=4,3,2,1

H=5,4,3,2,1

Y= 0,16,24,25,20,10,4,1,0

Followers