vc709时钟信号报单端信号错误的记录

话说,为什么我又要跑去搞fpga玩了,不是应该招个有经验的开发人员么?大概是练度不够吧……

Xilinx这个板子阿,真鸡儿贵,我这还没啥基础,慢慢试吧:

看了乱七八糟各种文档先不提,我还是决定先控制LED玩玩,应该挺简单吧

首先写了段verilog:

module test(clk_p,
rst,
data);
input clk_p;
input[4:0] rst;
output reg[7:0] data;

always @(posedge clk_p) begin
  ……
end
endmodule

然后指定引脚,把clk_p指定成user_clock_p,执行synthesis和implemention都没啥问题,但是一生成bitstream就报错,说是IOstandard不能为default。。。但是讲道理啊,我查了文档user_clock_p是LVDS,选项里没这个啊。

好吧,直接手动改一下DXC约束文件:

set_property PACKAGE_PIN AK34 [get_ports clk_p]
set_property IOSTANDARD LVDS [get_ports clk_p]

这回试试,结果又说什么clk_p是is Single-Ended but has an IOStandard of LVDS which can only support Differential,这怎么可楞,别人都这么写的啊?查了半天发现现在时钟信号要加缓冲器,不然会被vivado自动优化成单端信号进行处理报错,MDZZ

最后变成这样终于对了:

module test(clk_p,
clk_n,
rst,
data);
input clk_p;
input clk_n;
input[4:0] rst;
output reg[7:0] data;

IBUFDS #(.IOSTANDARD("LVDS")) IBUFDS_inst (.O (cl1),
.I (clk_p), 
.IB (clk_n));

always @(posedge cl1) begin
  if (rst[0]) begin
    data = 0;
  end
  if (rst[1]) begin
    data = data << 1;
  end
  if (rst[2]) begin
    data = data - 1;
  end
  if (rst[3]) begin
    data = data >> 1;
  end
  if (rst[4]) begin
    data = data + 1;
  end
end
endmodule

不过这个写法有毒,我手点一下按钮过了好多个时钟上升沿,导致和我想的不太一样,不过不管怎样至少是能用了。。先这样吧

原文地址:https://www.cnblogs.com/gaoze/p/6483308.html