Whitney Knitter
Published © GPL3+

DSP for SOMs: Getting Started with DDS & FIR Compiler IPs

This project demonstrates how to use the DDS & FIR Compiler IPs with the new AMD Kria™ KD240 Drives Starter Kit to drive analog peripherals.

IntermediateFull instructions provided2 hours2,207
DSP for SOMs: Getting Started with DDS & FIR Compiler IPs

Things used in this project

Story

Read more

Code

phase_inc_sm.v

Verilog
`timescale 1ns / 1ps

module phase_inc_sm(
    input clk,
    input reset,
    output reg m_axis_phase_tvalid,
    output reg m_axis_phase_tlast,
    input m_axis_phase_tready,
    output reg [31:0] m_axis_phase_tdata
    );

    reg [31:0] carrier_freq;
    reg [31:0] carrier_period;           
    
    // 100 kHz
    parameter carrier_freq_100k = 32'h418938;
    parameter carrier_period_100k = 32'd1000;  
    parameter carrier_freq_incr_100k = 32'h418937;     
    
    // 1 MHz
    parameter carrier_freq_1m = 32'h28F5C29; 
    parameter carrier_period_1m = 32'd100; 
    
    // 10 MHz 
    parameter carrier_freq_10m = 32'h19999990;
    
    // 50 MHz - DO NOT USE
    parameter carrier_freq_50m = 32'h80000000;
    
    parameter carrier_period_100ms = 32'd10000000;
    
    reg [2:0] state_reg;
    reg [31:0] period_wait_cnt;
    reg [3:0] cycle_cnt;
    
    parameter init               = 3'd0;
    parameter SetCarrierFreq     = 3'd1;
    parameter SetTvalidHigh      = 3'd2;
    parameter SetSlavePhaseValue = 3'd3;
    parameter CheckTready        = 3'd4;
    parameter WaitState          = 3'd5;   
    parameter SetTlastHigh       = 3'd6;
    parameter SetTlastLow        = 3'd7;
    
    parameter default_tdata      = 32'h0;
    
    always @ (posedge clk)// or posedge reset)
        begin                    
            // Default Outputs   
            
            if (reset == 1'b0)
                begin
                    m_axis_phase_tdata[31:0] <= default_tdata;
                    cycle_cnt <= 4'd0;
                    state_reg <= init;
                end
            else
                begin
                    case(state_reg)
                        init : //0
                            begin
                                cycle_cnt <= 4'd0;
                                period_wait_cnt <= 32'd0;
                                m_axis_phase_tlast <= 1'b0;
                                m_axis_phase_tvalid <= 1'b0;
                                carrier_freq <= 32'h0;
                                state_reg <= SetCarrierFreq;// WaitForStart;
                            end
                            
                        SetCarrierFreq : //1
                            begin         
                                if (carrier_freq > carrier_freq_10m) 
                                    begin
                                        carrier_freq <= carrier_freq_1m;
                                    end
                                else
                                    begin
                                        carrier_freq <= carrier_freq + carrier_freq_1m;
                                    end
                                
                                carrier_period <= carrier_period_1m;
                                state_reg <= SetTvalidHigh;
                            end
                            
                        SetTvalidHigh : //2
                            begin
                                m_axis_phase_tvalid <= 1'b1; //per PG141 - tvalid is set before tready goes high
                                state_reg <= SetSlavePhaseValue;
                            end
                            
                        SetSlavePhaseValue : //3
                            begin
                                m_axis_phase_tdata[31:0] <= carrier_freq;
                                state_reg <= CheckTready;
                            end
                            
                        CheckTready : //4
                            begin
                                if (m_axis_phase_tready == 1'b1)
                                    begin
                                        state_reg <= WaitState;
                                    end
                                else    
                                    begin
                                        state_reg <= CheckTready;
                                    end
                            end
                            
                        WaitState : //5
                            begin
                                if (period_wait_cnt >= carrier_period)
                                    begin
                                        period_wait_cnt <= 32'd0; 
                                        state_reg <= SetTlastHigh;
                                    end
                                else
                                    begin
                                        period_wait_cnt <= period_wait_cnt + 1;
                                        state_reg <= WaitState;
                                    end
                            end
                            
                        SetTlastHigh : //6
                            begin
                                m_axis_phase_tlast <= 1'b1;
                                state_reg <= SetTlastLow;
                            end
                            
                        SetTlastLow : //7
                            begin
                                m_axis_phase_tlast <= 1'b0;
                                state_reg <= SetCarrierFreq; 
                            end
                            
                    endcase 
                end
        end
endmodule

lpf_fir.coe

Plain text
Radix=10;
CoefData=
-255,
-260,
-312,
-288,
-144,
153,
616,
1233,
1963,
2739,
3474,
4081,
4481,
4620,
4481,
4081,
3474,
2739,
1963,
1233,
616,
153,
-144,
-288,
-312,
-260,
-255

bpf_fir.coe

Plain text
Radix=10;
CoefData=
132,
-57,
-61,
-65,
-60,
-45,
-24,
-6,
-8,
-40,
-106,
-196,
-285,
-336,
-310,
-178,
68,
401,
766,
1080,
1251,
1202,
890,
328,
-410,
-1199,
-1884,
-2309,
-2358,
-1981,
-1214,
-175,
953,
1962,
2659,
2907,
2659,
1962,
953,
-175,
-1214,
-1981,
-2358,
-2309,
-1884,
-1199,
-410,
328,
890,
1202,
1251,
1080,
766,
401,
68,
-178,
-310,
-336,
-285,
-196,
-106,
-40,
-8,
-6,
-24,
-45,
-60,
-65,
-61,
-57,
132

hpf_fir.coe

Plain text
Radix=10;
CoefData=
109,
1,
12,
-33,
-140,
-256,
-298,
-209,
2,
275,
517,
632,
550,
247,
-222,
-722,
-1073,
-1111,
-761,
-88,
716,
1382,
1662,
1415,
673,
-358,
-1351,
-1972,
-1987,
-1360,
-272,
934,
1865,
2214,
1865,
934,
-272,
-1360,
-1987,
-1972,
-1351,
-358,
673,
1415,
1662,
1382,
716,
-88,
-761,
-1111,
-1073,
-722,
-222,
247,
550,
632,
517,
275,
2,
-209,
-298,
-256,
-140,
-33,
12,
1,
109

Credits

Whitney Knitter

Whitney Knitter

156 projects • 1574 followers
All thoughts/opinions are my own and do not reflect those of any company/entity I currently/previously associate with.

Comments