.
_4bitcomparer su6(min_h_equ,set_min_[7:4],minute[7:4]); //分钟的十位比较结果 _4bitcomparer su7(min_l_equ,set_min_[3:0],minute[3:0]); //分钟的个位比较结果
//闹钟声音控制信号 assign
alarm_clock=ctrl_bell?(((hr_h_equ&&hr_l_equ&&min_h_equ&&min_l_equ))&&(((second[0]==1'b1)&&_500hz)||((second[0]==1'b0)&&_1khzin)):1'b0;
//当CTRL_BELL为1时,闹钟声音被允许输出,才进行后续判断,而为0时,不允许输出,时钟为0; //hr_h_equ&&hr_l_equ&&min_h_equ&&min_l_equ)用于检测是否满足闹钟响铃条件 //即设定时间与当前时间是否相等。
//second[0]==1'b1)&&_500hz)||((second[0]==1'b0)&&_1khzin)用于给闹钟输出信号变量赋值 //500hz和1khz交替输出,用秒的最低位一直在0和1跳变来实现。
//把声音输出模块集成在一起,报时和闹钟信号 assign alarm=alarm_radio||alarm_clock;
//2选一模块用于选择显示12进制小时还是24进制小时 _2to1mux mu0(hour_all,hour_12_24,hour_12,hour);
//选择显示闹钟时间还是正常计时的时间
_2to1mux mu1(led_hr,mode,set_hr,hour_all); _2to1mux mu2(led_min,mode,set_min,minute); _2to1mux mu3(led_sec,mode,8'h00,second);
//用于选择是显示小时还是分钟
_2to1mux mu4(led_h_min,choose_h_m_de,led_hr,led_min);
//七段译码器模块调用
decoder de2(led_h_min,decoder_h_m); //译码小时和分钟的集成 decoder de3(led_sec,decoder_s); //译码秒的计数
endmodule
2、二选一模块
//二选一模块完成模式选择 module _2to1mux(out,sel,x,y);
input [7:0]x,y; //声明模块使用变量,用于接收小时与分钟的BCD码 input sel; //选择信号 output [7:0]out; //输出信号
assign out=sel?x:y; //用选择语句完成,为1时赋值X Endmodule
.
.
3、四位比较器模块
//4位比较器模块
module _4bitcomparer(equ,a,b);
input [3:0]a,b; //声明模块使用变量,用于接收待比较1位十进制数的BCD码 output equ; //输出变量,比较结果存储在此变量中,相等为1,不相等为0 assign equ=(a==b); Endmodule
4、分频器模块
(1)、1KHZ分频到500hz,4hz,1hz模块
module divided_frequency(_1hzout,_2hzout,_500hzout,ncr,en,_1khzin); input _1khzin,ncr,en;
output _1hzout,_2hzout,_500hzout; //分频器的结果输出,即不同频率的信号
wire[11:0] q; //用于获取分频信号的变量,在不同位上取,就可获得不同的频率信号 wire en1,en2; //使能信号
//通过使用三个十进制计数器完成1000进制的计数器扩展 counter10 du0(q[3:0],ncr,en,_1khzin); counter10 du1(q[7:4],ncr,en1,_1khzin); counter10 du3(q[11:8],ncr,en2,_1khzin); assign en1=(q[3:0]==4'd9);
assign en2=(q[7:4]==4'd9)&(q[3:0]==4'd9);
assign _1hzout=q[11]; assign _2hzout=q[10];
assign _500hzout=q[0]; //最低位实现二分频,位往高位移动,依次类推 Endmodule
(2)、50MHZ分频到1khz模块
module divided50mhz(_1khzin,ncr,_50mhz); input _50mhz,ncr; //异步清零端 output reg _1khzin;
reg [15:0]q; //用于存储计数数字 always(posedge _50mhz,negedge ncr) begin
if(~ncr) //异步清零 begin
q<=15'd0;
_1khzin<=1'b0;
end //当计数到24999时,1khz变量翻转,因为50mhz频率是1000hz的50000倍 else if(q==15'b110000110100111)
Begin //所以1khz的周期是50mhz的50000倍,24999个周期翻转一次,翻转两次构
.
.
成
q<=15'd0; //一个周期,恰好满足50000倍的周期关系,也就达到分频的效果 _1khzin<=(~_1khzin); end else begin
q<=q+1'b1; //正常加1 end end endmodule
5、十进制模块
module counter10(q,ncr,en,cp); input cp,ncr,en;
output [3:0] q; //输出变量 reg [3:0] q;
always(posedge cp,negedge ncr) //上升沿出发的时钟脉冲信号,下降沿出发的异步清零信号 begin
if(~ncr) q<=4'b0000; //异步清零
else if(~en) q<=q; //当使能为0时,暂停计数,保持原来的数值
else if(q==4'b1001)q<=4'b0000; //当数字到达第十个状态,也就是九时再次清零,完成一次十进制计数 else q<=q+1'b1; //正常计数 end Endmodule
6、六进制模块
//6进制计数器
module counter6(q,ncr,en,cp); input cp,ncr,en; output [3:0] q; reg [3:0] q;
always(posedge cp,negedge ncr) begin
if(~ncr) q<=4'b0000; else if(~en) q<=q;
else if(q==4'b0101)q<=4'b0000; //与十进制所不同的就是清零的状态不同 else q<=q+1'b1; end Endmodule
7、二十四进制模块
//24进制计数器,用于小时计数
.
.
module counter24(cnth,cntl,ncr,en,cp);
input cp,ncr,en; //时钟脉冲,与异步清零信号和使能信号 output [3:0]cnth,cntl; //24的十位和个位的BCD码表示 reg [3:0]cnth,ctnl;
always(posedge cp,negedge ncr) begin
if(~ncr) {cnth,cntl}<=8'h00; //异步清零
else if(~en) {cnth,cntl}<={cnth,cntl}; //使能为01时保持原有状态
else if((cnth>2)||(cntl>9)||((cnth==2)&&(cntl>=3))){cnth,cntl}<=8'h00; //当满足十位大于2,个位大于9,整体大于23时,都属于越界的情况都需要清零
else if((cnth==2)&&(cntl<3)) //当十位为2,个位小于3时,个位正常加1 beginth<=cnth;cntl<=cntl_1'b1;end
else if(cntl==9) //个位为9时,需要进位,然后个位再清零 begin th<=cnth+1'b1;cntl<=4'b0000;end else
beginth<=cnth;cntl<=cntl_1'b1;end //其他情况也是个位正常加1,十位保持原状 end Endmodule
8、十二进制模块
module counter12(cnth,cntl,ncr,en,cp); input cp,ncr,en;
output [3:0]cnth,cntl; reg [3:0]cnth,cntl;
always(posedge cp,negedge ncr) begin
if(~ncr) {cnth,cntl}<=8'h00;
else if(~en) {cnth,cntl}<={cnth,cntl};
else if((cnth>1)||(cntl>9)||((cnth==1)&&(cntl>=1))){cnth,cntl}<=8'h00; //与24进制所不同之处在于十位是1的时候开始复位 else if((cnth==1)&&(cntl<1))
beginth<=cnth;cntl<=cntl+1'b1;end else if(cntl==9)
begin th<=cnth+1'b1;cntl<=4'b0000;end else
beginth<=cnth;cntl<=cntl+1'b1;end end endmodule
9、七段译码管模块
module decoder(number,num_decoder);
input [7:0]number; //需要被译码的两位十进制数的BCD码
output reg [13:0]num_decoder; //译码输出变量,直接控制七段译码管的亮与灭 always(number,num_decoder)
.
.
begin
case(number[7:4]) //十位译码,DE0实验板上的显示管是共阳极,为0时亮 4'd0:num_decoder[13:7]=7'b0000001; 4'd1:num_decoder[13:7]=7'b1001111; 4'd2:num_decoder[13:7]=7'b0010010; 4'd3:num_decoder[13:7]=7'b0000110; 4'd4:num_decoder[13:7]=7'b1001100; 4'd5:num_decoder[13:7]=7'b0100100; 4'd6:num_decoder[13:7]=7'b0100000; 4'd7:num_decoder[13:7]=7'b0001111; 4'd8:num_decoder[13:7]=7'b0000000; 4'd9:num_decoder[13:7]=7'b0000100; default:num_decoder[13:7]=7'b1111111; endcase
case(number[3:0]) //个位译码 4'd0:num_decoder[6:0]=7'b0000001; 4'd1:num_decoder[6:0]=7'b1001111; 4'd2:num_decoder[6:0]=7'b0010010; 4'd3:num_decoder[6:0]=7'b0000110; 4'd4:num_decoder[6:0]=7'b1001100; 4'd5:num_decoder[6:0]=7'b0100100; 4'd6:num_decoder[6:0]=7'b0100000; 4'd7:num_decoder[6:0]=7'b0001111; 4'd8:num_decoder[6:0]=7'b0000000; 4'd9:num_decoder[6:0]=7'b0000100; default:num_decoder[6:0]=7'b1111111; endcase end
endmodule
五、模块功能仿真
1、二选一模块
.