HMC7044芯片配置(图文+解析+代码仿真)

详细代码及仿真源文件已同步上传至个人主页资源(原创不易,转载请注明出处)

目录

模块图

代码实现

时序图

仿真图

HMC7044介绍

一、概述

        HMC7044是带有 JESD204B 接口的高性能、3.2 GHz、14 路输出抖动衰减器,提供 14 路低噪声且可配置的输出,可以灵活地与许多不同器件接口,包括数据转换器、现场可编程门阵列(FPGA)和混频器本振(LO)。

查阅官方手册,这里我们需要关心的是:

1.查找SPI总线频率

2.SPI的发送时序,发送模式,发送多少数据

由官网手册可知,每次通过SPI发送24bit数据,且SPI工作模式为模式0

模块图

模块分析:

PLL模块:用于生成所需时钟,这里低于10MHZ即可,本实验设置为5MHZ

SPI_send模块:用于发送配置的24bit数据

SPI_ctrl模块:用于对所需要发送的数据进行控制,以满足HMC7044芯片的时序要求

代码实现

module spi_send(

    input   wire    div_clk     ,//分频时钟5MHz
    input   wire    sys_rst_n   ,//复位信号,低电平有效
    input   wire    str_flag    ,//开始标志信号
    input   wire    [23:0]data  ,//数据24位
/*     input   wire    spi_done    ,//全部配置完成信号 */
    
    output  reg     slen        ,//cs#片选信号,低电平有效
    output  wire    sclk        ,//spi传输时钟
    output  reg     sdata       ,//spi传输数据,MSB
    output  reg     send_done                             
);

/**************define code*********************/
    parameter   IDLE    =   5'd0    ,
                S0      =   5'd1    ,
                S1      =   5'd2    ,
                S2      =   5'd3    ,
                S3      =   5'd4    ;
    
    reg[2:0] state      ;//状态机5个状态
    reg[4:0] cnt_bit    ;//对数计数0-23
    reg clk_en          ;//时钟使能信号
    wire div_clk_n      ;//对分频时钟取反
/**************main code*********************/
//describe div_clk_n

    assign div_clk_n = ~div_clk ;
    
//describe cnt_bit
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)
                cnt_bit <= 5'd0 ;
            else    if(cnt_bit == 5'd25)
                cnt_bit <= 5'd0 ;
            else    if(state == S1)
                cnt_bit <= cnt_bit + 1'd1   ;
        end
    
//describe clk_en
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)
                clk_en <= 1'd0 ;
            else    if(((cnt_bit >= 5'd0) && (cnt_bit <= 5'd23))&&(state == S1)) 
                clk_en <= 1'd1 ;
            else    
                clk_en <= 1'd0 ;
        end
    
//两段式状态机,第一段,时序逻辑,描述状态转移
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)
                state <= IDLE   ;
            else    case(state)
                IDLE    :
                    begin
                        if(str_flag)
                            state <= S0 ;
                        else
                            state <= state  ;
                    end
                S0      :   state <= S1 ;
                S1      :
                    begin
                        if(cnt_bit == 5'd24)
                            state <= S2 ;
                        else
                            state <= state  ;
                    end
                S2      :   state <= S3 ;
                S3      :   
                    begin
                        if(send_done)
                            state <= IDLE   ;
                        else
                            state <= state  ;
                    end
                default :   state <= IDLE   ;
                endcase
        end

//第二段,时序逻辑,描述输出
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)
                slen <= 1'd1    ;
            else    if(str_flag)
                slen <= 1'd0    ;
            else    if(state == S2)
                slen <= 1'd1    ;
            else
                slen <= slen    ;
        end
//describe sclk    
    assign sclk = (clk_en == 1'd1) ? div_clk_n : 1'd0    ;
    
//describe sdata    
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)
                sdata <= 1'd0  ;
            else    case(cnt_bit)
                5'd1    :   sdata <=    data[23]    ;//MSB
                5'd2    :   sdata <=    data[22]    ;
                5'd3    :   sdata <=    data[21]    ;
                5'd4    :   sdata <=    data[20]    ;
                5'd5    :   sdata <=    data[19]    ;
                5'd6    :   sdata <=    data[18]    ;
                5'd7    :   sdata <=    data[17]    ;
                5'd8    :   sdata <=    data[16]    ;
                5'd9    :   sdata <=    data[15]    ;
                5'd10   :   sdata <=    data[14]    ;
                5'd11   :   sdata <=    data[13]    ;
                5'd12   :   sdata <=    data[12]    ;
                5'd13   :   sdata <=    data[11]    ;
                5'd14   :   sdata <=    data[10]    ;
                5'd15   :   sdata <=    data[9]     ;
                5'd16   :   sdata <=    data[8]     ;
                5'd17   :   sdata <=    data[7]     ;
                5'd18   :   sdata <=    data[6]     ;
                5'd19   :   sdata <=    data[5]     ;
                5'd20   :   sdata <=    data[4]     ;
                5'd21   :   sdata <=    data[3]     ;
                5'd22   :   sdata <=    data[2]     ;
                5'd23   :   sdata <=    data[1]     ;
                5'd24   :   sdata <=    data[0]     ;
            default :   sdata <= 1'd0   ;
            endcase
        end
        
//describe send_done    
    always@(posedge div_clk , negedge sys_rst_n)
        begin
            if(~sys_rst_n)        
                send_done <= 1'd0   ;
            else    if(state == S2)
                send_done <= 1'd1   ;
            else    
                send_done <= 1'd0   ;
        end
        
endmodule

由于篇幅有限,其他模块已经上传至个人主页资源

时序图

参考SPI发送数据时序,将数据位改为24bit即可

仿真图

可以看到FPGA通过SPI发送了8'h98条数据进行HMC7044配置,当配置完成的时候,进行正常工作,即配置完成

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢牛牛(FPGA学习版)

赏钱虽少情意重,为你才艺而喝彩

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值