标题:
数码管的动态刷新Verilog源程序
[打印本页]
作者:
strelizia
时间:
2019-5-28 17:15
标题:
数码管的动态刷新Verilog源程序
六位八段数码管,最后两位自加首先循环,同时在到特定的数字调用蜂鸣器“哔~”
0.png
(9.93 KB, 下载次数: 134)
下载附件
2019-6-1 04:43 上传
源程序如下:
module Project_Segled2
(
//输入端口
CLK_50M,CLK_1S,RST_N,
//输出端口
SEG_DATA,SEG_EN,FM
);
//---------------------------------------------------------------------------
//-- 外部端口声明
//---------------------------------------------------------------------------
input CLK_50M; //时钟的端口,开发板用的50M晶振
input CLK_1S;
input RST_N; //复位的端口,低电平复位
output reg [ 5:0] SEG_EN; //数码管使能端口
output reg [ 7:0] SEG_DATA; //数码管数据端口(查看管脚分配文档或者原理图)
output reg FM; //控制蜂鸣器
//---------------------------------------------------------------------------
//-- 内部端口声明
//---------------------------------------------------------------------------
reg [15:0] time_cnt; //用来控制数码管闪烁频率的定时计数器
reg [15:0] time_cnt_n; //time_cnt的下一个状态
reg [ 2:0] led_cnt; //用来控制数码管亮灭及显示数据的显示计数器
reg [ 2:0] led_cnt_n; //led_cnt的下一个状态
reg [3:0] gewei; // 后两位的个位
reg [3:0] shiwei; //后两位的十位
reg [7:0] GE_DATA; //个位数码管数据
reg [7:0] SHI_DATA; //十位数码管数据
reg [3:0] gewei_n; // 后两位的个位
reg beep_reg; //用来控制蜂鸣器发声的寄存器
reg beep_reg_n; //beep_reg的下一个状态
//设置定时器的时间为1ms,计算方法为 (1*10^3)us / (1/50)us 50MHz为开发板晶振
parameter SET_TIME_1MS = 16'd50_000;
parameter freq = 16'd47774;
initial
begin
gewei = 4'h5; //初始化个位十位的值
shiwei=4'h0;
gewei_n=4'h5;
end
//---------------------------------------------------------------------------
//-- 逻辑功能实现
//---------------------------------------------------------------------------
//时序电路,用来给time_cnt寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
time_cnt <= 16'h0; //初始化time_cnt值
else
time_cnt <= time_cnt_n; //用来给time_cnt赋值
end
always @ (posedge CLK_50M)
begin
if(time_cnt == SET_TIME_1MS) //判断1ms时间
time_cnt_n = 16'h0; //如果到达1ms,定时计数器将会被清零
else
time_cnt_n = time_cnt + 27'h1; //如果未到1ms,定时计数器将会继续累加
end
//时序电路,用来给led_cnt寄存器赋值
always @ (posedge CLK_1S or negedge RST_N)
begin
if(!RST_N ) //判断复位
begin
gewei = 4'h5; //初始化个位十位的值
shiwei=4'h0;
end
else if(gewei==4'b1001)
begin
gewei=4'h0;
shiwei=shiwei+1'h1; //如果个位到十就归0且让十位加一
end
else if(shiwei==4'b0100)
begin
shiwei=4'h0; //判断十位的值如果到4就归0
end
else
gewei=gewei_n;
end
//组合电路,判断时间,实现控制显示计数器累加
always @ (negedge CLK_1S)
begin
gewei_n = gewei + 1'h1; //如果到达1s,计数器进行累加
end
//时序电路,用来给gewei寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
led_cnt <= 3'h0; //初始化led_cnt值
else
led_cnt <= led_cnt_n; //用来给led_cnt赋值
end
//组合电路,判断时间,实现控制显示计数器累加
always @ (posedge CLK_50M)
begin
if(time_cnt == SET_TIME_1MS) //判断1Ms时间
led_cnt_n = led_cnt + 1'h1; //如果到达1ms,计数器进行累加
else
led_cnt_n = led_cnt; //如果未到1ms,计数器保持不变
end
//实现gewei数据到数码管码数的一致
always @ (posedge CLK_50M)
begin
case(gewei)
4'b0000:GE_DATA= 8'b00111111; //0
4'b0001:GE_DATA= 8'b00000110; //1
4'b0010:GE_DATA= 8'b01011011; //2
4'b0011:GE_DATA= 8'b01001111; //3
4'b0100:GE_DATA= 8'b01100110; //4
4'b0101:GE_DATA= 8'b01101101; //5
4'b0110:GE_DATA= 8'b01111101; //6
4'b0111:GE_DATA= 8'b00000111; //7
4'b1000:GE_DATA= 8'b01111111; //8
4'b1001:GE_DATA= 8'b01101111; //9
default:GE_DATA=8'b10111111;
endcase
end
//实现shiwei数据到数码管数的一致
always @ (posedge CLK_50M)
begin
case(shiwei)
4'b0000:SHI_DATA= 8'b00111111; //0
4'b0001:SHI_DATA= 8'b00000110; //1
4'b0010:SHI_DATA= 8'b01011011; //2
4'b0011:SHI_DATA= 8'b01001111; //3
4'b0100:SHI_DATA= 8'b01100110; //4
default:SHI_DATA=8'b10111111;
endcase
end
//组合电路,实现数码管的数字显示
always @ (posedge CLK_50M)
begin
case (led_cnt)
3'b000 : SEG_DATA = 8'b00000111; //当计数器为0时,数码管将会显示 "7"
3'b001 : SEG_DATA = 8'b00000110; //当计数器为1时,数码管将会显示 "1"
3'b010 : SEG_DATA = 8'b01100110; //当计数器为2时,数码管将会显示 "4"
3'b011 : SEG_DATA = 8'b00111111; //当计数器为3时,数码管将会显示 "0"
3'b100 : SEG_DATA = SHI_DATA; //当计数器为4时,数码管将会显示 "十位"
3'b101 : SEG_DATA = GE_DATA; //当计数器为5时,数码管将会显示 "个位"
default: SEG_DATA = 8'b10111111;
endcase
end
always @ (posedge CLK_50M)
begin
case (led_cnt)
3'b000 : SEG_EN = 6'b111110; //当计数器为0时,数码管SEG1显示
3'b001 : SEG_EN = 6'b111101; //当计数器为1时,数码管SEG2显示
3'b010 : SEG_EN = 6'b111011; //当计数器为2时,数码管SEG3显示
3'b011 : SEG_EN = 6'b110111; //当计数器为3时,数码管SEG4显示
3'b100 : SEG_EN = 6'b101111; //当计数器为4时,数码管SEG5显示
3'b101 : SEG_EN = 6'b011111; //当计数器为5时,数码管SEG6显示
default: SEG_EN = 6'b111111;
endcase
end
//控制蜂鸣器
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
beep_reg <= 1'b0; //初始化beep_reg值
else
beep_reg <= beep_reg_n; //用来给beep_reg赋值
end
//组合电路,判断频率,使蜂鸣器发声
always @ (posedge CLK_50M)
begin
if(time_cnt == freq) //判断分频值
beep_reg_n = ~beep_reg; //改变蜂鸣器的状态
else
beep_reg_n = beep_reg; //蜂鸣器的状态保持不变
end
always @ (posedge CLK_50M)
begin
if(gewei==4'h5 && shiwei==4'h0)
FM = beep_reg;
end
endmodule
复制代码
所有资料51hei提供下载:
final.zip
(3.37 MB, 下载次数: 10)
2019-5-28 17:15 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1