lattice ram_dp 读写的延时关系,以及怎么在代码中巧妙利用规则

3 篇文章 0 订阅

以1080P图像存储为例

1、使能像素点:1921位,而不是1920位

2、地址有效位1920位:从0开始到1919结束

3、写入延迟:写入内部ram延迟1T

4、读出延迟:2T(且最后一位还得是 使能高才能读出),有时会延时1个周期,是因为数据有延迟,第一个数不稳定,所以使用第二个数。

5、关掉使能后:任然会输出最后一个地址的数,ram内部寄存器寄存了,写代码的时候要格外注意。

6、使能程序

always@(posedge mclk or negedge rst_n)begin
    if(!rst_n)
        ram_rden <= 0;
    else
        if(cnt_y>=1 && cnt_y<=1081 && (cnt_x<=276 || cnt_x >= 2198))       // 起始和终止
            ram_rden <= 0;    
        else if(cnt_y>=1 && cnt_y<=1081 && cnt_x >=277 && cnt_x <= 2197)   // 1921(读出 延迟连个时钟周期,且最后一位还得多保留一个使能)
            ram_rden <= 1;
        else 
            ram_rden <= 0;
end 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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器件上即可进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值