自学FPGA——LED灯

一、二选一多路器

module mux2(
	a,
	b,
	sel,
	out
);//端口声明用逗号,最后一个不用
	//端口定义用分号
	//sel = 0;out = a;
	//sel =1; out = b;
	input a;
	input b;
	input sel;
	output out;
	assign out = (sel == 0)?a:b;

endmodule

 仿真测试代码:

`timescale 1ns/1ns
module mux2_tb();
	//输入信号
	reg s0;
	reg s1;
	reg s2;
	//输出信号
	wire mux2_out;
mux2 mux2(
	.a(s0),//例化连接
	.b(s1),
	.sel(s2),
	.out(mux2_out)
);
	
	initial begin  //产生激励信号
		s0=0;s1=0;s2=0;
		#20;//在仿真时间上延迟20纳秒(和开头相符)
		s2=0;s1=0;s0=1;
		#20;
		s2=0;s1=1;s0=0;
		#20;
		s2=0;s1=1;s0=1;
		#20;
		s2=1;s1=0;s0=0;
		#20;
		s2=1;s1=0;s0=1;
		#20
		s2=1;s1=1;s0=0;
		#20;
		s2=1;s1=1;s0=1;
		#20;
	end
endmodule

二、三八译码器

module decoder_3_8(
	A0,
	A1,
	A2,
	Y0,
	Y1,
	Y2,
	Y3,
	Y4,
	Y5,
	Y6,
	Y7
);
	input A0;
	input A1;
	input A2;
	output reg Y0;
	output reg Y1;
	output reg Y2;
	output reg Y3;
	output reg Y4;
	output reg Y5;
	output reg Y6;
	output reg Y7;
	
	always @(*)
		case ({A2,A1,A0})
		3'b000: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0000_0001;
		3'b001: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0000_0010;
		3'b010: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0000_0100;
		3'b011: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0000_1000;
		3'd4: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0001_0000;
		3'd5: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0010_0000;
		3'd6: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0100_0000;
		3'd7: {Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b1000_0000;
		default:{Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0} = 8'b0000_0000;
		endcase
endmodule

 仿真测试代码:

`timescale 1ns/1ns
module decoder_3_8_tb();

	reg A0;
	reg A1;
	reg A2;
	
	wire Y0;
	wire Y1;
	wire Y2;
	wire Y3;
	wire Y4;
	wire Y5;
	wire Y6;
	wire Y7;
	
decoder_3_8 decoder_3_8_inst0(
	.A0(A0),
	.A1(A1),
	.A2(A2),
	.Y0(Y0),
	.Y1(Y1),
	.Y2(Y2),
	.Y3(Y3),
	.Y4(Y4),
	.Y5(Y5),
	.Y6(Y6),
	.Y7(Y7)
);
	initial begin
		A2=0;A1=0;A0=0;
		#20;
		A2=0;A1=0;A0=1;
		#20;
		A2=0;A1=1;A0=0;
		#20;
		A2=0;A1=1;A0=1;
		#20;
		A2=1;A1=0;A0=0;
		#20;
		A2=1;A1=0;A0=1;
		#20;
		A2=1;A1=1;A0=0;
		#20;
		A2=1;A1=1;A0=1;
		#20;
	end 
	
endmodule

三、跑马灯

module led_run(
	Clk,
	Reset_n,
	Led
);
	input Clk;
	input Reset_n;
	output  reg [7:0]Led;
	//实现500ms计数
	reg [24:0] counter;
	always@(posedge Clk or negedge Reset_n)
		if (!Reset_n)
			counter <=0;
		else if (counter == 25'd25_000_000 -1)
			counter <=0;
		else 
			counter <= counter + 1'd1;
	
	always@(posedge Clk or negedge Reset_n)
		if (!Reset_n)
			Led <= 8'b0000_0001;
		else if (counter == 25'd25_000_000 - 1) begin
			if((Led == 8'b0000_0000)||Led == 8'b1000_0000)
				Led <= 8'b0000_0001; 
		else
			Led <= Led << 1;
	end
	
endmodule

 仿真测试代码:

`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;
	 #4_000_000_0;
	 $stop;
	 end 
	 
endmodule

四、多个Led按不同频率闪烁

1.单个闪烁

module led_twinkle(
	Clk,
	Reset_n,
	Led
);
	input Clk;
	input Reset_n;
	output reg  Led;
	
	parameter MCNT = 25_000_000 - 1;
	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'd1;
	always@(posedge Clk or negedge Reset_n)
		if (!Reset_n)
			Led  <= 0;
		else if (counter ==MCNT)
			Led  <= !Led;	
endmodule

2.多个闪烁

        调用单个闪烁模块

module led_twinkle_4(
	Clk,
	Reset_n,
	Led
);
	input Clk;
	input Reset_n;
	output [3:0]Led;

	led_twinkle led_twinkle_inst0(
		.Clk(Clk),
		.Reset_n(Reset_n),
		.Led(Led[0])
	);

	led_twinkle
	#(
		.MCNT(12_500_000 - 1)
	)
	led_twinkle_inst1(
		.Clk(Clk),
		.Reset_n(Reset_n),
		.Led(Led[1])
	);
	
   defparam led_twinkle_inst2.MCNT = 6_250_000 - 1;
	led_twinkle led_twinkle_inst2(
		.Clk(Clk),
		.Reset_n(Reset_n),
		.Led(Led[2])
	);
	
		
   defparam led_twinkle_inst3.MCNT = 2_500_000 - 1;
	led_twinkle led_twinkle_inst3(
		.Clk(Clk),
		.Reset_n(Reset_n),
		.Led(Led[3])
	);
	
endmodule

仿真测试代码:

`timescale 1ns/1ns
module led_twinkle_4_tb();
	
	reg Clk;
	reg Reset_n;
	wire [3:0]Led;
	
	led_twinkle_4 led_twinkle_4(
		.Clk(Clk),
		.Reset_n(Reset_n),
		.Led(Led)
	);
	
	initial Clk = 1;
	always #10 Clk = ~Clk;
	
	initial begin
		Reset_n = 0;
		#201;
		Reset_n = 1;
		#2_000_000_000;
		$stop;
	end 
	
endmodule

五、根据外部输入控制Led闪烁

1.连续变化

module led_ctrl2(
	Clk,
	Reset_n,
	sw,
	Led
);
	input Clk;
	input Reset_n;
	input [7:0] sw;
	output reg [1:0]Led;
	
	parameter MCNT = 12_500_000 - 1;
	reg [26:0] counter0;
	reg [2:0] counter1;
	
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			counter0 <= 0;                  
		else if (counter0 == MCNT)
			counter0 <= 0;
		else 
			counter0 <= counter0 + 1'd1;

	
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n) 
			counter1 <= 0;
		else if (counter0 == MCNT) begin
			if (counter1 == 7)
				counter1 <= 0;
			else 
				counter1 <= counter1 + 1'd1;
			end
			
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			Led <= 2'b11;
		else begin
			case (counter1)
			0: Led <= ((sw[0] == 1) ? 2'b11 : 2'b00);
			1: Led <= ((sw[1] == 1) ? 2'b11 : 2'b00);
			2: Led <= ((sw[2] == 1) ? 2'b11 : 2'b00);
			3: Led <= ((sw[3] == 1) ? 2'b11 : 2'b00);
			4: Led <= ((sw[4] == 1) ? 2'b11 : 2'b00);
			5: Led <= ((sw[5] == 1) ? 2'b11 : 2'b00);
			6: Led <= ((sw[6] == 1) ? 2'b11 : 2'b00);
			7: Led <= ((sw[7] == 1) ? 2'b11 : 2'b00);
			default:Led <=Led;
			endcase
		end
	
	endmodule
	
	
	

仿真测试代码:

`timescale 1ns/1ns
module led_ctrl0_tb();
	reg Clk;
	reg Reset_n;
	reg [7:0] sw;
	wire Led;
	
	led_ctrl2 led_ctrl2(
		.Clk(Clk),
		.Reset_n(Reset_n),
      .Led(Led),
		.sw(sw)
	); 
//	defparam led_ctrl1.TIME = 1;
	defparam led_ctrl2.MCNT = 125_00-1;
	
	initial Clk = 1;
	always #10 Clk = ~Clk;

	initial begin
		Reset_n = 0;
		sw = 8'b1010_1010;
		#201;
		Reset_n = 1;
		#4_000_000;
		sw = 8'b0000_0001;
		#4_000_000;
		$stop;
	end
endmodule

2.间隔一段时间变化

module led_ctrl3(
	Clk,
	Reset_n,
	sw,
	Led
);
	input Clk;
	input Reset_n;
	input [7:0] sw;
	output reg Led;
	
	reg [26:0] counter0;
	reg [2:0] counter1;
	reg [27:0] counter2;
	
	reg en_counter2;
	reg en_counter0;
	
	parameter MCNT0 = 12_500_000 - 1;//0.25s
	parameter MCNT2 = 50_000_000 - 1;//1s
	
	//空闲1秒的计数
	
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			counter2 <= 0;
		else if(en_counter2) begin
			if(counter2 == MCNT2)
				counter2 <= 0;
			else 
				counter2 <= counter2 + 1'd1;
		end
		else 
			counter2 <= 0;
		
	//en_counter2
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			en_counter2 <= 1;
		else if((counter1 == 7 )&&(counter0 == MCNT0))
			en_counter2 <= 1;
		else if (counter2 == MCNT2)
			en_counter2 <= 0;
		
	//en_counter0
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			en_counter0 <= 0;
		else if((counter1 == 7 )&&(counter0 == MCNT0))
			en_counter0 <= 0;
		else if (counter2 == MCNT2)
			en_counter0 <= 1;	
			
			
	//0.25秒的计数
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			counter0 <= 0;                  
		else if(en_counter0) begin
			if (counter0 == MCNT0)
				counter0 <= 0;
			else 
				counter0 <= counter0 + 1'd1;	
	   end
		else
			counter0 <= 0;
		
	//8个状态
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n) 
			counter1 <= 0;
		else if (counter0 == MCNT0) begin
			if (counter1 == 7)
				counter1 <= 0;
			else 
				counter1 <= counter1 + 1'd1;
			end
	
	//开关控制8个状态的亮灭
	always@(posedge Clk or negedge Reset_n) 
		if(!Reset_n)
			Led <= 0;
		else if(en_counter0 == 0)
			Led <=0;
		else begin
			case (counter1)
			0: Led <= sw[0];
			1: Led <= sw[1];
			2: Led <= sw[2];
			3: Led <= sw[3];
			4: Led <= sw[4];
			5: Led <= sw[5];
			6: Led <= sw[6];
			7: Led <= sw[7];
			default:Led <=Led;
			endcase
		end
	
	endmodule
	
	
	

 

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA自学笔记——设计与验证JMB FPGA(可编程逻辑门阵列)是一种可编程的硬件平台,可以实现各种数字电路的设计与验证。本文将简要介绍使用FPGA自学设计与验证JMB(低功耗、高效能、集成度高的多媒体芯片)的过程。 首先,我们需要了解JMB的功能和特性。JMB是一种面向多媒体应用的芯片,具备低功耗、高效能和高集成度的优势。我们需要详细研究JMB的硬件架构和内部模块,包括处理器核、存储器模块、图像和音频处理模块等。 接下来,我们可以使用FPGA开发板来设计和验证JMB。首先,我们需要熟悉FPGA设计工具,例如Vivado或Quartus等。这些工具提供了图形化界面和硬件描述语言(HDL)等设计方法。我们可以使用HDL编写JMB的功能模块,并将其综合为FPGA可执行的位流文件。 在设计完成后,我们需要验证JMB的功能和性能。我们可以使用仿真工具(例如ModelSim或ISE Simulator)来模拟JMB在不同情况下的行为。通过设计测试程序并运行仿真,我们可以验证JMB的各个模块是否正确地工作,是否满足设计要求。 在验证完成后,我们可以将位流文件下载到FPGA开发板中进行智能芯片的物理实现和测试。通过与外部设备的连接以及相关测试程序的运行,我们可以验证JMB在实际硬件中的功能和性能。 总结起来,学习FPGA设计与验证JMB,我们需要熟悉JMB的硬件架构和内部模块,并使用FPGA开发工具进行设计与验证。通过仿真和物理实现测试,我们可以验证JMB的功能和性能。这些过程需要理论知识和实践经验的结合,希望这些笔记能够给你提供一些参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值