Lab7_时序逻辑验证

一、简易电子时钟

  • 功能描述:

      设计一简易电子时钟,支持时、分、秒显示,其中HEX7-HEX6显示时,HEX5-HEX4显示分,HEX1-HEX0显示秒,假设进制为:18秒=1分钟;13分钟=1小时;9小时=1天。

  • 设计方案:

      首先,设计三个寄存器分别用来存储当前时、分、秒的计时结果,并将秒级作为最低级,进行嵌套循环:

      ①每逢时钟上升沿,秒加一,并对其进行判断,若符合进位条件,则该位置零,同时上一位加一;若上一位同时也符合进位条件,则继续向上一位进位。

      ②时钟上升沿出现的时间间隔为1s,则对应时钟频率为1Hz,初始时钟采用开发板自带的50MHz振荡器,对该信号进行分频,其中M=50M

  • 关键代码:

  1. module elec_clk(
  2. input clk,
  3. output reg [7:0] second=8'b00000000,
  4. output reg [7:0] minute=8'b00000000,
  5. output reg [7:0] hour=8'b00000000);
  6. always@(posedge clk) begin
  7. second <= second + 8'b00000001;
  8. if(second == 8'b00010001) begin //second:18
  9. second <= 8'b00000000;
  10. minute <= minute + 8'b00000001;
  11. if(minute == 8'b00001100) begin //minute:13
  12. minute <= 8'b00000000;
  13. hour <= hour + 8'b00000001;
  14. if(hour == 8'b00001000) //hour:9
  15. hour <= 8'b00000000;
  16. end
  17. end
  18. end
  19. endmodule
  20. module fpga_clk(
  21. input CLOCK_50,
  22. output [6:0] HEX0,
  23. output [6:0] HEX1,
  24. output [6:0] HEX4,
  25. output [6:0] HEX5,
  26. output [6:0] HEX6,
  27. output [6:0] HEX7);
  28. wire clock;
  29. wire [7:0] second_bin;
  30. wire [7:0] second_bcd;
  31. wire [7:0] minute_bin;
  32. wire [7:0] minute_bcd;
  33. wire [7:0] hour_bin;
  34. wire [7:0] hour_bcd;
  35. clk_div U0(
  36. .clk(CLOCK_50),
  37. .rstn(1),
  38. .clk_out(clock));
  39. elec_clk U1(
  40. .clk(clock),
  41. .second(second_bin),
  42. .minute(minute_bin),
  43. .hour(hour_bin));
  44. bin2bcd U3(
  45. .bin_code(second_bin),
  46. .bcd_code(second_bcd));
  47. bin2bcd U4(
  48. .bin_code(minute_bin),
  49. .bcd_code(minute_bcd));
  50. bin2bcd U5(
  51. .bin_code(hour_bin),
  52. .bcd_code(hour_bcd));
  53. led_display H0(
  54. .ctrl(0),
  55. .data(hour_bcd[3:0]),
  56. .dev0(HEX6));
  57. led_display H1(
  58. .ctrl(0),
  59. .data(hour_bcd[7:4]),
  60. .dev0(HEX7));
  61. led_display M0(
  62. .ctrl(0),
  63. .data(minute_bcd[3:0]),
  64. .dev0(HEX4));
  65. led_display M1(
  66. .ctrl(0),
  67. .data(minute_bcd[7:4]),
  68. .dev0(HEX5));
  69. led_display S0(
  70. .ctrl(0),
  71. .data(second_bcd[3:0]),
  72. .dev0(HEX0));
  73. led_display S1(
  74. .ctrl(0),
  75. .data(second_bcd[7:4]),
  76. .dev0(HEX1));
  77. endmodule
  • 综合结果:

      顶级模块的综合结果如图1,仅由分频模块和字符循环模块组成:

图1 顶级模块的综合结果

  elec_clk模块的综合结果如图2:

图2 elec_clk模块的综合结果

  summary结果如图3:

图3 summary结果
  • 总结分析:

      可以尝试将进位数据作为parameter,从而便于整个函数在后续过程中被调用。

  • 运行结果:

      另附视频。

二、七段管循环显示

  • 功能描述:

      ①在8个七段管上循环显示字符串:BUAA_1952-2022_(其中_表示七段管全灭);

      ②同时四个LED灯(LEDR[14-7])随BUAA的移动而移动;

      ③SW[17]作为复位信号,电平有效,LED灯全灭;

      ④SW[0]作为使能信号,电平有效,七段管和LED灯正常循环,低电平时,二者暂停循环;

      ⑤循环显示时间间隔为0.5s,即每隔0.5s字符串向左移一位。

图4 显示示例
  • 设计方案:

      ①循环显示的时间间隔为0.5s,我们选择每逢时钟上升沿进行一次移位,则对应时钟的频率为2Hz,初始时钟采用开发板自带的50MHz振荡器,对该信号进行分频,其中M=25M

      ②使用一个长度为7N的寄存器变量来存储字符,每个字符占七位,同时考虑到复位信号有效时,能够回复到初始状态,则应分别创建一个初始寄存器来寄存初始字符串,另一个寄存器来存储循环移位的结果,与此同时设置一个7*8的寄存器用来存储七段管上字符情况

      ③对于LED灯,可知不同循环阶段时对应的亮暗情况是不同的,这里选择用i循环的状态做标记,遍历出i的状态及相应的LED灯亮暗情况。
  • 关键代码:
  1. module str_display(
  2. input clk,
  3. input reset,
  4. input ensignal,
  5. input [104:0] str,
  6. output reg [55:0] seven,
  7. output reg [7:0] LED_state);
  8. reg [104:0] shift_str;
  9. reg [3:0] i=14;
  10. always@(posedge clk) begin
  11. if(reset) begin
  12. shift_str[104 -: 105] <=str[104 -: 105];
  13. seven[55 -: 56] <= 56'b1;
  14. LED_state <= 8'b00000000;
  15. end
  16. else if(!ensignal) begin
  17. shift_str[104 -: 105] <= shift_str[104 -: 105];
  18. seven[55 -: 56] <= seven[55 -: 56];
  19. LED_state <= LED_state;
  20. end
  21. else begin
  22. seven[55:0] <= {seven[48 -: 49],shift_str[104 -: 7]};
  23. shift_str[104:0] <= {shift_str[97 -: 98],shift_str[104 -: 7]};
  24. case(i)
  25. 4'b1110: LED_state <= 8'b00000001;
  26. 4'b1101: LED_state <= 8'b00000011;
  27. 4'b1100: LED_state <= 8'b00000111;
  28. 4'b1011: LED_state <= 8'b00001111;
  29. 4'b1010: LED_state <= 8'b00011110;
  30. 4'b1001: LED_state <= 8'b00111100;
  31. 4'b1000: LED_state <= 8'b01111000;
  32. 4'b0111: LED_state <= 8'b11110000;
  33. 4'b0110: LED_state <= 8'b11100000;
  34. 4'b0101: LED_state <= 8'b11000000;
  35. 4'b0100: LED_state <= 8'b10000000;
  36. default: LED_state <= 8'b00000000;
  37. endcase
  38. if(i==0)
  39. i<=14;
  40. else
  41. i<=i-1'b1;
  42. end
  43. end
  44. endmodule
  45. module fpga_seven(
  46. input CLOCK_50,
  47. input [17:0] SW,
  48. output [17:0] LEDR,
  49. output [6:0] HEX0,
  50. output [6:0] HEX1,
  51. output [6:0] HEX2,
  52. output [6:0] HEX3,
  53. output [6:0] HEX4,
  54. output [6:0] HEX5,
  55. output [6:0] HEX6,
  56. output [6:0] HEX7);
  57. wire clk;
  58. wire [55:0] seven;
  59. wire [7:0] LED_state;
  60. reg [104:0] str=105'b000000010000011001000100100011111111111001001000000100100100100011111101001001000000010010001001001111111;
  61. clk_div U0(
  62. .clk(CLOCK_50),
  63. .rstn(1),
  64. .clk_out(clk));
  65. str_display U1(
  66. .clk(clk),
  67. .reset(SW[17]),
  68. .ensignal(SW[0]),
  69. .str(str),
  70. .seven(seven),
  71. .LED_state(LED_state));
  72. assign LEDR[14 -: 8]=LED_state[7 -: 8];
  73. assign HEX7=seven[55 -: 7];
  74. assign HEX6=seven[48 -: 7];
  75. assign HEX5=seven[41 -: 7];
  76. assign HEX4=seven[34 -: 7];
  77. assign HEX3=seven[27 -: 7];
  78. assign HEX2=seven[20 -: 7];
  79. assign HEX1=seven[13 -: 7];
  80. assign HEX0=seven[6 -: 7];
  81. endmodule
  • 综合结果:

      顶级模块的综合结果如图5,仅由分频模块和字符循环模块组成:

图5 顶级模块的综合结果

  str_display模块的综合结果如图6:

图6 str_display模块的综合结果

  7

图7 summary结果
  • 总结分析:

      最初进行设计时,将大部分功能的实现全部放在了顶级模块中,结果造成在调整思路时异常混乱,将功能模块和顶级模块的实现分开可以使得整体设计的脉络更加清晰,同时有利于在不同的电路中进行复用。

  • 运行结果:

      另附视频。

数电第11周周结_by_yc的更多相关文章

  1. 模电&数电知识整理(不定期更新)

    模电总复习之爱课堂题目概念整理 Chapter 1 1) 设室温情况下某二极管的反偏电压绝对值为1V,则当其反偏电压值减少100mV时,反向电流的变化是基本不发生变化. 2) 二极管发生击穿后,在击穿 ...

  2. 数电课设——琐碎

    这几天没有更新过网站了,也没继续开发VellLock了,可是感觉还是没有闲着,一直在跟下面的一些元器件在打交道,当然下面的都是小儿科,英文文档都看得我快吐血了.数电基本属于棺材边上过的我,是各种头大, ...

  3. java第二周周学习总结

    java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){    执行语句;   //一段代码} 初始化表达式:初 ...

  4. web前端笔记整理,从入门到上天,周周更新

    由于大前端知识点太多,所以一一做了分类整理,详情可见本人博客 http://www.cnblogs.com/luxiaoyao/ 一.HTML 1.注释 格式:<!-- 注释内容 --> ...

  5. FPGA大公司面试笔试数电部分,看看你会多少

    1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...

  6. 数电基础之《OC门》

    OC门,又称集电极开路门,Open Collector.   为什么引入OC门?实际使用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去 ...

  7. 指尖上的电商---(11)Windows平台部署SolrCloud

    SolrCloud是一种分布式解决方式,是基于zookeeper和solr的,能够简单理解为一种集群,能够提供分布式查询.分布式写索引. SolrCloud的结构大致是这种,一个SolrCloud包含 ...

  8. Flutter实战视频-移动电商-11.首页_屏幕适配方案讲解

    11.首页_屏幕适配方案讲解 国人写的屏幕适配插件: https://github.com/OpenFlutter/flutter_screenutil 最新版本是0.5.1 在pubspec.yam ...

  9. STM32f103的数电采集电路的DMA设计和使用优化程序

    DMA,全称为:Direct Memory Access,即直接存储器访问.DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直 ...

  10. 数电——全减器分析(用74HC138设计提示)

    -1=1(即Di=1). Di=(Y1' * Y2' * Y4' * Y7')'可以得到74HC138来表示,(注意:Ai,Bi,Ci-1的各自位权对应A2,A1,A0) Ci同理可得.

随机推荐

  1. Elasticsearch:单节点数据迁移

    Elasticsearch数据迁移:windows单节点迁移到windows 将源数据中的ES安装目录下的data/nodes目录整体拷贝到目标ES的对应目录下 迁移前请备份:迁移后需要重启ES: E ...

  2. rollup汇总作业-合并索引

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106194800

  3. 使用 Elastic Stack 分析地理空间数据 (二)

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106546064 在之前的文章 "Observability:使用 Elas ...

  4. 面试突击86:SpringBoot 事务不回滚?怎么解决?

    在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚: 当 @Transactional 遇上 try/catch 事务不自动 ...

  5. 谣言检测——(PSA)《Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks》

    论文信息 论文标题:Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks论文作者:Jiayin ...

  6. 「产品运营」研发效能之DevOps平台如何运营?

    有人常说「酒香不怕巷子深」.不是的,如果这个巷子是酒吧街,那最深的那家酒吧肯定是租金最便宜的.酒吧的地段好坏已经在租金价格上体现出来了.现在已经不是那个工具缺乏.有个工具就拍手称快.欣然去试用的时代了 ...

  7. 大数据常用的Linux命令

    Linux文件系统基础知识 要想熟练使用命令,就先要熟练掌握Linux文件系统基础知识: 三个路径 当前路径:也叫当前工作目录,就是当前状态下用户所处的位置 相对路径:相对于当前工作目录开始的路径,会 ...

  8. 洛谷P4147 玉蟾宫 (单调栈)

    要求我们去找一个最大矩形面积. 单调栈做法(和P1950 长方形那道题类似(一模一样)). 1 #include<bits/stdc++.h> 2 using namespace std; ...

  9. Tomcat实战之路

    目录 第一节.安装升级 1.1.linux初始化 1.2.安装 1.3.升级 第二节.配置 2.1.虚拟主机 2.2.默认网站首页路径 2.3.跳转 2.4.配置Tomcat日志 第三节.安全 3.1 ...

  10. java 入土--集合详解

    java 集合 集合是对象的容器,实现了对对象的常用的操作,类似数组功能. 和数组的区别: 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 使用时需要导入类 Col ...