河工大vivado-多种能数字钟电路设计

一、实验目的

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

38909b60c25f4c0bba6cc46503e9be99.jpg

6f8c0e91b52e4c4aa1115a2cc88c1750.png

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vivado是一款常用的FPGA开发工具,可以用来设计和实现电子电路。根据引用[1]和引用的描述,可以使用Vivado开发环境实现一个能显示小时分秒以及闹钟功能的电子钟。具体步骤如下: 1. 首先,需要使用Verilog编程语言编写电子钟的代码。根据引用和引用的描述,可以将电子钟的功能分为三个子模块:alarm(闹钟模块),clock(时钟模块)和control(控制模块)。顶层模块将这三个子模块连接在一起,并实现显示和设置时间的功能。 2. 在Vivado中创建一个新工程,并将编写好的Verilog代码添加到工程中。 3. 使用Vivado的综合工具将Verilog代码综合成逻辑电路的网表。 4. 使用约束文件指定FPGA芯片上的引脚分配和时钟约束。 5. 使用Vivado的布局和布线工具对电路进行布局和布线。 6. 使用Vivado的时序分析工具对电路进行时序分析,确保电路的时序满足设计要求。 7. 使用Vivado的生成比特流工具将布线后的电路生成比特流文件。 8. 将比特流文件下载到目标FPGA芯片上进行验证和测试。 综上所述,可以使用Vivado开发环境来设计和实现一个能显示小时分秒以及闹钟功能的电子钟。具体的步骤包括编写Verilog代码、综合、布局和布线、时序分析以及生成比特流文件等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用verilog实现一个电子钟,能显示小时分秒以及闹钟功能,在vivado开发,纯verilog编程](https://download.csdn.net/download/ccsss22/85312195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [利用vivado实现FPGA的数字时钟.zip](https://download.csdn.net/download/m0_45937406/18816022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [FPGA入门学习笔记(十六)Vivado设计基于串口校时的数字钟](https://blog.csdn.net/weixin_45463952/article/details/129633228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白义

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值