电话拨号显示器verilog代码ego1开发板vivado软件

名称:电话拨号显示器verilog代码ego1开发板vivado软件

软件:VIVADO

语言:Verilog

代码功能:

电话拨号显示

1、具体0~9的数字按键

2、有开始、拨出、接通、删除按键

3、按下“开始”按键后,可以按数字键进行拨号,每按一次数字,整体号码左移一位,输入错误时可以删除

4、输入完号码后,按下“拨出键”拨出,此时号码会在数码管上滚动显示

5、按下“接通”键后,开始通话计时,数码管显示时间分、秒

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

本代码已在ego1开发板验证,开发板如下,其他开发板可以修改管脚适配:

ego1开发板.png

代码下载:电话拨号显示器verilog代码ego1开发板vivado软件名称:电话拨号显示器verilog代码ego1开发板vivado软件(代码在文末下载)软件:VIVADO语言:Verilog代码功能:电话拨号显示1、具体0~9的数字按键2、有开始、拨出、接通、删除按键3、按下“开始”按键后,可以按数字键进行拨号,每按一次数字,整体号码左移一位,输入错误时可以删除4、输入完号码后,按下“拨出键”拨出,此时号码会在数码管上滚动显示5、按下“接通”键后,开始通话计时,icon-default.png?t=N7T8http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=310

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 管脚分配

6. Testbench

7. 仿真图

整体仿真图

电话输入模块

控制模块

显示模块

部分代码展示:

//控制模块
module tele_ctrl(
input clk,//50M
input reset,//复位
input key_start,//开始
input key_call,//拨出
input key_connect,//接通
input [43:0] telephone_num,//输入号码
output [31:0] display_number,//显示值
output [2:0] current_state//当前状态
);
parameter second_time_cnt=32'd100_000_000;
//定义状态
parameter s_idle=3'd0;
parameter s_num=3'd1;
parameter s_shift=3'd2;
parameter s_time=3'd3;
reg [2:0] state=3'd0;
assign current_state=state;
//状态机控制
always@(posedge clk or negedge reset)
if(reset==0)
state<=s_idle;
else
case(state)
s_idle:
if(key_start)//开始
state<=s_num;
s_num:
if(key_call)//拨出
state<=s_shift;
s_shift://移位
if(key_connect)
state<=s_time;
s_time://计时
state<=s_time;
default:;
endcase
reg [31:0] second_cnt;
reg  second_en;
always@(posedge clk or negedge reset)
if(reset==0)begin
second_cnt<=32'h0;
second_en<=0;
end
else if(state==s_time || state==s_shift)//计时
if(second_cnt>=second_time_cnt)begin//计时1秒
second_cnt<=32'h0;
second_en<=1;
end
else begin
second_cnt<=second_cnt+32'h1;//计数
second_en<=0;
end
else begin
second_cnt<=32'h0;
second_en<=0;
end
reg [7:0] second;
reg [7:0] minute;
always@(posedge clk or negedge reset)
if(reset==0)begin
second<=8'h0;
minute<=8'h0;
end
else if(state==s_time)//计时状态
if(second>=8'd59)begin//计时1秒
second<=8'h0;
minute<=minute+8'h1;//分计时
end
else begin
second<=second+8'h1;//秒计时
minute<=minute;
end
else begin
second<=8'h0;
minute<=8'h0;
end
wire [3:0] second_ten;
wire [3:0] second_one;
wire [3:0] minute_ten;
wire [3:0] minute_one;
assign second_ten=second/10;
assign second_one=second%10;
assign minute_ten=minute/10;
assign minute_one=minute%10;
reg [43:0] number;
always@(posedge clk or negedge reset)
if(reset==0)
number<=44'h0;
else if(state==s_num)//拨号
number<=telephone_num;
else if(state==s_shift && second_en)//1秒移位1次
number<={number[39:0],number[43:40]};
else if(state==s_time)//显示时间
number<={32'd0,minute_ten,minute_one,second_ten,second_one};
assign display_number=number[31:0] ;
endmodule

猜你喜欢

转载自blog.csdn.net/diaojiangxue/article/details/134608201