From Python to silicon
 

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

projects:gcictestbench [2008/07/31 06:04]
cfelton created
projects:gcictestbench [2008/07/31 06:05] (current)
cfelton
Line 1: Line 1:
 <code myhdl> <code myhdl>
- @instance+def cmdLineTestBench(run='trace', M=1, D=5, R=50, Q=7, Type=None): 
 +    """ 
 +    This is the simulation and conversion function for the CIC filter. 
 + 
 +    Inputs 
 +      run  --  Simulation or coversion type 
 +      M    --  Order of the CIC filter 
 +      D    --  Delay of the Comb Filter 
 +      R    --  Decimation/Interpolation size 
 +      Q    --  Quantization size of input word 
 +    """ 
 +    global MaxGain 
 + 
 +    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 +    # Parameters / Globals 
 +    MaxGain = D**M      # Max gain of the CIC 
 +    L = 2**(Q)          # Max value for input 
 +    maxV = L * MaxGain  # Max Value for output 
 +    minV = -maxV        # Min Value for output 
 + 
 +    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 +    # Signals 
 +    clk = Signal(False) 
 +    rst = Signal(False) 
 + 
 +    x = Signal(intbv(0, min=-L, max=L)) 
 +    y = Signal(intbv(0, min=minV, max=maxV)) 
 + 
 +    dvi = Signal(True) 
 +    dvo = Signal(False) 
 + 
 +    xcnt  = Signal(0) 
 +    N_CLK = 0 
 +     
 +    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 +    # Instantiate MyHDL simulation and coversion functions 
 +    if run == 'trace': 
 +        dut = traceSignals(cic, clk, rst, x, dvi, y, dvo, M, D, R) 
 +    elif run == 'ver': 
 +        toVerilog(cic, clk, rst, x, dvi, y, dvo, M, D, R) 
 +        return None 
 +    elif run == 'vhd': 
 +        toVHDL(cic, clk, rst, x, dvi, y, dvo, M, D, R) 
 +    else: 
 +        dut = cic(clk, rst, x, dvi, y, dvo, M, D, R) 
 + 
 +    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 +    # Stimulus 
 +    @always(delay(1))     
 +    def clkgen(): 
 +        clk.next = not clk 
 + 
 +    @always(clk.posedge) 
 +    def ist(): 
 +         
 +        # Generate Input samples 
 +        if xcnt >= N_CLK: 
 +            x.next = int(L*uniform(-1,1)) 
 +            dvi.next = True 
 +            xcnt.next = 0 
 +        else: 
 +            x.next = 0 
 +            dvi.next = False 
 +            xcnt.next = xcnt + 1 
 + 
 +                      
 +    @instance
     def stimulus():     def stimulus():
         """         """
Line 34: Line 100:
         favg = favg / Nloops         favg = favg / Nloops
         xfavg = xfavg / Nloops         xfavg = xfavg / Nloops
 +
 +    
 +        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +        # Plot responses
 +        xa = 2*pi * np.arange(Nfft)/Nfft - pi
 +        plt.ioff()
 +        plt.plot(xa, fftshift(20*log10(favg/MaxGain)) )
 +        plt.plot(xa, fftshift(20*log10(xfavg)) ) 
 +        plt.title('CIC Filter Frequency Response')
 +        plt.savefig('plots/myhdl_cic_freq_response_M%d_D%d_R%d.png' % (M,D,R) )
 +        plt.close('all')
 +
 +        print MaxGain
 +        xrsp = 20*log10(favg/MaxGain) - 20*log10(xfavg)
 +        plt.plot(xa, fftshift(xrsp) )
 +        #plt.plot(xa, fftshift(20*log10(xfavg)) ) 
 +        plt.title('CIC Filter Frequency Response Gain Removed, Output * 1/D')
 +        plt.ylabel('Amplitude dB')
 +        plt.xlabel('Normailzed Frequency radians')
 +        plt.axis([ -pi, pi, -60, 0])
 +        plt.savefig('plots/myhdl_cic_freq_response2_M%d_D%d_R%d.png' % (M,D,R) )
 +        plt.close('all')
 +
 +        # Plot the expected response
 +        num = np.zeros(D+1)
 +        num[0] = 1
 +        num[D] = -1        
 +        den = [1, -1]
 +        print num, den
 +        
 +        w,H = freqz(num, den)
 +        Hplt = 20*log10(abs(H[1:]))
 +        plt.plot(w[1:],  Hplt)
 +        plt.title('CIC Filter Frequency Response freqz')
 +        plt.axis([ 0, pi, -60, max(Hplt) + 2])
 +        plt.ylabel('Amplitude dB')
 +        plt.xlabel('Normailzed Frequency radians')
 +        plt.savefig('plots/freqz_cic_freq_response_M%d_D%d.png' % (M,D) )
 +        plt.close('all')
 +
 +        Hplt = 20*log10(abs(H[1:]/D))
 +        plt.plot(w[1:],  Hplt)
 +        plt.title('CIC Filter Frequency Response freqz')
 +        plt.axis([ 0, pi, -60, max(Hplt) + 2])
 +        plt.ylabel('Amplitude dB')
 +        plt.xlabel('Normailzed Frequency radians')
 +        plt.savefig('plots/freqz_cic_freq_response2_M%d_D%d.png' % (M,D) )
 +        plt.close('all')
 +        
 +        raise StopSimulation
 +
 +    return clkgen, stimulus, ist, dut
 +
 </code> </code>
projects/gcictestbench.txt · Last modified: 2008/07/31 06:05 by cfelton
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki