基于LMK2572的FPGA逻辑实现

这篇具有很好参考价值的文章主要介绍了基于LMK2572的FPGA逻辑实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目背景:

在时钟同步或类似时钟方案系统,需要用到一些时钟芯片,LMK2572就是一款频率带宽覆盖广的芯片。

项目介绍:

LMK2572该器件是一个低功耗、高性能的宽带合成器,可生成 13MHz 到 6.4GHz 的任何频率,而无需使用内部倍频器。该 PLL 可提供优异的性能,而 3.3V 单电源中的电流消耗仅为 75mA。此器件支持 JESD204B 标准(它可以生成或重复 SYSREF 信号),是测量高速数据转换器速度的理想之选。通过提供 SYNC 信号,用户可以跨多个 LMX2572 器件同步输出相位。LMX2572 还可以生成频率斜升,并可将其在此评估模块进行演示。此外,LMX2572 还支持直接数字 FSK 调制。为此,可以将串行接口配置为 SPI 或 I2S 接口。  

本方案以SPI配置接口为例,对LMK2572进行配置。

通讯接口分析:

直接上时序图,把时序图分析清楚了,设计方案也就差不多完成了。

基于LMK2572的FPGA逻辑实现,FPGA经典实战案例,fpga开发

 

根据SPI协议,SPI模式分为四种,其实记不住是四种也没关系。不是很关键,仔细分析时序图就可以了。因为芯片没有SDO,所以手册说也可以是I2C,其实这些都不重要。重要是逻辑控制要按照手册时序来,管他属于什么协议。

设计过程:

梳理下端口资源

FPGA固定:时钟,复位。

用户接口:读写命令,地址数据信息;结束完成信号。

物理接口:SCK,SDI;CS; 

input             clk_i,    

    input             rst_i,   

    input [1:0]       en_sig_i,     

    input [7:0]      cmdword_i,  

    input [15:0]       w_data_i,   

    output reg [15:0]  r_data_o = 0, 

    output            reg done_sig_o = 0,   

    output reg sclk_o = 0,             

    output reg scsn_o = 1'b1,

首先更具SCK与系统时钟的关系,进行分频。

在收到读写指令后,开始用计数的方法进行法分频。关键代码如下。

if(en_sig_i == 2'b01 || en_sig_i == 2'b10)  //read and write enable sclk_o low power
        begin
            busy <= 1'b1;
            cnt <= cnt + 1'b1;
            if(cnt == 4'd4)   //rising edge
                sclk_o <= 1'b1;                                        
            else if(cnt == 4'd9) //falling edge
                begin cnt <= 0;sclk_o <= 1'b0;end
        end

最后进行状态机跳转设计:

读写分开设计:

状态31:当第一个时钟下降沿时跳转。

状态0:cnt=7时,cs生效,条状到1;

状态1:cnt=9上,发送cm24;、

状态24,地址加数据发送完毕。

状态25.

else if(en_sig_i == 2'b01)  //write
             case(fsm)
                31:begin
                    done_sig_o <= 1'b0;
                    if(cnt == 9) begin  //needed for finding the sclk_o edging
                        tri_dir <= 1'b1;
                        fsm <= 0;
                    end
                    else
                        fsm <= 31;
                end
                0:begin                       
                    if(cnt==7)
                        scsn_o <= 1'b0;
                    else if(cnt == 9)
                        begin fsm <= 1; sdo_o <= w_cmd[23];end
                    else
                        fsm <= 0;               
                end
                1:begin
                     if(cnt==9) 
                       begin fsm <= 2;sdo_o <= w_cmd[22];end
                     else 
                        fsm <= 1;
                end
                2:begin
                     if(cnt==9) 
                        begin fsm <= 3;sdo_o <= w_cmd[21];end
                     else 
                        fsm <= 2;
                end                    
                3:begin
                     if(cnt==9) 
                        begin fsm <= 4;sdo_o <= w_cmd[20];end
                     else 
                        fsm <= 3;
                end                    
                4:begin
                     if(cnt==9) 
                        begin fsm <= 5;sdo_o <= w_cmd[19];end
                     else 
                        fsm <= 4;
                end
                5:begin
                     if(cnt==9) 
                        begin fsm <= 6;sdo_o <= w_cmd[18];end
                     else 
                        fsm <= 5;
                end                    
                6:begin
                     if(cnt==9) 
                        begin fsm <= 7;sdo_o <= w_cmd[17];end
                     else 
                        fsm <= 6;
                end                    
                7:begin
                     if(cnt==9) 
                        begin fsm <= 8;sdo_o <= w_cmd[16];end
                     else 
                        fsm <= 7;
                end    
                8:begin
                     if(cnt==9) 
                        begin fsm <= 9;sdo_o <= w_cmd[15];end
                     else 
                        fsm <= 8;
                end                                                                       
                9:begin
                     if(cnt==9) 
                        begin fsm <= 10;sdo_o <= w_cmd[14];end
                     else 
                        fsm <= 9;
                end                                                                                
                10:begin
                     if(cnt==9) 
                        begin fsm <= 11;sdo_o <= w_cmd[13];end
                     else 
                        fsm <= 10;
                end
                11:begin
                     if(cnt==9) 
                        begin fsm <= 12;sdo_o <= w_cmd[12];end
                     else 
                        fsm <= 11;
                end                    
                12:begin
                     if(cnt==9) 
                        begin fsm <= 13;sdo_o <= w_cmd[11];end
                     else 
                        fsm <= 12;
                end                    
                13:begin
                     if(cnt==9) 
                        begin fsm <= 14;sdo_o <= w_cmd[10];end
                     else 
                        fsm <= 13;
                end                    
                14:begin
                     if(cnt==9) 
                        begin fsm <= 15;sdo_o <= w_cmd[9];end
                     else 
                        fsm <= 14;
                end                    
                15:begin
                     if(cnt==9) 
                        begin fsm <= 16;sdo_o <= w_cmd[8];end
                     else 
                        fsm <= 15;
                end
                16:begin
                     if(cnt==9) 
                        begin fsm <= 17;sdo_o <= w_cmd[7];end
                     else 
                        fsm <= 16;
                end
                17:begin
                     if(cnt==9) 
                        begin fsm <= 18;sdo_o <= w_cmd[6];end
                     else 
                        fsm <= 17;
                end                    
                18:begin
                     if(cnt==9) 
                        begin fsm <= 19;sdo_o <= w_cmd[5];end
                     else 
                        fsm <= 18;
                end                    
                19:begin
                     if(cnt==9) 
                        begin fsm <= 20;sdo_o <= w_cmd[4];end
                     else 
                        fsm <= 19;
                end
                20:begin
                     if(cnt==9) 
                        begin fsm <= 21;sdo_o <= w_cmd[3];end
                     else 
                        fsm <= 20;
                end
                21:begin
                     if(cnt==9) 
                        begin fsm <= 22;sdo_o <= w_cmd[2];end
                     else 
                        fsm <= 21;
                end
                22:begin
                     if(cnt==9) 
                        begin fsm <= 23;sdo_o <= w_cmd[1];end
                     else 
                        fsm <= 22;
                end                    
                23:begin
                     if(cnt==9) 
                        begin fsm <= 24;sdo_o <= w_cmd[0];end
                     else 
                        fsm <= 23;
                end   
                24:begin
                     if(cnt==9) 
                        begin fsm <= 25;sdo_o <= 0;end
                     else 
                        fsm <= 24;
                end                  
                25:begin
                     if(cnt==2) 
                        begin fsm <= 26;scsn_o <= 1'b1;tri_dir <= 1'b0;end
                     else 
                        fsm <= 25;
                end
                26:begin
                    if(cnt_dly < 8'd200)  //necessary for device to deal
                        begin
                            fsm <= 26;
                            cnt_dly <= cnt_dly + 1'b1;
                         end
                     else
                        begin
                          fsm <= 27;
                          cnt_dly <= 0;
                        end
                end    
                27:begin
                    done_sig_o <= 1'b1;fsm <= 28;
                end   
                28:begin
                    done_sig_o <= 1'b0;fsm <= 31;
                end 
                default:begin
                    fsm <= 31;
                end                                              
                endcase

读部分情况类似,可参照写部分执行。文章来源地址https://www.toymoban.com/news/detail-642671.html

到了这里,关于基于LMK2572的FPGA逻辑实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包