使用Quartus II进行FPGA实验之Switches, Lights, and Multiplexers

本文介绍了如何使用Quartus II进行FPGA设计,包括新建工程、编译、分配引脚、仿真验证和下载到硬件的过程。文章通过五选一选择器、数码管控制电路以及同时控制五个数码管的实例,讲解了Verilog代码设计和避免锁存器产生的技巧。实验中强调了case语句的使用和设置Verilog文件为顶层设计的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Quartus设计FPGA,简单包括以下流程:

  1. 新建工程写代码
  2. 编译工程找错误
  3. 分配引脚重编译
  4. 下载配置到硬件

为保证设计的正确性,在编译后,一般还需要做仿真验证,然后下载至硬件,有两种仿真方式:
- 功能仿真
- 时序仿真

Quartus II 操作入门_quartus中只能运行顶层文件?-优快云博客

Quartus II软件可以使用原理图形式和RTL级代码来设计FPGA,使用原理图可以直接调用FPGA上的资源,省去了一些模块的编写。一般采用写Verilog代码的形式来设计FPGA。

简单列出Quartus II操作步骤:

新建工程  \rightarrow 选择FPGA开发板Cyclone IV EP4CE115F29C7 \rightarrow finish \rightarrow 新建一个Verilog文件(保持这个文件名和顶层模块名相同)\rightarrow写好代码点绿色三角编译 \rightarrow 在files标签页将此文件设置为顶层文件 \rightarrow debug编译成功

至此就可以分配引脚后重编译烧到板子里了。


几个简单的练习:

五选一选择器

X选一的选择器是比较简单的电路,可以通过直接观察真值表使用case语句来描述电路,要求如下:

module part3(
	input [17:0]SW,//	S2 S1 S0 U V W X Y
	output [17:0] LEDR,// indicte sw state
	output reg[2:0]LEDG// M
	);
	
	assign LEDR = SW;
	
	always@(*)
		casez(SW[17:15])
			3'b000: LEDG[2:0] = SW[14:12];
			3'b001: LEDG[2:0] = SW[11:9];
			3'b010: LEDG[2:0] = SW[8:6];
			3'b011: LEDG[2:0] = SW[5:3];
			3'b1??: LEDG[2:0] = SW[2:0];
		endcase
endmodule

数码管控制电路

 数码管的控制也可用case语句把真值表描述下来,输出直接连接到数码管即可:

module part4(
	input [2:0]SW,//c2 c1 c0
	output reg[0:6]HEX0_D
	);
	always@(*) begin
		HEX0_D = 'b1;// not work
		case(SW[2:0])
			3'b000: HEX0_D = 7'b1001000;//H
			3'b001: HEX0_D = 7'b0110000;//E
			3'b010: HEX0_D = 6'b1110001;//L
			3'b011: HEX0_D = 6'b0000001;//O?
		endcase
	end
endmodule
		

同时控制5个数码管

题目要求用了非常多的端口去控制5个数码管来显示英文单词HELLO,但是从真值表可以看到直接用case语句就可以实现:

module part5 (
	input [17:15] SW, // toggle switches
	output reg[0:6] HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D //5 7-seg displays
);
	parameter H = 7'b1001000;
	parameter E = 7'b0110000;
	parameter L = 7'b1110001;
	parameter O = 7'b0000001;
	
	always@(*) begin
		{HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = 'b1;// not display,blank
		case(SW[17:15])
			3'b000: {HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = {H,E,L,L,O};
			3'b001: {HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = {E,L,L,O,H};
			3'b010: {HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = {L,L,O,H,E};
			3'b011: {HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = {L,O,H,E,L};
			3'b100: {HEX0_D,HEX1_D,HEX2_D,HEX3_D,HEX4_D} = {O,H,E,L,L};
		endcase
	end
endmodule

 做完了实验一值得注意的有以下几点:

  • 实体名称未定义的报错是因为没有设置Verilog文件为顶层设计文件,参上。
  • case语句适用于较为复杂的电路,简单电路直接用连续赋值语句条件语句即可完成选择。
  • 使用case语句一定要设置默认值,避免锁存器的产生。可以case前赋值,也可以最后写default项。

下面贴几张开发板照片:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值