有限状态机设计实例之空调控制器(Verilog HDL语言描述)(仿真与综合)(附用Edraw(亿图)画状态转移图)

举报
李锐博恩 发表于 2021/07/15 08:06:47 2021/07/15
【摘要】 目录 前言 空调控制器 简介 状态转移图如下: Verilog HDL语言描述 测试文件 仿真图 ISE综合 RTL Schematic Technology Schematic 前言 关于工具的使用,这两天我比较重视,因为我想找到一些替代手工的工具来帮助画图,昨天无意间发现了画时序图的工具(WaveDrom),觉得十分的好用,因此写了一篇博文,专门...

目录

前言

空调控制器

简介

状态转移图如下:

Verilog HDL语言描述

测试文件

仿真图

ISE综合

RTL Schematic

Technology Schematic


前言

关于工具的使用,这两天我比较重视,因为我想找到一些替代手工的工具来帮助画图,昨天无意间发现了画时序图的工具(WaveDrom),觉得十分的好用,因此写了一篇博文,专门的介绍,用了两个案例介绍了如何使用。见博文:对如何使用WaveDrom画波形图的研究(案例分解分析)

今天想专门清理下有限状态机的相关知识,这其中就需要画状态转移图,于是又寻思寻找一个画状态转移图的工具,我知道的有Visio,可是我不想用这个软件,找了好几个,最终选择了Edraw(亿图),还挺方便,简单实用。

于是就用这个案例,一个简单的空调控制器来认识一下有限状态机,工作原理直接由状态转移图给出,状态转移图直接由Edraw来画出 。这个空调控制器由Verilog HDL来描述,通过Modelsim进行功能仿真,然后用ISE来综合出RTL Schematic以及Technology Schematic。

用亿图画状态转移图

首先直接给出成品:

 

感觉还算美观哈。

软件的界面还算美观,直观:

画状态转移图时,选择流程图中的数据流程图,然后点击创建即可,里面的东西一用就会。

空调控制器

简介

下面用Verilog HDL语言描述一个简单的空调控制系统。整个系统由时钟控制,是一个带有异步复位的上升沿触发系统,该控制系统控制空调的三个状态,分别为:well_situated(10)、too_high(00)、too_low(01)。

当空调处于某种状态时,通过输入不同的high和low值控制空调的状态转移,在每种状态下对应不同的输出cold和heat值。

状态转移图如下:

Verilog HDL语言描述


  
  1. //a simple aircondition control system descripted by Verilog HDL
  2. module aircondition(clk,rst,high,low,heat,cold);
  3. input clk,rst,high,low;
  4. output heat,cold;
  5. reg heat,cold;
  6. reg [1:0] pr_state,next_state;
  7. parameter too_high = 2'b00;
  8. parameter too_low = 2'b01;
  9. parameter well_situated = 2'b10;
  10. always@ (posedge clk or posedge rst)
  11. begin
  12. if(rst)
  13. pr_state <= well_situated;
  14. else
  15. pr_state <= next_state;
  16. end
  17. always@ (pr_state or high or low) //空调的下一个状态取决于当且状态以及high或low的取值
  18. begin
  19. next_state = 2'bxx;
  20. cold = 1'b0; heat = 1'b0;
  21. case(pr_state) //空调的下一个状态取决于当且状态以及high或low的取值
  22. well_situated: //如果当且状态为well_situated
  23. begin
  24. cold = 1'b0; heat = 1'b0;
  25. if(high == 1'b1)
  26. begin
  27. next_state = too_high;
  28. cold = 1'b1;
  29. heat = 1'b0;
  30. end
  31. if(low == 1'b1)
  32. begin
  33. next_state = too_low;
  34. cold = 1'b0;
  35. heat =1'b1;
  36. end
  37. end
  38. too_high: //如果当且状态为too_high
  39. begin
  40. cold = 1'b1;
  41. heat = 1'b0;
  42. if(high == 1'b1)
  43. begin
  44. next_state = too_high;
  45. cold = 1'b1;
  46. heat = 1'b0;
  47. end
  48. else
  49. begin
  50. next_state = well_situated;
  51. cold = 1'b0;
  52. heat = 1'b0;
  53. end
  54. end
  55. too_low: //如果当前状态为too_low
  56. begin
  57. cold = 1'b0;
  58. heat = 1'b1;
  59. if(low == 1'b1)
  60. begin
  61. next_state = too_low;
  62. cold = 1'b0;
  63. heat = 1'b1;
  64. end
  65. else
  66. begin
  67. next_state = well_situated;
  68. cold = 1'b0;
  69. heat = 1'b0;
  70. end
  71. end
  72. default:
  73. next_state = well_situated;
  74. endcase
  75. end
  76. endmodule

测试文件


  
  1. // 测试文件
  2. `timescale 1ns/1ps
  3. module aircondition_tb;
  4. reg clk, rst;
  5. reg [1:0] pr_state, next_state;
  6. reg high,low;
  7. wire cold,heat;
  8. //时钟
  9. always
  10. begin
  11. #10 clk = ~clk;
  12. end
  13. initial
  14. begin
  15. clk = 1'b0;
  16. rst = 1'b1; //复位信号有效,系统复位,当前状态为well_situated90(00),heat=0,cold=0
  17. #50 high = 1'b1; low = 1'b0; //此时处于复位状态,但high = 1, low = 0;
  18. #10 rst = 1'b0; //复位信号无效
  19. #50 high = 1'b0; low = 1'b0;
  20. #200 high = 1'b1; low = 1'b0;
  21. #200 high = 1'b0; low = 1'b1;
  22. #200 high = 1'b0; low = 1'b1;
  23. end
  24. aircondition u1(.clk(clk), .rst(rst), .high(high), .low(low), .heat(heat), .cold(cold));
  25. endmodule

仿真图

认真分析下这个仿真波形图,会发现符合状态转移结果,设计成功。

ISE综合

RTL Schematic

展开后

Technology Schematic

情绪有点不好,就这样吧,心里有点难受。

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/81390952

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。