上次计数器里说到利用PYNQ-Z2的开发板上Arm核与上位机实现串口通信将4位计数器的结果实时回传到上位机的串口界面中还没做好捏,插播一个小破时钟吧。

首先呢我这只用了一个十进制同步置位异步复位的计数芯片74160哈,然后时钟的话最基本的当然就是小时的24进制和分钟秒钟的60进制啦,所以就是利用74160整24进制和60进制的电路然后给它接一起(进位信号啥的做对输入)然后基本的电子钟功能就实现啦。

做完了基本功能后想到以前小时候家里的时候整点都会响一声嘛,一般好像是正午和晚上的十二点,不过我写的Verilog是在每一个整点都会有一个Remind信号,大概改一下就可以实现正午和晚上啦。然后emmm还拓展了一个闹钟的功能,可以在设定的时间有一个RES信号出现,在上板子后接个蜂鸣之类的就可以作为闹钟了。不过有个问题呢就是这个时钟只能从00:00开始,没加入人为设置时间的功能、或者说可以联网同步世界时钟就更好了!感兴趣的小伙伴可以试试看捏。

/*Description: Digital ClockAuthor: jc, luo
*/

先写一个基本的74160芯片吧。

`timescale 1ns / 1ps
module Counter74160(input clk,input CR_n,input LD_n,input EP,ET,input D,C,B,A,output reg RCO = 1'b0,output [3:0]Q);reg [3:0]data_in;assign Q = data_in;always@ (negedge clk or negedge CR_n)beginif(~CR_n)begindata_in <=4'b0;RCO     <=1'b0;endelse if( ~LD_n )data_in <= { D, C, B, A };else if( ~EP | ~ET )data_in <= data_in;        elsebegindata_in <= (data_in < 4'b1001) ? data_in + 1'b1 : 4'b0;RCO     <= (data_in < 4'b1001) ? 1'b0           : 1'b1;endend
endmodule

然后的话利用一下时序电路的知识利用置数法设计60进制、整体置数法设计24进制(复位清零法也可用,不过要注意毛刺信号一般忽略不计,为此计数过程中需要注意到n还是n+1)

// 60 进制
`timescale 1ns / 1ps
module Counter_60bit(CLK,RST,C_Second,Q_1,Q_2
);input wire    CLK;
input wire  RST;
output wire C_Second;
output wire [3:0] Q_1;
output wire [3:0] Q_2;wire  SYNTHESIZED_WIRE_21;
wire    SYNTHESIZED_WIRE_22;
wire    SYNTHESIZED_WIRE_23;
wire    SYNTHESIZED_WIRE_8;
wire    SYNTHESIZED_WIRE_24;
wire    SYNTHESIZED_WIRE_17;
wire    SYNTHESIZED_WIRE_19;
wire    SYNTHESIZED_WIRE_20;assign  SYNTHESIZED_WIRE_20 = Q_2[0];
assign  SYNTHESIZED_WIRE_19 = Q_2[2];
assign  SYNTHESIZED_WIRE_21 = 1;
assign  SYNTHESIZED_WIRE_22 = 0;Counter74160   b2v_inst(.clk(CLK),.ET(SYNTHESIZED_WIRE_21),.A(SYNTHESIZED_WIRE_22),.B(SYNTHESIZED_WIRE_22),.C(SYNTHESIZED_WIRE_22),.D(SYNTHESIZED_WIRE_22),.LD_n(SYNTHESIZED_WIRE_21),.EP(SYNTHESIZED_WIRE_21),.CR_n(SYNTHESIZED_WIRE_23),.Q(Q_1),.RCO(SYNTHESIZED_WIRE_17));Counter74160      b2v_inst1(.clk(SYNTHESIZED_WIRE_8),.ET(SYNTHESIZED_WIRE_21),.A(SYNTHESIZED_WIRE_22),.B(SYNTHESIZED_WIRE_22),.C(SYNTHESIZED_WIRE_22),.D(SYNTHESIZED_WIRE_22),.LD_n(SYNTHESIZED_WIRE_24),.EP(SYNTHESIZED_WIRE_21),.CR_n(SYNTHESIZED_WIRE_23),.Q(Q_2));assign  SYNTHESIZED_WIRE_23 =  ~RST;
assign  SYNTHESIZED_WIRE_8 =  ~SYNTHESIZED_WIRE_17;
assign  C_Second =  ~SYNTHESIZED_WIRE_24;
assign  SYNTHESIZED_WIRE_24 = ~(SYNTHESIZED_WIRE_19 & SYNTHESIZED_WIRE_20);endmodule
// 24进制
`timescale 1ns / 1ps
module Counter_24bit(C_Minute,RST,Q_1,Q_2,
);input wire    C_Minute;
input wire  RST;
output wire [3:0] Q_1;
output wire [3:0] Q_2;wire  SYNTHESIZED_WIRE_20;
wire    SYNTHESIZED_WIRE_21;
wire    SYNTHESIZED_WIRE_22;
wire    SYNTHESIZED_WIRE_23;
wire    SYNTHESIZED_WIRE_24;
wire    SYNTHESIZED_WIRE_16;
wire    SYNTHESIZED_WIRE_17;
wire    SYNTHESIZED_WIRE_18;assign  SYNTHESIZED_WIRE_18 = Q_2[1];
assign  SYNTHESIZED_WIRE_16 = Q_1[0];
assign  SYNTHESIZED_WIRE_17 = Q_1[1];
assign  SYNTHESIZED_WIRE_20 = 1;
assign  SYNTHESIZED_WIRE_21 = 0;Counter74160   b2v_inst(.clk(C_Minute),.ET(SYNTHESIZED_WIRE_20),.A(SYNTHESIZED_WIRE_21),.B(SYNTHESIZED_WIRE_21),.C(SYNTHESIZED_WIRE_21),.D(SYNTHESIZED_WIRE_21),.LD_n(SYNTHESIZED_WIRE_22),.EP(SYNTHESIZED_WIRE_20),.CR_n(SYNTHESIZED_WIRE_23),.Q(Q_1),.RCO(SYNTHESIZED_WIRE_24));Counter74160     b2v_inst1(.clk(C_Minute),.ET(SYNTHESIZED_WIRE_24),.A(SYNTHESIZED_WIRE_21),.B(SYNTHESIZED_WIRE_21),.C(SYNTHESIZED_WIRE_21),.D(SYNTHESIZED_WIRE_21),.LD_n(SYNTHESIZED_WIRE_22),.EP(SYNTHESIZED_WIRE_24),.CR_n(SYNTHESIZED_WIRE_23),.Q(Q_2));assign    SYNTHESIZED_WIRE_23 =  ~RST;assign SYNTHESIZED_WIRE_22 = ~(SYNTHESIZED_WIRE_16 & SYNTHESIZED_WIRE_17 & SYNTHESIZED_WIRE_18);endmodule

然后的话闹钟的实现我是考虑把设定时间与流动的实际时间做一个比对,只要二者一致即表明到了设定的闹钟时间,为此考虑用同或逻辑实现(考虑到一般闹钟只精确到时位和分位这里做的也只有时位和分位)

`timescale 1ns / 1ps
module Judge(P,Q,RES
);input wire [7:0] P;input wire [7:0] Q;output wire RES;assign RES = ((P[0]~^Q[0]) &(P[1]~^Q[1]) &(P[2]~^Q[2]) &(P[3]~^Q[3]) &(P[4]~^Q[4]) &(P[5]~^Q[5]) &(P[6]~^Q[6]) &(P[7]~^Q[7]) );
endmodule

最后就是顶层数字电子钟调用上述几个模块整合成一个真正能用的电子钟了

`timescale 1ns / 1ps
module Digital_Clock(CLK,RST,P,Q_sec,Q_min,Q_hour,Remind,RES
);input wire [15:0] P;
input wire  CLK;
input wire  RST;
output wire [7:0] Q_sec;
output wire [7:0] Q_min;
output wire [7:0] Q_hour;
output wire Remind;
output wire RES;wire    SYNTHESIZED_WIRE_18;
wire    SYNTHESIZED_WIRE_19;
wire    SYNTHESIZED_WIRE_20;
wire    SYNTHESIZED_WIRE_21;assign  Remind = SYNTHESIZED_WIRE_21;Counter_24bit b2v_inst(.RST(RST),.C_Minute(SYNTHESIZED_WIRE_21),.Q_1(Q_hour[3:0]),.Q_2(Q_hour[7:4]));Counter_60bit    b2v_inst2(.RST(RST),.CLK(SYNTHESIZED_WIRE_20),.Q_1(Q_min[3:0]),.Q_2(Q_min[7:4]),.C_Second(SYNTHESIZED_WIRE_21));Judge   b2v_inst28(.P(P[7:0]),.Q(Q_min),.RES(SYNTHESIZED_WIRE_18));Judge    b2v_inst29(.P(P[15:8]),.Q(Q_hour),.RES(SYNTHESIZED_WIRE_19));Counter_60bit  b2v_inst3(.RST(RST),.CLK(CLK),.Q_1(Q_sec[3:0]),.Q_2(Q_sec[7:4]),.C_Second(SYNTHESIZED_WIRE_20));assign  RES = SYNTHESIZED_WIRE_18 & SYNTHESIZED_WIRE_19;endmodule

很想吐槽CSDN没有Verilog的代码显示捏,看着好单调好难受,emmm。

tb(测试代码)有需要的话踢一下我,量不少就不放上来了,看看几个模块的测试结果就好。

74160十进制计数器(0-9)

60进制计数器(0-59)

24进制计数器(0-23)

判断期望与实际是否一致(闹钟逻辑)

END

例化74LS160实现数字电子钟相关推荐

  1. Verilog设计实例(7)基于Verilog的数字电子钟设计

    博文目录 写在前面 正文 设计要求 设计思想 设计文件 仿真文件 参考资料 交个朋友 写在前面 前段时间,有几个小伙伴向我请教数字电子钟设计的问题,这个问题我在之前的BCD计数器以及数码管显示问题中已 ...

  2. HDLBits答案(3)_Verilog模块的例化与调用

    HDLBits_Verilog模块的例化与调用 HDLBits链接 模块 只要使用的所有模块都属于同一个项目,就可以通过在模块内部实例化一个模块来创建模块的层次结构.一个模块的代码不能在另一个模块的主 ...

  3. 信息学奥赛一本通 1258:【例9.2】数字金字塔

    [题目链接] ybt 1258:[例9.2]数字金字塔 [题目考点] 1. 记忆化搜索 2. 动态规划基本型 [解题思路] 思路1:一般深搜(非正确解) 每到一个位置,更新加和,向左下,右下两个方向搜 ...

  4. (11)VHDL例化system Verilog

    (11)VHDL例化system Verilog 1.1 目录 1)目录 2)FPGA简介 3)VHDL简介 4)VHDL例化system Verilog 5)结语 1.2 FPGA简介 FPGA(F ...

  5. (09)VHDL例化VHDL

    (09)VHDL例化VHDL 1.1 目录 1)目录 2)FPGA简介 3)VHDL简介 4)VHDL例化VHDL 5)结语 1.2 FPGA简介 FPGA(Field Programmable Ga ...

  6. (10)VHDL例化verilog

    (10)VHDL例化verilog 1.1 目录 1)目录 2)FPGA简介 3)VHDL简介 4)VHDL例化verilog 5)结语 1.2 FPGA简介 FPGA(Field Programma ...

  7. (91)FPGA模块例化(module)

    (91)FPGA模块例化(module) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化(module) 5)结语 1.2 FPGA简介 FPGA(Fi ...

  8. (94)FPGA模块例化传递参数(input)

    (94)FPGA模块例化传递参数(input) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化传递参数(input) 5)结语 1.2 FPGA简介 F ...

  9. (92)FPGA模块例化传递参数(parameter)

    (92)FPGA模块例化传递参数(parameter) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化传递参数(parameter) 5)结语 1.2 ...

最新文章

  1. java socket datagramsocket_用DatagramSocket写的个渣渣聊天后台,求拍砖
  2. 初学者python编辑器-面向初学者的Python编辑器Mu
  3. RobotFrameWork接口报文测试-----(一)简单demo的实现
  4. 从Internet上抓取指定URL的源码的方案
  5. 类与接口(五)java多态、方法重写、隐藏
  6. 特征阻抗输入阻抗输出阻抗_软件阻抗说明
  7. 使用开源的openssl的md5头文件,实现对于文件的md5代码
  8. ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)
  9. 每天一个linux命令:du 与 df
  10. java判断是否为5的倍数,如何用编程实现“判断输入的正整数是否既是5又是7的正倍数,若是,则输出yes,否则输出no”?...
  11. 人月神话(40周年中文纪念版)
  12. mysql的skip-slave-start参数
  13. Excel 高效办公合集 (1): Excel 一键求和
  14. GTA4 EFLC cheat code
  15. 安全防御----防火墙
  16. C++ 计算多边形的面积,计算IOU
  17. 微信公众号文章爬取方法整理
  18. TIOBE 1 月编程语言:Python 摘得 2020 年度编程语言
  19. SQLServer2019安装(Windows)
  20. iOS UIScrollview 取消弹簧效果

热门文章

  1. 百度关键词ad竞价的优劣势分析,信息流优化师必看
  2. jeesite使用mysql8.0驱动配置
  3. 【IE11】兼容低IE版本的设置方法
  4. Navicat Premium12 安装报错、解决办法
  5. IDEA打包Maven项目
  6. Win10 /Win8系统遇到驱动需要数字签名无法安装问题怎么办
  7. 火狐浏览器显示服务器超时,Firefox为什么有时会出现警告说连接超时
  8. JEB反编译器crack版功能和选项
  9. [高数]e^x(sinx)^2的不定积分
  10. SWMM从入门到实践教程 04 快速入门案例的模拟执行