一、实验室名称:虚拟仪器实验室
二、实验项目名称:数码管驱动实验
三、实验学时:4学时
四、实验原理
4.1数码管驱动原理
4.2功能概述
五、实验目的
六、实验内容
七、实验器材(设备、元器件)
八、实验步骤
九、实验数据及结果分析
9.1 PLL例化代码(通过IP核创建的PLL例化的代码模板xxx_inst.v)
9.2 秒计数代码
module counter(input clk,//时钟信号,25MHz
input rst_n,//复位信号,低电平有效
output reg[15:0] display_num);//数码管显示数据,[
//1s定时产生逻辑
reg[9:0] timer_cnt;//1s计数器
//补充代码。。。。。。。
always@(posedge clk or negedge rst_n)
if(!rst_n)
timer_cnt<={10{1'b0}};
else
timer_cnt<=timer_cnt+1'b1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
display_num<=0;
else if(timer_cnt==1000)
display_num<=display_num+1'b1;
else;
endmodule
9.3 数码驱动代码
module seg7( input clk ,//时钟信号,25MHz
input rst_n ,//复位信号,低电平有效
input[15:0] display_num,//数码管显示数据,[15:12
output reg[3:0] dtube_cs_n,//7段数码管位选信号
output reg[7:0] dtube_data
);
//参数定义
//数码管显示 0~F 对应段选输出
parameter NDOT= 8'h80,//小数点显示
NUM0 = 8'h3f,//c0,
NUM1 = 8'h06,
NUM2 = 8'h5b,
NUM3 = 8'h4f,
NUM4 = 8'h66,
NUM5 = 8'h6d,
NUM6 = 8'h7d,
NUM7 = 8'h07,
NUM8 = 8'h7f,
NUM9 = 8'h6f,
NUMA = 8'h77,
NUMB = 8'h7c,
NUMC = 8'h39,
NUMD = 8'h5e,
NUME = 8'h79,
NUMF = 8'h71;
//补充NUM1到NUMF参数定义
//数码管位选 0~3 对应输出,低电平选中
parameterCSN= 4'b1111,
CS0= 4'b1110,
CS1= 4'b1101,
CS2= 4'b1011,
CS3= 4'b0111;
//补充CS1~CS3参数定义
//------------------------------------------------
//分时显示数据控制单元
reg[3:0] current_display_num;//当前显示数据
reg[7:0] div_cnt;//分时计数器
//分时计数器
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
div_cnt <= 8'd0;
else
div_cnt <= div_cnt+1'b1;
end
//显示数据
always @(posedge clk or negedge rst_n)
if(!rst_n) current_display_num <= 4'h0;
else begin
case(div_cnt)
8'hff: current_display_num <= display_num[3:0];
8'h3f: current_display_num <= display_num[7:4];
8'h7f: current_display_num <= display_num[11:8]
8'hbf: current_display_num <= display_num[15:12
default: ;
endcase
end
//段选数据译码
always @(posedge clk or negedge rst_n)
if(!rst_n) dtube_data <= NUM0;
else begin
case(current_display_num)
//根据current_display_num选择对应的输出值
4'h0: dtube_data <=NUM0;
4'h1: dtube_data <=NUM1;
4'h2: dtube_data <=NUM2;
4'h3: dtube_data <=NUM3;
4'h4: dtube_data <=NUM4;
4'h5: dtube_data <=NUM5;
4'h6: dtube_data <=NUM6;
4'h7: dtube_data <=NUM7;
4'h8: dtube_data <=NUM8;
4'h9: dtube_data <=NUM9;
4'hA: dtube_data <=NUMA;
4'hB: dtube_data <=NUMB;
4'hC: dtube_data <=NUMC;
4'hD: dtube_data <=NUMD;
4'hE: dtube_data <=NUME;
4'hF: dtube_data <=NUMF;
default: ;
endcase
end
//位选译码
always @(posedge clk or negedge rst_n)begin
if(!rst_n) dtube_cs_n <= CSN;
else begin
case(div_cnt[7:6])
2'b00: dtube_cs_n <= CS0;
2'b01: dtube_cs_n <= CS1;
2'b10: dtube_cs_n <= CS2;
2'b11: dtube_cs_n <= CS3;
default: dtube_cs_n <= CSN;
endcase
end
end
Endmodule
9.4 顶层代码
9.5 测试代码
9.6 Modelsim功能仿真波形(对波形进行相关的文字说明)
9.7 Modelsim时序仿真波形(对波形进行相关的文字说明)
9.8 根据下面的管脚关系图完成管脚分配
9.9 FPGA在线下载配置(在开发板上观察实验结果)
十、实验结论
通过PLL产生时钟模块,来实现七段数码管上以一秒为间隔的数字递增。
十一、实验中遇到的问题及相应的解决办法