首先,创建新项目,在项目内建立流水灯源文件,编写代码如下(代码功能已经标注)
module source_WallterfallLight(clk,reset,led);
input clk;
input reset;
output led;
reg [7:0] led;
reg [31:0] counter;
reg [1:0] state; // 表示计数是否计满
// 计数器程序
always @(posedge clk or negedge reset)
begin
if (!reset)
begin
counter <= 32'd0; // 复位端下降沿到来,计数器清零
end
else if (counter == 32'd100_000_000)
begin
counter <= 32'd0; // 计数器满100M清零
end
else
begin
counter <= counter + 32'd1;
end
end
// 状态量程序
always @(posedge clk or negedge reset)
begin
if (!reset)
begin
state <= 2'b00; // 2'b00表示清零状态
end
else if (counter == 32'd0)
begin
state <= 2'b11; // 2'b11表示开始计数状态
end
else
begin
state <= 2'b01; // 2'b01表示计数中状态
end
end
// led程序
always @(posedge clk or negedge reset)
begin
if (!reset)
begin
led <= 8'b0; // 复位端下降沿到来,led全灭
end
else if (state == 2'b11) // 当state处于开始计时状态,led进行变化
begin
if (led == 8'b0)
begin
led <= 8'b0000_0001; // 上一步清零,则led为8'b0000_0001
end
else if (led == 8'b1000_0000)
begin
led <= 8'b0000_0001; // 上一步led == 8'b1000_0000,则led为8'b0000_0001
end
else
begin
led <= led << 1'b1; // 正常led执行左移一位操作
end
end
end
endmodule
编辑仿真文件,因为开发板提供的时钟频率100MHz,时钟周期为10ns,而我选择的流水灯周期为1s,需要计数器counter计数100_000_000次输出led才能变化一次,尝试在仿真中定义周期为10ns的时钟信号,并与流水灯module的clk端相连,reset置0,led为wire型信号,选择仿真周期为16s,仿真极其缓慢,大概5min仅能到微妙量级。
这里为提高仿真效率,可以在源文件中修改计数器最大值为1000_000,那么需要的时钟周期可以增大100倍即1000ns,这样需要仿真的次数变少了,16s仿真大概20min可以跑完,会有两个完整的流水灯输出图像。
编辑引脚约束,这里有两点需要注意:
一是各管脚clk、reset、led都是寄存器型信号(reg),需要{}
set_property PACKAGE_PIN R1 [get_ports {reset}]
set_property IOSTANDARD LVCMOS33 [get_ports {reset}]
二是时钟信号,需要按开发板上端口填写时钟信号,我这里板上标明了100MHz(P17)
## reset
set_property PACKAGE_PIN R1 [get_ports {reset}]
set_property IOSTANDARD LVCMOS33 [get_ports {reset}]
## clk
set_property PACKAGE_PIN P17 [get_ports {clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]
## LED
set_property PACKAGE_PIN K3 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN M1 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN L1 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN K6 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property PACKAGE_PIN J5 [get_ports {led[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
set_property PACKAGE_PIN H5 [get_ports {led[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
set_property PACKAGE_PIN H6 [get_ports {led[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
set_property PACKAGE_PIN K1 [get_ports {led[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
本文主要用来记录个人学习verilog中曾遇到的问题,觉得本文有价值请自用。