FPGA 03 LED跑马灯实验

目录

1. 位拼接实现

1.1 设计代码

1.2 testbench

1.3 仿真波形

​编辑2. 3-8译码器实现

2.1 设计代码

2.2 仿真波形

3. 参数化实现

3.1 设计代码

3.2 testbench

3.3 仿真波形

4. 8位LED以不同的频率闪烁——参数化实现

4.1 设计代码   

4.2 testbench

4.3 仿真波形


1. 位拼接实现

        8个led灯以每个0.5ms的速率循环闪烁。

1.1 设计代码

module led_run1(
    clk,
	reset_n,
	led
	);
	
	input clk;
	input reset_n;
	output reg[7:0]led;

	reg [24:0]counter;
	
	always@(posedge clk or negedge reset_n)
		if(!reset_n)
			counter <= 0;
		else if(counter == 24999)
			counter <= 0;
		else 
			counter <= counter+1;
	
	always@(posedge clk or negedge reset_n)
	   if(!reset_n)
	       led <= 8'b0000_0001;
	   else if(counter == 24999)
	       led <= {led[6:0],led[7]};
	   else
	       led <= led;

endmodule

1.2 testbench

`timescale 1ns / 1ns

module led_run_tb;
	
	reg clk;
	reg reset_n;
	wire [7:0]led;

	led_run led_run(
		.clk(clk),
		.reset_n(reset_n),
		.led(led)
	);


	initial clk = 1;
	always #10 clk = ~clk;

	initial begin
		reset_n = 0;
		#201;
		reset_n = 1;
		#50000000;
		$stop;
	end
endmodule

1.3 仿真波形

2. 3-8译码器实现

2.1 设计代码

module led_run2(
    clk,
	reset_n,
	led
	);
	
	input clk;
	input reset_n;
	output [7:0]led;

	reg [24:0]counter;
	
	always@(posedge clk or negedge reset_n)
		if(!reset_n)
			counter <= 0;
		else if(counter == 24999)
			counter <= 0;
		else 
			counter <= counter+1'd1;
	
    reg [2:0]cnt;

	always@(posedge clk or negedge reset_n)
	   if(!reset_n)
	       cnt <= 0;
	   else if(counter == 24999)
	       cnt <= cnt+1'd1;
	      
	decoder_3_8 decoder_3_8(
	   .a(cnt[2]),
	   .b(cnt[1]),
	   .c(cnt[0]),
	   .out(led));

endmodule

        其中3-8译码器的代码见FPGA 01 3-8译码器https://blog.csdn.net/SameenZhang/article/details/135256863

2.2 仿真波形

        testbench同1.2,仿真波形见下图

3. 参数化实现

        参数化意义:方便仿真、板级调试参数修改

3.1 设计代码

        将闪烁时间设置为参数“MCNT”,代码如下

module led_run3(
    clk,
	reset_n,
	led
	);
	
	input clk;
	input reset_n;
	output reg[7:0]led;
    
    parameter MCNT = 25'd24999999;
	reg [24:0]counter;
	
	always@(posedge clk or negedge reset_n)
		if(!reset_n)
			counter <= 0;
		else if(counter == MCNT)
			counter <= 0;
		else 
			counter <= counter+1;
	
	always@(posedge clk or negedge reset_n)
	   if(!reset_n)
	       led <= 8'b0000_0001;
	   else if(counter == MCNT)
	       led <= {led[6:0],led[7]};
	   else
	       led <= led;

endmodule

3.2 testbench

        为了提高仿真速度,将闪烁时间改为500ms,即在tb文件中重新定义参数MCNT的值

`timescale 1ns / 1ns

module led_run_self_tb;
	
	reg clk;
	reg reset_n;
	wire [7:0]led;

	led_run3 led_run3_inst0(
		.clk(clk),
		.reset_n(reset_n),
		.led(led)
	);
    defparam led_run3_inst0.MCNT = 24999;

	initial clk = 1;
	always #10 clk = ~clk;

	initial begin
		reset_n = 0;
		#201;
		reset_n = 1;
		#50000000;
		$stop;
	end
endmodule

3.3 仿真波形

4. 8位LED以不同的频率闪烁——参数化实现

        Q:8位LED灯分别以0.1s,0.2s,0.3s,0.4s,0.4s,0.3s,0.2s,0.1s的速率闪烁。

4.1 设计代码   

1.控制闪烁的文件(同led——flash)    

module led_run4(
    clk,
	reset_n,
	led
	);
	
	input clk;
	input reset_n;
	output reg[7:0]led;
    
    parameter MCNT = 25'd24999999;
	reg [24:0]counter;
	
	always@(posedge clk or negedge reset_n)
		if(!reset_n)
			counter <= 0;
		else if(counter == MCNT)
			counter <= 0;
		else 
			counter <= counter+1;
	
	always@(posedge clk or negedge reset_n)
	   if(!reset_n)
	       led <= 0;
	   else if(counter == MCNT)
	       led <= !led;

endmodule

2.例化module led_run4,设置不同的MCNT数值


module led_run4_test(
    clk,
	reset_n,
	led
    );
    
    input clk;
    input reset_n;
    output [7:0]led;
    
    led_run4 led_run4_inst0(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[0])
    );
    defparam led_run4_inst0.MCNT = 2499999;
    
    led_run4 led_run4_inst1(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[1])
    );
    defparam led_run4_inst1.MCNT = 4999999;
    
    led_run4 led_run4_inst2(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[2])
    );
    defparam led_run4_inst2.MCNT = 7499999;
    
    led_run4 led_run4_inst3(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[3])
    );
    defparam led_run4_inst3.MCNT = 9999999;
    
    led_run4 led_run4_inst4(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[4])
    );
    defparam led_run4_inst4.MCNT = 9999999;
    
    led_run4 led_run4_inst5(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[5])
    );
    defparam led_run4_inst5.MCNT = 7499999;
    
    led_run4 led_run4_inst6(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[6])
    );
    defparam led_run4_inst6.MCNT = 4999999;
    
    led_run4 led_run4_inst7(
        .clk(clk),
        .reset_n(reset_n),
        .led(led[7])
    );
    defparam led_run4_inst7.MCNT = 2499999;
    
    
endmodule

4.2 testbench

对module led_run4_test文件进行仿真

`timescale 1ns / 1ps

module led_run4_test_tb;
    
    reg clk;
    reg reset_n;
    wire [7:0]led;
    
    led_run4_test led_run4_test(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
        );
        
    initial clk = 1;
	always #10 clk = ~clk;

	initial begin
		reset_n = 0;
		#201;
		reset_n = 1;
		#500000000;
		$stop;
    end

endmodule

4.3 仿真波形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值