话说,为什么我又要跑去搞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
不过这个写法有毒,我手点一下按钮过了好多个时钟上升沿,导致和我想的不太一样,不过不管怎样至少是能用了。。先这样吧