vivado应用-8位流水灯(开发板xc7a35t)

首先,创建新项目,在项目内建立流水灯源文件,编写代码如下(代码功能已经标注)

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中曾遇到的问题,觉得本文有价值请自用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值