查看:4701|回复:0
六位八段数码管,最后两位自加首先循环,同时在到特定的数字调用蜂鸣器“哔~”
源程序如下:
复制代码
所有资料51hei提供下载:
final.zip(3.37 MB, 下载次数: 10)
源程序如下:
- 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)