SWJTU 数电实验报告——Verilog 层次化文件设计——汽车流动转向灯电路设计

本文介绍了使用VerilogHDL设计层次化电路的方法,通过LED灯和计数器、译码器的结合实现彩灯控制器。实验内容包括设计步骤、引脚锁定、预习要求和实验报告指导,以及针对12个灯的控制代码修改建议。
摘要由CSDN通过智能技术生成

目录

题目描述:

一、 实验目的

二、 实验内容

三、 预习要求

四、 实验报告要求

五、 课后思考题

思路:

思考题:如果有十二个灯需要控制,代码需要怎么更改?

实验代码:

顶层文件:

fun1文件:

fun2文件:


题目描述:

一、 实验目的

1、巩固组合逻辑电路设计、仿真方法。

2、学习 Verilog HDL 层次化文件设计。

二、 实验内容

1、用 Verilog HDL 以层次化的设计方法,结合实验 1(LED灯实验需修改部分代码), 使用下文计数器模块代码“Code-1 7 进制计数器”,将计数器输出 Q 与译码器输 入 x 相连,译码器输出 codeout 锁定到实验箱的 LED 上,设计一个彩灯控制器。

LED 在控制电路的驱动下,按图 1 所示规律点亮/熄灭(●表示亮灯,○表示灭 灯)。对整体电路进行仿真,应当能够看到 en 为高电平时计数器的输出值自动增 加,相应地译码器的输出依次变化,并循环。

○ ○ ○ ○ ○ ○ ●

○ ○ ○ ○ ○ ● ●

○ ○ ○ ○ ● ● ●

○ ○ ○ ● ● ● ●

○ ○ ● ● ● ● ●

○ ● ● ● ● ● ●

图 1 灯效示意图

2. 引脚锁定

a) 计数器的 en 锁定到实验箱的开关 1;

b) 计数器的输出 Q 作为待观测的中间信号锁定到指示灯 LED2..LED0;

c) clk 锁定到 CLK0(PIN_88);

d) 译码器输出锁定到指示灯 LED14..LED9。

3. 实验测试

a) 将计数器的 clk 与实验箱的时钟 clk0 连接到一起,

b) 将 clk0 设置到 1~2Hz,观察灯的显示,并记录实验现象。

c) 将 clk0 设置到 1024Hz,观察灯的显示,并用文字记录实验现象。

d) 将 clk0 设置到 PULSE,使用手动脉冲,单步调试,观察计数器输出

Q 与 codeout 指示灯显示的对应关系。

e) 将 clk0 锁定到按键 Key2,重新编译并将电路烧写到 FPGA,按动

Key2,观察实验现象,分析与 clk0 连接到 PULSE 的区别。

计数器 译码器 clk en Q[2:0] codeout[5:0]

西南交通大学 电子技术实验室 数字电子技术实验

4. 提高性实验内容 产生其它的彩灯显示效果。

三、 预习要求

1. 自行查找资料,自学 Verilog HDL 的层次化文件设计,完成本实验“实验 内容”部分的设计要求。

2. 对实验电路进行功能仿真,并将仿真结果截图插入报告中。

3. 列出引脚锁定分配表(信号名->主板器件名->引脚号)。

4. 填写编译报告。

四、 实验报告要求

1、列出通电测试结果。

2、列出实验过程出现的问题及解决措施。

3、附源程序

4、 截图要求

(1) 代码截图必须包含 Quartus 的标题栏(图 3 红线处);

(2) 仿真波形截图必须包含仿真软件窗口的标题栏(图 4 红线处);

(3) 图上文字大小合适,信号名清晰可见;

(4) 波形清晰可读(总线设置为便于观察的进制);

(5) 波形顺序应当是上面为输入信号,下面为输出信号;

(6) 截图显示 1~2 个周期;

(7) 截图不应有大面积空白区域。

五、 课后思考题

如果有 12 个灯的显示需要控制,电路代码需做如何修改

思路:

实验思路:

本实验就是由计数器和LED灯译码器构成组合+时序逻辑电路,计数器根据亮灯的数量决定是几进制计数器,改变计数上限即可。

思考题:如果有十二个灯需要控制,代码需要怎么更改?

答:有十二个灯需要控制等价于对译码器输出长度为12,由译码器原理知,对应输入线路Q宽度应为4,且codeout的长度应为12,以上是对输入输出信号代码的更改。对内容:①首先对计数器进行更改:计数器上限应为12,对于代码if(Q < 3'd6)应改为if(Q < 4'd12),其余保持不变。②对译码器进行操作:对输入的Q进行判断时以3'd0: codeout = 6'b000000;为例,应改成:4'd0: codeout = 12'b0000_0000_0000;

实验代码:

顶层文件:
module emm (clk,en,Q,codeout);
	input clk,en; // 输入信号
	output [2:0] Q; // 计数器输出信号
	output [5:0] codeout; // 译码器输出信号
	
	emm fun1(clk,en,Q); // 调用计数器
	emm fun2(codeout,Q); // 调用译码器,输出信号
endmodule 
fun1文件:
module emm(clk,en,Q);
	input clk,en; // 输入信号声明
	output reg[2:0] Q; // 输出信号声明,使用3位寄存器表示
	always@(posedge clk) // 时序逻辑块,检测始终信号的上升沿(即信号从低电平变化到高电平的瞬间)
	begin
		if(en == 1'b1) // 如果使能信号en为高电平(1'b1)
			begin 
			if(Q < 3'd6) // d表示十进制数,当输入的三位二进制寄存器表示的十进制数小于6时执行
					Q <= Q +1'b1; // 如果Q小于6,则加一
				else  
					Q <= 0; // 反之赋值为0
			end
		else
		Q <= Q; // 如果使能信号为低电平,Q值不变
	end
endmodule	
fun2文件:
module emm(codeout, indec);
	input[2: 0] indec; // 说明输入信号的数组宽度为3
	output[5: 0] codeout; // 说明输出信号的数组宽度为6
	reg[5: 0] codeout; // 定义为寄存器
	always@(indec)
	begin
		case(indec) // indec作为判别常量
		// 根据输入信号indec,输出相应的codeout
		3'd0: codeout = 6'b000000;
		3'd1: codeout = 6'b100000;
		3'd2: codeout = 6'b110000;
		3'd3: codeout = 6'b111000;
		3'd4: codeout = 6'b111100;
		3'd5: codeout = 6'b111110;
		3'd6: codeout = 6'b111111;
		default: codeout = 6'bx; // 将大于6的数,输出赋值为高阻态
		endcase
	end
endmodule

代码有详细注释,帮助大家理解!祝大家数电都能取得好成绩!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值