module counter(
input clk,
input rst,
output clk_bps
);
reg [13:0]cnt;
always @( posege clk or posedge rst )
if( rst ) cnt <= 14'd0;
else
if( cnt >= 14'd50000000 )
cnt <= 14'd0;
else
cnt <= cnt + 1'b1;
assign clk_bps = (cnt == 14'd50000000 ? 1'b1 : 1'b0);
endmodule
module flash_led_clt(
input clk,
input rst,
input clk_bps,
input dir, // 用来定义方向,这里用拨码开关的状态来表示dir
output reg[15:0]led
);
always @(posedge clk or posedge rst) // 当系统时钟clk 或者 复位键 rst 信号出现上升沿,运行这个过程块
if(rst)
led<=16'h8000; //复位时,赋值16位的16进制数8000,也就是 1000 0000 0000 0000 也就是第一个灯亮了
else
case(dir) // 用拨码开关的状态来判断
1'b1: // 当拨码开关为1
if(clk_bps) // 在counter模块里面定义好的clk_bps, 每秒产生两个脉冲,脉冲一来就进入这个if分支
if(led!=16'h0001) led <= led>>1'b1; // 当16位led状态没到最后一个灯亮之前,led右移1位,如 0100 变成 0010
else
led <= 16'h8000; //当移位到最后一个灯,那就让第一个灯亮
1'b0: // 当拨码开关为0
if(clk_bps)
if(led!=16'h8000)
led <= led<<1'b1; // 当16位led状态没到第一个灯亮之前,led左移1位,如 0100 变成 1000
else
led <= 16'h0001; ////当移位到第一个灯,那就让最后一个灯亮
endcase
endmodule
module flash_led_top(
input clk,
input rst_n,
input sw0, //引入拨码开关sw0,用来作为改变流水灯方向的信号源
output [15:0]led
);
wire clk_bps;
wire rst;
assign rst = ~rst_n; //// 因为rst是按键开关,我们按下之后是个低电平,我们counter和led_flash_ctrl 都是选用rst信号的上升沿触发,所以这里我们把rst取反
counter u1(
.clk(clk),
.rst(rst), /// 注意,括号()里的端口rst是top_file 文件的定义的端口rst,.rst()是counter文件里面的端口名rst
.clk_bps(clk_bps)
);
flash_led_clt u2(
.clk(clk),
.rst(rst),
.clk_bps(clk_bps),
.led(led),
.dir(sw0)
);
endmodule
module flash_led_top_tb;
reg clk,rst,sw0;
wire [15:0] led;
initial begin
clk=1'b0;
rst=1'b1;
sw0=1'b0;
#10 rst=1'b0;
#10 rst=1'b1;
#1000000000
#1000000000
#1000000000
#1000000000
#1000000000
#1000000000
sw0=1'b1;
end
always #5 clk<=~clk;
flash_led_top u3(
.clk(clk),
.rst_n(rst),
.sw0(sw0) ,
.led(led)
);
endmodule
//我的约束文件使能的语句
set_property -dict {PACKAGE_PIN P17 IOSTANDARD LVCMOS33} [get_ports clk ]
set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports rst_n ]
set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports {sw0}]
set_property -dict {PACKAGE_PIN F6 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN G4 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN G3 IOSTANDARD LVCMOS33} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN J4 IOSTANDARD LVCMOS33} [get_ports {led[3]}]
set_property -dict {PACKAGE_PIN H4 IOSTANDARD LVCMOS33} [get_ports {led[4]}]
set_property -dict {PACKAGE_PIN J3 IOSTANDARD LVCMOS33} [get_ports {led[5]}]
set_property -dict {PACKAGE_PIN J2 IOSTANDARD LVCMOS33} [get_ports {led[6]}]
set_property -dict {PACKAGE_PIN K2 IOSTANDARD LVCMOS33} [get_ports {led[7]}]
set_property -dict {PACKAGE_PIN K1 IOSTANDARD LVCMOS33} [get_ports {led[8]}]
set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {led[9]}]
set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33} [get_ports {led[10]}]
set_property -dict {PACKAGE_PIN J5 IOSTANDARD LVCMOS33} [get_ports {led[11]}]
set_property -dict {PACKAGE_PIN K6 IOSTANDARD LVCMOS33} [get_ports {led[12]}]
set_property -dict {PACKAGE_PIN L1 IOSTANDARD LVCMOS33} [get_ports {led[13]}]
set_property -dict {PACKAGE_PIN M1 IOSTANDARD LVCMOS33} [get_ports {led[14]}]
set_property -dict {PACKAGE_PIN K3 IOSTANDARD LVCMOS33} [get_ports {led[15]}]