实验报告 · 10 | 项目设计:数码管(1-1.0版)
课程:初级 | FPGA工程师基础启航(含板卡+证书) · 第六节 补充课程(数码管显示)
发布自课程云笔记 · FPGA 实验证据骨架
【本节要点】
数码管基础知识
【疑问/坑点】
1、区分位选位和段选位;针对本实验的数码管(备注:最左边是最高位,最右边是低位。高位---次高位----次低位----地位)
2、段选位看发光二极管的组成数量
3、段选位共阴高电平有效,段选位最高位是”dp信号“,最低位是”a“
输出”8“对应:seg=8'b 0 1 1 1_1 1 1 1
dp g f e d c b a
4、要认真看原理图区分是共阴还是共阳数码管,判断位选位(控制哪一个工作单元工作)和段选位(控制数目管显示的字符)极性
【可复用的代码/思路】
调试出问题,检查思路:
1、先检查代码
2、检查管脚约束文件 (pin文件)
3、对应PIN(管脚)文件去检查实际硬件连线
4、最后考虑硬件设计问题:一是硬件损坏;二是板卡元器件管脚损坏。
【绑定管脚思路】
1、先将主板插针管脚与副板数码管进行直连,编写测试程序观察效果;
“`timescale 1ns / 1ps
/*时间单位1NS,时间精度1PS*/
module text_SMG(
input sysclk ,
input rst_n ,
output [3:0] sel ,//四个位选
output [7:0] seg //七个段选
);
//段选位
assign sel = 4'b0101 ;
//位选位
assign seg = 8'b0111_1101 ;endmodule”(该程序经过验证修改后,目前数码管显示是“6*6 *”,对应下图3)
2、分析数码管显示效果产生的原因,对绑定的管脚进行调整;
3、预先计算显示效果,将调整后的程序下载观察显示效果。
下面分别是是调整前和调整后的效果:
调整前:
图一
调整后:
图二
图三
【同步·课后作业】
【作业要求】
1、请说明共阴数码管与共阳数码管。
共阴和共阳数码管的本质区别在于内部LED公共端的接法:共阴数码管把所有发光二极管的阴极连在一起作公共端,使用时接地,段引脚给高电平点亮;共阳数码管则把所有阳极连在一起作公共端,使用时接电源正极,段引脚给低电平点亮。
2、数码管根据发光二级管的连接方式分为哪两种数码管?
数码管根据发光二极管的连接方式分为:共阴和共阳两种数码管。
3、如果上板验证时出现问题,如何去检查问题,分几步检查?
小练习
`timescale 1ns / 1ps
//数码管静态显示小练习:实现功能-->复位时,数码管显示最低位一个0;工作时,会滚动显示1~4
// 滚动显示: 最低位显示数值1,持续1s钟
// 最低两位显示数字2,持续2s
// 第三位显示数值3,持续3s
// 四位一起显示数字4,持续4s
module smg_jt(
);
endmodule【我的做法】
`timescale 1ns / 1ps
/*时间单位1ns,时间精度1ps*/
module FSM_SMG(
input wire sysclk ,
input wire rst_n ,
output reg [3:0] sel ,
output reg [7:0] seg
);
parameter delay = 26'd50_000_000 ;
parameter IDLE = 8'b0011_1111 ;//空闲态或者复位最后一位显示“0”
parameter S1 = 8'b0000_0110 ,//最后一位显示“1”
S2 = 8'b0101_1011 ,//最后两位显示“2”
S3 = 8'b0100_1111 ,//最后三位显示“3”
S4 = 8'b0110_0110 ;//最后四位显示“4”
reg [27:0] count ;
reg [7:0] cur_state , next_state ;//声明现次态
//1秒计数器
always @(posedge sysclk)
if(!rst_n || cur_state == IDLE)
count <= 28'b0 ;
else if ((cur_state == S1 && count == delay - 1) ||
(cur_state == S2 && count == (delay*2) - 1) ||
(cur_state == S3 && count == (delay*3) - 1) ||
(cur_state == S4 && count == (delay*4) - 1))
count <= 28'b0 ;
else
count <= count + 28'b1 ;
//第一段描述数码管状态变化
always @(posedge sysclk)
if(!rst_n)
cur_state <= IDLE ;
else
cur_state <= next_state ;
//第二段描述各个状态之间的跳转
always @(*)
begin
if(!rst_n)
next_state = IDLE ;
else
case(cur_state)
IDLE : next_state = S1 ;
S1 :
begin
if(count == delay - 1)
next_state = S2;
else
next_state = S1;
end
S2 :
begin
if(count == (delay*2)-1)
next_state = S3;
else
next_state = S2;
end
S3 :
begin
if(count == (delay*3)-1)
next_state = S4;
else
next_state = S3;
end
S4 :
begin
if(count == (delay*4)-1)
next_state = S1;
else
next_state = S4;
end
default : next_state = IDLE ;
endcase
end
//第三段描述各个状态下的动作
always @(posedge sysclk)
if(!rst_n)begin
sel <= 4'b1110;
seg <= 8'b0011_1111;
end
else
case(cur_state)
IDLE :
begin
sel <= 4'b1110 ;
seg <= 8'b0011_1111 ;
end
S1 :
begin
sel <= 4'b1110 ;
seg <= 8'b0000_0110 ;
end
S2 :
begin
sel <= 4'b1100 ;
seg <= 8'b0101_1011 ;
end
S3 :
begin
sel <= 4'b1000 ;
seg <= 8'b0100_1111 ;
end
S4 :
begin
sel <= 4'b0000 ;
seg <= 8'b0110_0110 ;
end
default :
begin
sel <= 4'b1110 ;
seg <= 8'b0011_1111 ;
end
endcase
endmodule【结果/时序图/实验现象(可视频)】
【FPGA·实验证据】
【实验目标】
本节要验证什么?预期现象是什么?
【波形/截图】
用工具栏插入波形图、仿真界面或示波器照片
【仿真 log】
粘贴关键仿真输出或报错原文
【上板现象】
板卡现象、按键/数码管/接口实测结果
【结论与待改】
结论、坑点与下一步修改

评论 0