• 已绑定课时
  • 工程师可点评
  • 教务通过

本节课后作业: 1、利用数码管动态显示原理设计一个自加器,要求写出详细的代码和画出模块框图? TOP.v `timescale 1ns / 1ps module TOP( input sysclk ,//系统时钟 input rst_n ,//复位 output [3:0] sel ,//位选位 output [7:0] seg //段选位 ); wire [13:0] number ;//数据处…

sheng871106
183 3
教务通过工程师评优秀3
教务通过
教务评价

教务通过

成小芯 · 2026-07-16

赞

本节课后作业:

1、利用数码管动态显示原理设计一个自加器,要求写出详细的代码和画出模块框图?

TOP.v

`timescale 1ns / 1ps
module TOP(
input           sysclk ,//系统时钟
input           rst_n  ,//复位
output    [3:0] sel    ,//位选位
output    [7:0] seg     //段选位
);
wire      [13:0] number ;//数据处理模块送过来的
smg_dt smg_dt_u(
.sysclk  ( sysclk ) ,//系统时钟
.rst_n   ( rst_n )  ,//复位
.number  ( number ) ,//数据处理模块送过来的
.sel     ( sel )    ,//位选位
.seg     ( seg )    //段选位
);
ctrl ctrl_u(
.sysclk ( sysclk ) ,//系统时钟
.rst_n  ( rst_n )  ,//复位
.number ( number ) //产生需要送给数码管显示模块的数值
);
endmodule

smg_dt.v

`timescale 1ns / 1ps
//数码管动态显示(假设数码管位选位共阳,段选位共阴)
module smg_dt(
input              sysclk   ,//系统时钟
input              rst_n    ,//复位
input     [13:0]  number   ,//数据处理模块送过来前
output reg [3:0]    sel      ,//位选位
output     [7:0]    seg       //段选位
);
parameter delay_1ms = 50_000;//1ms内部时钟晶振次数
reg [31:0] cnt;//1ms计时器
//状态声明-->独热码
parameter IDLE  = 5'b0000_1, //空闲态
GE    = 5'b0001_0, //数码管位选位个位
SHI   = 5'b0010_0, //数码管位选位十位
BAI   = 5'b0100_0, //数码管位选位百位
QIAN  = 5'b1000_0;//数码管位选位千位
reg [4:0] cur_state,next_state;//现态和次态-->位宽根据选择的编码方式来
//    wire [13:0] number=1234;//数码管需要显示的四位数集合
wire [3:0] ge;//GE这个状态需要显示的字符数值
wire [3:0] shi;//SHI这个状态需要显示的字符数值
wire [3:0] bai;//BAI这个状态需要显示的字符数值
wire [3:0] qian;//QIAN这个状态需要显示的字符数值
reg [3:0] num;//就是得到的各个位选上前十进制数值-->需要送到译码模块中去进行译码
assign ge = number%10;
assign shi = number/10%10;
assign bai = number/100%10;
assign qian = number/1000;
//1ms计时器模块--cnt---------------------->
always(posedge sysclk)
if(!rst_n)
cnt<=0;
else if(cnt==delay_1ms-1)//1ms记满了
cnt<=0;
else//系统在工作,并且没有记满1ms
cnt<=cnt+1;
//三段式状态机第一段-->描述总状态的跳转(现态、次态)
always@(posedge sysclk)
if(!rst_n)
cur_state<=IDLE;
else
cur_state<=next_state;
//三段式状态机第二段-->描述各个状态之间的跳转(现态、次态、条件)
always@(*)
if(!rst_n)
next_state=IDLE;
else
case(cur_state)
IDLE:next_state=GE;
GE :begin
if(cnt==delay_1ms-1)//如果现态是GE,并且1ms计时器记满,那么状态就跳到SHI
next_state=SHI;
else
next_state=GE;
end
SHI :begin
if(cnt==delay_1ms-1)//如果现态是SHI,并且1ms计时器记满,那么状态就跳到BAI
next_state=BAI;
else
next_state=SHI;
end
BAI :begin
if(cnt==delay_1ms-1)//如果现态是BAI,并且1ms计时器记满,那么状态就跳到QIAN
next_state=QIAN;
else
next_state=BAI;
end
QIAN :begin
if(cnt==delay_1ms-1)//如果现态是QIAN,并且1ms计时器记满,那么状态就跳到GE
next_state=GE;
else
next_state=QIAN;
end
default:next_state=IDLE;
endcase
//三段式状态机第三段-->描述各个状态下的动作
always@(posedge sysclk)
if(!rst_n)begin
sel<=4'b0000;
num<=0;
end
else
case(cur_state)
IDLE:begin
sel<=4'b0000;
num<=0;
end
GE:begin
sel<=4'b1110;//选中位选位最低位
numseg<=4
end
SHI:begin
sel<=4'b1101;//选中位选位最低位
num<=shi;
end
BAI:begin
sel<=4'b1011;//选中位选位最低位
num<=bai;
end
QIAN:begin
sel<=4'b0111;//选中位选位最低位
num<=qian;
end
default:begin
sel<=4'b0000;
seg<=8'b0011_1111;
end
endcase
//例化:线连线(wire 连 wire )
//     线连寄存器(wire 连 reg): 做为ieg信息量必须被赋值说明
yima yima_u(
.num( num ),
.seg ( seg ) //译码得出的段选位
);
endmodule

smg_dt.v

`timescale 1ns / 1ps
//数码管简易秒表的数据处理模块:生成数码管显示模块所需要的数值
module ctrl(
input           sysclk   ,//系统时钟
input           rst_n    ,//复位
output reg [13:0] number //产生需要送给数码管显示模块的数值
);
parameter delay = 50_000_000;//1s内部时钟晶振次数(周期)
reg [31:0] cnt;//1s计时器
//1s计时器模块
always@(posedge sysclk)
if(!rst_n)
cnt<=0;
else if(cnt==delay-1)
cnt<=0;
else
cnt<=cnt+1;
//number 数据模块
always@(posedge sysclk)
if(!rst_n)
number<=0;
else if(cnt==delay-1)begin//1s到了
if(number==5959)//1s到了的情况下,如果number=5959最大值
number<=0;
else
number<=number+1;
end
else//1s未到
number<=number;
Endmodule

学习上下文

产出状态

评优秀3 位工程师
工程师已阅183 位工程师
教务教务通过