利用lattice diamond制作基于小脚丫FPGA的频率和相位差测量的代码
时间: 2023-05-27 20:02:24 浏览: 257
在Lattice Diamond中,首先需要创建一个新的工程,选择对应的FPGA器件型号,然后添加适当的约束文件和设计文件。以下是一个基于iCE40UP5K器件的频率和相位差测量的简单示例设计。
约束文件
仅需要约束输入时钟信号和输出数据信号的引脚。
```
# Clock constraints
set_location_assignment PIN_35 -to clk_i
set_io clk_i !PIN_35
# Output data constraints
set_location_assignment PIN_45 -to data_out
set_io data_out !PIN_45
```
设计文件
设计包括一个简单的计数器和两个相位差测量器件来测量两个不同频率的输入信号之间的相位差。该设计在每个时钟周期内将输入信号的触发点作为相位参考,并将其与前一个周期的触发点进行比较,从而计算相位差值。
```
module freq_phase_meter(
input wire clk_i,
input wire [1:0] data_i,
output reg [15:0] data_out
);
reg [15:0] count_reg1;
reg [15:0] count_reg2;
wire trigger1;
wire trigger2;
wire[31:0] phase_delta1;
wire[31:0] phase_delta2;
// Divide input clock by 2 and 3
assign trigger1 = (count_reg1 == 32767);
assign trigger2 = (count_reg2 == 21845);
always @(posedge clk_i)
begin
if (trigger1) count_reg1 <= 0;
else count_reg1 <= count_reg1 + 1;
if (trigger2) count_reg2 <= 0;
else count_reg2 <= count_reg2 + 1;
end
// Phase measurement
freq_phase_detector #(
.WIDTH(32),
.PERIOD1(32767),
.PERIOD2(21845)
) phase_detector1 (
.clk_i(clk_i),
.trigger_i(trigger1),
.phase_delta_o(phase_delta1)
);
freq_phase_detector #(
.WIDTH(32),
.PERIOD1(32767),
.PERIOD2(14563)
) phase_detector2 (
.clk_i(clk_i),
.trigger_i(trigger2),
.phase_delta_o(phase_delta2)
);
// Output phase difference between input signals
always @(posedge clk_i)
begin
data_out <= phase_delta1[15:0] - phase_delta2[15:0];
end
endmodule
module freq_phase_detector(
input wire clk_i,
input wire trigger_i,
output wire [$clog2(WIDTH)-1:0] phase_delta_o // $clog2(WIDTH) is the number of bits needed to represent WIDTH
);
reg [31:0] phase_reg;
always @(posedge clk_i)
begin
if (trigger_i)
phase_reg <= 0;
else
phase_reg <= phase_reg + 1;
end
// Output phase difference between last two trigger points
assign phase_delta_o = (phase_reg - WIDTH);
endmodule
```
以上代码可以将两个不同频率的输入信号连接到data_i[1:0] 引脚上,输出测量的相位差值将在每个时钟周期下更新到data_out[15:0] 引脚上。
注意:在实际应用中,需要针对特定的输入信号频率和初始相位设置PERIOD1、PERIOD2参数,以便进行准确的相位差测量。
最后,使用Lattice Diamond中的“Build”选项将设计合成并生成位文件,然后将位文件烧录到FPGA器件上即可进行测试。
阅读全文