目录
题目描述:
一、 实验目的
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
代码有详细注释,帮助大家理解!祝大家数电都能取得好成绩!