好文档 - 专业文书写作范文服务资料分享网站

华中科技大学电子线路设计测试实验FPGA数字钟设计报告

天下 分享 时间: 加入收藏 我要投稿 点赞

.

_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、二选一模块

.

6opmo5ms5q4vbt01gdv99bpag891bi0041u
领取福利

微信扫码领取福利

微信扫码分享