项目背景:
在时钟同步或类似时钟方案系统,需要用到一些时钟芯片,LMK2572就是一款频率带宽覆盖广的芯片。
项目介绍:
LMK2572该器件是一个低功耗、高性能的宽带合成器,可生成 13MHz 到 6.4GHz 的任何频率,而无需使用内部倍频器。该 PLL 可提供优异的性能,而 3.3V 单电源中的电流消耗仅为 75mA。此器件支持 JESD204B 标准(它可以生成或重复 SYSREF 信号),是测量高速数据转换器速度的理想之选。通过提供 SYNC 信号,用户可以跨多个 LMX2572 器件同步输出相位。LMX2572 还可以生成频率斜升,并可将其在此评估模块进行演示。此外,LMX2572 还支持直接数字 FSK 调制。为此,可以将串行接口配置为 SPI 或 I2S 接口。
本方案以SPI配置接口为例,对LMK2572进行配置。
通讯接口分析:
直接上时序图,把时序图分析清楚了,设计方案也就差不多完成了。
根据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.文章来源:https://www.toymoban.com/news/detail-642671.html
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模板网!