此次试验为我们的一次课程练习,仅供参考。
所用硬件为老师基于MAXll系列EMP240T100C5芯片设计的电路板,包含振荡器、64个发光二极管、按钮,4个七段译码显示器等相关器件。要求编写程序完成电子钟功能。
程序接口:
pin_50, pin_51,未用。
CP,振荡器脉冲输入。RST,Ch,Cm,三个按钮 这里设计为 复位 校时 校分。Hc,未用。
wire [7:0] Sh,Sl,用于控制60个发光二极管显示秒针(硬件上为8×8的行列矩阵)。
wire [3:0] W,用于选择显示4个七段译码显示器(每次只亮一个显示器)。
wire [7:0] ddo,控制七段译码显示器显示的数字。
引脚连接:
主模块程序:
module Clk
(
input pin_50, pin_51,
input CP,RST,Ch,Cm,Hc,
output wire [7:0] Sh,Sl,
output wire [3:0] W,
output wire [7:0] ddo
);
wire SP,MP,HP,DP; //秒脉冲,分脉冲,时脉冲,天脉冲。
wire [14:0]Q; //振荡器计数,所用振荡器为32768Hz。
wire [5:0]S; //秒计数。
wire [5:0]M; //分计数。
wire [3:0]H; //时计数。
wire [6:0] Hhdo,Hldo,Mhdo,Mldo; //4个七段译码显示器信号。
//从振荡器脉冲开始依此分频得到秒、分、时。
Pulse#(15,32768) SecP(CP,RST,1,0,SP,Q);
Pulse#(6,60) MinP(SP,RST,1,0,MP,S);
Pulse#(6,60) HourP(MP,RST,Cm,Q[13],HP,M);
Pulse#(4,12) DayP(HP,RST,Ch,Q[13],DP,H);
//将分与时转换为4片七段译码器信号。
LED_7Seg#(1) HH(W[3],CP,H/10,Hhdo);
LED_7Seg#(4) HL(W[2],CP,H%10,Hldo);
LED_7Seg#(3) MH(W[1],CP,M/10,Mhdo);
LED_7Seg#(4) ML(W[0],CP,M%10,Mldo);
//根据秒数S置Sh、Sl接通相应的发光二极管。
assign Sh=8'b00000001<<({S[5],S[4],S[3]});
assign Sl=~(8'b00000001<<({S[2],S[1],S[0]}));
//按合适频率依此显示各个七段译码显示器。
assign W=4'b0001<<({Q[9],Q[8]});
assign ddo={Q[14]&~W[1]&~W[3],Hhdo+Hldo+Mhdo+Mldo};
endmodule
分频模块:
实现高频脉冲分频,用于得到秒分时。
module Pulse
#(
parameter W, //寄存器位数
parameter N //进制数
)
(
input OP, //源脉冲
input RS, //复位脉冲
input RV, //校时脉冲
input SP, //秒脉冲
output reg GP, //目的脉冲
output reg[W-1:0]R //源脉冲计数
);
wire TP;
assign TP=OP|(~RV&SP);
always @(posedge TP or negedge RS)
begin
if(~RS)
begin
R<=0;
end
else
begin
if(R
七段译码器信号转换模块:
实现个位数七段译码器信号的输出。
module LED_7Seg
#(
parameter N //所表示的个位数最大所需位数
)
(
input W, //片选信号
input OP, //振荡器脉冲
input [N-1:0]num, //目标个位数
output [6:0]line //该数的七段译码器信号
);
reg [6:0]sig;
always @(posedge OP)
case (num)
4'd0:sig<=7'b0111111;// 1111110;
4'd1:sig<=7'b0000110;// 0110000;
4'd2:sig<=7'b1011011;// 1101101;
4'd3:sig<=7'b1001111;// 1111001;
4'd4:sig<=7'b1100110;// 0110011;
4'd5:sig<=7'b1101101;// 1011011;
4'd6:sig<=7'b1111101;// 1011111;
4'd7:sig<=7'b0000111;// 1110000;
4'd8:sig<=7'b1111111;// 1111111;
4'd9:sig<=7'b1101111;// 1111011;
default:sig<=7'b0;
endcase
assign line={sig}&{7{W}};
endmodule
编译逻辑仿真:
主要部分电路图(老师设计绘制):
最终实现12小时制电子钟,包含复位校时功能。