一、实验目的
1. 了解可参数化宏模块及其应用,掌握层次化结构电路设计的思想。
2. 进一步掌握EDA电子系统设计及其分析方法。
二、实验设备
1、 计算机
2、 实验板
三、实验要求:
1、在PC机上完成仿真,对结果进行分析;
2、完成下载,在实验板上进行验证。
3、通过分组进行项目实践。
四、实验内容
(一)多功能数字钟设计
1、设计原理
我所设计的是多种能数字钟电路设计,其中包括模块:
时钟信号生成模块
利用板载的100MHz的晶振设计计时1s的时钟,再设计1024hz、512hz、2hz、1hz的频率来实现整点报时和闹钟的警报频率。
计时功能模块
借用之前所学的计数器功能设计时计时器、分计数器和秒计数器。时计数器采用24进制计数器,其余两个计数器的十位是六进制计数器,个位是十进制器。
闹钟计时功能模块
闹钟功能则是与计时功能计数器相似。
整点报时模块
当闹钟计数器与计时功能计数器的数值通过比较器和选择器相互配合,再与时钟信号发生器所设计的声音频率配合在耳机中产生声音。
显示模块
配合之前所设计的多位数码管显示,将其封装IP调用,还借用计数器产生扫描信号配合多路选择器来显示。
给出设计源文件
module clock(
input clk,
input sd,
input rst,
input close,
input enable,
input set,
input adj_m,
input adj_h,
output [7:0]bitcode,
output [6:0]a_to_g1,
output [6:0]a_to_g2,
output soundout
); //音频输出
wire clk1000H,clk500H,clk1s,clk2s;
wire [4:0]sl,sh,c_ml,c_mh,c_h,s_ml,s_mh,s_h;
assign sd=1;
jishi u1(clk1s,rst,enable,set,adj_m,adj_h,sl,c_ml,sh,c_mh,c_h);
displayc u2(clk,rst,set,adj_m,adj_h,sl,sh,c_ml,c_mh,c_h,s_ml,s_mh,s_h,
bitcode,a_to_g1,a_to_g2);
fenpin u3(clk,rst,clk1000H,clk500H,clk1s,clk2s);
alarmclock u4(clk1s,rst,set,adj_m,adj_h,s_ml,s_mh,s_h);
sound u5(clk1000H,clk500H,clk1s,clk2s,close,sl,sh,c_ml,c_mh,c_h,s_ml,
s_mh,s_h,soundout);
endmodule
module fenpin(
input clk,
input rst,
output clk1000H,
output clk500H,
output clk1s,
output clk2s);
frequency1#9999_9999 u1(clk,rst,clk2s);
frequency1#4_9999 u2(clk,rst,clk1000H);
frequency1#19_9999 u3(clk,rst,clk500H);
frequency1#4999_9999 u4(clk,rst,clk1s);
endmodule
module counter
#( parameter [4:0]count_max=5'b01001)
(
input clk,
input rst,
input en,
output co,
output reg[4:0]count);
always @(posedge clk or negedge rst)
if(rst==0) count<=0;
else
if(en==1)
if(count==count_max) count<=0; else count<=count+1;
else count<=count;
assign co=((count==count_max)&&(en==1))?1:0;
endmodule
module jishi(
input clk1s,
input rst,
input enable,
input set,
input adj_m,
input adj_h,
output [4:0]sl,
output [4:0]c_ml,
output [4:0]sh,
output [4:0]c_mh,
output [4:0]c_h);
wire c_sh_en,c_ml_en,c_mh_en,c_h_en;
wire c_h_en1,c_ml_en1,c_mh_en1;
wire disa;
assign disa=1;
assign c_ml_en=((~set) && adj_m)||(c_ml_en1 && c_sh_en);
assign c_mh_en=c_mh_en1 && c_ml_en;
assign c_h_en=(~set && adj_h)||(c_sh_en && c_ml_en1 && c_mh_en1 && c_h_en1);
counter#(5'b01001) u1 (clk1s,rst,enable,c_sh_en,sl);
counter#(5'b00101) u2 (clk1s,rst,c_sh_en,c_ml_en1,sh);
counter#(5'b01001) u3 (clk1s,disa,c_ml_en,c_mh_en1,c_ml);
counter#(5'b00101) u4 (clk1s,disa,c_mh_en,c_h_en1,c_mh);
counter#(5'b10111) u5 (.clk(clk1s),.rst(disa),.en(c_h_en),.count(c_h));
endmodule
module alarmclock(
input clk1s,
input rst,
input set,
input adj_m,
input adj_h,
output [4:0]s_ml,
output [4:0]s_mh,
output [4:0]s_h);
wire s_ml_en,s_mh_en,s_h_en;
wire disa;
assign disa=1;
assign s_ml_en=set && adj_m;
assign s_h_en=set && adj_h;
counter #(5'b01001) u6 (clk1s,disa,s_ml_en,s_mh_en,s_ml);
counter #(5'b00101) u7 (.clk(clk1s),.rst(disa),.en(s_mh_en),.count(s_mh));
counter #(5'b10111) u8 (.clk(clk1s),.rst(disa),.en(s_h_en),.count(s_h));
endmodule
module sound(
input clk1000H,
input clk500H,
input clk1s,
input clk2s,
input close,
input [4:0]sl,
input [4:0]sh,
input [4:0]c_ml,
input [4:0]c_mh,
input [4:0]c_h,
input [4:0]s_ml,
input [4:0]s_mh,
input [4:0]s_h,
output soundout);
wire sound1,sound2,sound3;
assign sound1=((s_ml==c_ml)&&(s_mh==c_mh)&&(s_h==c_h)&& (close==0))?clk500H:1'b0;
assign sound2=((c_ml==0)&&(c_mh==0)&&(sh==0)&&(sl==0)&&(clk1s==0))?clk1000H:1'b0;
assign sound3=((c_ml==9)&&(c_mh==5)&&(sh==5)&&(clk2s==0)&&(clk1s==0))?clk500H:1'b0;
assign soundout=sound1||sound2||sound3;
endmodule
module displayc(
input clk,
input rst,
input set,
input adj_m,
input adj_h,
input [4:0]sl,
input [4:0]sh,
input [4:0]c_ml,
input [4:0]c_mh,
input [4:0]c_h,
input [4:0]s_ml,
input [4:0]s_mh,
input [4:0]s_h,
output [7:0]bitcode,
output [6:0]a_to_g1,
output [6:0]a_to_g2);
wire [4:0]hh,hl,ml,mh,h,value;
wire [3:0]bitcode1,bitcode2;
assign bitcode={2'b00,bitcode1[3:2],bitcode2};
assign h=(set==0)?c_h:s_h;
assign mh=(set==0)?c_mh:s_mh;
assign ml=(set==0)?c_ml:s_ml;
assign hh=(h>=10 && h<20)?1:((h>=20)?2:0);
assign hl=(h<10)?(h-0):(((h>=10) && (h<20))?(h-10):(h-20));
tube1 u1(clk,rst,{mh[3:0],ml[3:0],sh[3:0],sl[3:0]},a_to_g2,bitcode2);
tube1 u2(clk,rst,{8'b00000000,hh[3:0],hl[3:0]},a_to_g1,bitcode1);
endmodule
module tube1(
input clk100M,
input rst,
input [15:0]sw,
output [6:0]a_to_g1,
output reg[3:0]bitcode1);
reg [1:0]dispbit1;
wire clkout1;
reg [3:0]bitnum1;
frequency1 #(49_999) u1(clk100M,rst,clkout1);
sw_smg10 u2(bitnum1,a_to_g1);
always@(posedge clkout1 or negedge rst)
begin
if(rst==0) dispbit1<=0;
else if(dispbit1>=3) dispbit1<=0;
else dispbit1<=dispbit1+1;
end
always @(dispbit1 or sw)
begin
case(dispbit1)
2'b00:begin bitnum1=sw[15:12]; bitcode1=4'b0001; end
2'b01:begin bitnum1=sw[11:8]; bitcode1=4'b0010; end
2'b10:begin bitnum1=sw[7:4]; bitcode1=4'b0100; end
2'b11:begin bitnum1=sw[3:0]; bitcode1=4'b1000; end
default:begin bitnum1=4'b0000; bitcode1=4'b0000; end
endcase
end
endmodule
module frequency1
#( parameter integer count1s=49_999_999)
(
input clk100M,
input rst,
output reg clkout);
reg [28:0]count;
always@(posedge clk100M or negedge rst)
if(rst==0)
count<=0;
else if(count<count1s)
count<=count+1;
else
count<=0;
always@(posedge clk100M or negedge rst)
if(rst==0)
clkout<=1'b0;
else if(count<count1s)
clkout<=clkout;
else
clkout<=~clkout;
endmodule
module sw_smg10(
input [3:0]sw,
output reg[6:0]a_to_g);
always@(sw)
begin
case(sw)
4'b0000:a_to_g=7'h3f;
4'b0001:a_to_g=7'h06;
4'b0010:a_to_g=7'h5b;
4'b0011:a_to_g=7'h4f;
4'b0100:a_to_g=7'h66;
4'b0101:a_to_g=7'h6d;
4'b0110:a_to_g=7'h7d;
4'b0111:a_to_g=7'h07;
4'b1000:a_to_g=7'h7f;
4'b1001:a_to_g=7'h6f;
default:a_to_g=7'h00;
endcase
end
endmodule