Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code),发明于1837年(另有一说是1836年),通过不同的排列顺序来表达不同的英文字母、数字和标点符号,在这里作一简单处理,仅产生点(Dit)和划(Dah),时长在0.25秒之内为点,超过为划,用按键控制时间模拟实现,5个点或划表示一个数字(0-9),通过数码管显示按键发声频率1350Hz。

//莫尔斯代码发生器
module morse(rst_n,clk,key,seg,dg,beep);
input clk,rst_n,key;//clk50M,rst_n低电平有效,key按下为0
output reg beep; //蜂鸣器
output reg[7:0]  seg;//段码
output reg[5:0]  dg;//位码
reg [10:0] ct; //1350Hz分频计数
reg [3:0] cnt,kcnt; //50Hz分频计数,按键计数
reg clk50hz,clk1k; //分频得到的时钟
reg [3:0] num,number; //要显示的数,点划编码数
reg [2:0] i=0;  //要显示的点划序号
reg [9:0] dh=10'b0000000000;  //点划输入,点为10,划为11,不按为00
wire clk5;  //PLL输出的5.4M
reg [2:0] state; //按键状态
localparam S0 = 0; //初始状态
localparam S1 = 1;  //按键按下0-0.25S
localparam S2 = 2; //按键在0.25S内释放
localparam S3 = 3; //按键按下超过0.25S
localparam S4 = 4; //按键在0.25S后释放

clk5m4 PLLA(   //PLL产生5.4M时钟
  .refclk(clk) ,
  .reset(~rst_n),
  .clk0_out(),
  .clk1_out(clk5) 
);

always @ (posedge clk5 or negedge rst_n)  //分频成约1350Hz
 if (!rst_n) 
     ct<=0;
   else if (ct>=2000-1)   //5.4M->1350Hz    
       begin clk1k<=~clk1k; ct<=0; end 
      else ct<=ct+1;

always @ (posedge clk1k or negedge rst_n)  //分频成约52Hz
 if (!rst_n) 
     cnt<=0;
   else if (cnt>=13-1)   //1k->50      
       begin clk50hz<=~clk50hz; cnt<=0; end 
    else cnt<=cnt+1;
    
always @ (posedge clk50hz or negedge rst_n)  //按键检测并计数
  if (!rst_n) begin  state<=S0; kcnt<=0; dh<=10'b0000000000; i<=0; end  //初始状态S0
    else case(state)
      S0:begin if (key) begin  state<=S0; kcnt<=0; end
             else begin i<=(i>=5)?1:i+1; state<=S1; end
         end
      S1:begin 
          if (key) begin  state<=S2; kcnt<=0; end  //短按(0.25S内)按键,S1状态
          else if (kcnt<=13) begin  state<=S1; kcnt<=kcnt+1; end
          else state<=S3; 
        end
      S2: if (key) begin {dh[11-2*i],dh[10-2*i]}<=2'b10; state<=S2; kcnt<=0; end //短按并释放,S2状态
              else begin 
                   state<=S1;
                   if (i>=5)
                    begin 
                     i<=1; dh<=10'b0000000000;
                    end
                   else
                     i<=i+1;
                  end 
      S3:state<=(!key)?S3:S4;                      //长按(>0.25S),S3状态
      S4:
      if (key) begin {dh[11-2*i],dh[10-2*i]}<=2'b11; state<=S4; kcnt<=0; end //长按释放,S4状态
              else  begin 
                   state<=S1;
                   if (i>=5)
                    begin 
                     i<=1; dh<=10'b0000000000;
                    end
                   else
                     i<=i+1;
                  end  
       default:;
   endcase
   
always@(state)   //发声
  case(state)
    S1,S3:beep=clk1k;
    default:beep=0;
  endcase

always@(posedge clk1k or  negedge rst_n) //数码管扫描显示(右5位为点划),最左为点划编码数字
  if (!rst_n) 
    dg<=6'b111111; 
    else case (dg)
       6'b111110:begin num=dh[3:2]+10;  dg<=6'b111101;end
       6'b111101:begin num=dh[5:4]+10;  dg<=6'b111011;end
       6'b111011:begin num=dh[7:6]+10;  dg<=6'b110111;end
       6'b110111:begin num=dh[9:8]+10;  dg<=6'b101111;end
       6'b101111:begin num=number;      dg<=6'b011111;end
       default:begin num=dh[1:0]+10;dg<=6'b111110;end
    endcase 
  
always@(dh)
  case({dh[9:8],dh[7:6],dh[5:4],dh[3:2],dh[1:0]})
   10'b1011111111:number<=1;
   10'b1010111111:number<=2;
   10'b1010101111:number<=3;
   10'b1010101011:number<=4;
   10'b1010101010:number<=5;
   10'b1110101010:number<=6;
   10'b1111101010:number<=7;
   10'b1111111010:number<=8;
   10'b1111111110:number<=9;
   10'b1111111111:number<=0;
   default:if (dh[1:0]==2'b00) number<=14;  //等待输入标示
            else number<=11;  //出错标示
  endcase
 
always @(num)   //数码管译码,共阳极,0点亮,段码顺序:DP,G-A
  case(num)
        0:seg<=8'b11000000;
        1:seg<=8'b11111001;
      	2:seg<=8'b10100100;
		3:seg<=8'b10110000;
    	4:seg<=8'b10011001;
		5:seg<=8'b10010010;
		6:seg<=8'b10000010;
		7:seg<=8'b11111000;
		8:seg<=8'b10000000;
        9:seg<=8'b10010000;
        11:seg<=8'b10000110;//出错标示
        12:seg<=8'b01111111; //点标示
        13:seg<=8'b11110111;//划标示
        14:seg<=8'b10110110; //等待输入标示
		default:seg<=8'b11111111; //全暗不亮
   endcase
    
endmodule

运行时,将首先在左侧数码管显示“三”,表示等待输入,随着按键通过控制时间长短输入点和划,并同步显示在数码管上,键入5次后,译码输出数字,若出错,将显示出错符号“E”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【输出1到N之间的偶数】

【输出1到N之间的偶数】 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 请写程序实现输出1-N之间的所有偶数。 输入 输入一个整数N 输出 如果N<1输出error&#xff0c;否则&#xff0c;输出1-N之间…

Mac上的免费压缩软件-FastZip使用体验实测

FastZip是Mac上的一款免费的压缩软件&#xff0c;分享一下我在日常使用中的体验 压缩格式支持7Z、Zip&#xff0c;解压支持7Z、ZIP、RAR、TAR、GZIP、BZIP2、XZ、LZIP、ACE、ISO、CAB、PAX、JAR、AR、CPIO等所有常见格式的解压 体验使用下来能满足我所有的压缩与解压的需求&a…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一&#xff1a;搭建弹性云服务器&#xff08;ECS&#xff09;并部署Web应用案例二&#xff1a;构建基于OBS的图片存储和分发系统案例三&#xff1a;基于RDS的高可用数据库应用案例四&#xff1a;使用华为云DDoS防护保…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

实现GUI界面中的logo图片的编码与隐藏

实现GUI界面中的logo图片的编码与隐藏 一、问题描述二、解决办法 一、问题描述 利用PyQt5编写的GUI界面&#xff0c;有时候需要我们添加自定义的图片来作为UI界面的logo&#xff0c;在源码使用时&#xff0c;logo的形式一般不影响使用&#xff0c;但是当我们需要将软件进行打包…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台&#xff0c;通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力&#xff0c;为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验&#xff0c;今天笔者与您深入探讨 zCloud 在数据库…

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

AI虚拟主播中的订单处理模块开发探索‌!

‌AI虚拟主播作为新兴的数字媒体形式&#xff0c;正在逐步改变着内容创作与传播的格局&#xff0c;它们不仅能够提供24小时不间断的直播服务&#xff0c;还能通过智能算法实现与观众的实时互动&#xff0c;极大地丰富了用户体验。 而在AI虚拟主播的背后&#xff0c;一个高效、…

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下&#xff0…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 &#xff1a; 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

放大器稳定性分析

1 稳定性的时域体现 下图的放大器构成的跟随电路且反向输入端有一个电容&#xff0c;电路工作过程如下&#xff1a;输入Vin从0开始增大&#xff0c;Vout也开始上升&#xff0c;Vout通过R给C充电&#xff0c;Vfb点电压随着电容的充电增加&#xff0c;Vfb就相对与Vout存在时延&a…

学习记录:基于Z-Stack 3.0.1的Zigbee智能插座实现

引言 本文记录了笔者基于Z-Stack 3.0.1协议栈&#xff0c;通过学习Zigbee通信协议&#xff0c;实现一个简单的智能插座控制过程。通过这个过程&#xff0c;笔者对Zigbee网络的形成、设备间的通信以及低功耗设计有了更深入的理解。 工程代码链接&#xff1a;链接&#xff1a;h…

Python Matplotlib 如何处理大数据集的绘制,提高绘图效率

Python Matplotlib 如何处理大数据集的绘制&#xff0c;提高绘图效率 在数据分析和可视化的过程中&#xff0c;处理大数据集常常是我们面临的挑战。绘制大数据集不仅需要时间和计算资源&#xff0c;还可能导致图形显示不流畅&#xff0c;甚至崩溃。Matplotlib 是 Python 中一个…

2016-2020年全国保护性耕作/常规耕作农田分类数据集

2016-2020年全国保护性耕作/常规耕作农田分类数据集 数据介绍 基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据…

VMware系统镜像推荐网站

今天准备找一个Mac系统的镜像&#xff0c;在网上搜大部分都是广告&#xff0c;有的还做的很隐蔽&#xff0c;不点进去都无法确定&#xff0c;非常麻烦&#xff0c;不如多花点时间自己整理一个使用的网站。 如果有更优推荐&#xff0c;请在评论中说明&#xff0c;我会及时更新并…

国标GB28181-2022平台EasyGBS国标GB28181软件:GB/T28181-2022解读、应用和技术实现

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中&#xff0c;国标GB28181-2022平台EasyGBS作为一款基于GB28181标准的视频监控集成与管理平台&#xff0c;凭借其卓越的性能、高度的灵活性和用户友好的设计&#…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中&#xff0c;ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案&#xff0c;赢得了全球用户的青睐。随着 8.2 版本的发布&#xff0c;ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF&#xff1a;团队合…

什么是人工智能学习框架?——人工智能技术科普指南

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;AI应用已经广泛覆盖到我们的日常生活中&#xff1a;从智能推荐系统到语音助手&#xff0c;再到自动驾驶技术。然而&#xff0c;很多人并不清楚人工智能模型是如何构建的。要理解这一点&#xff0c;首先得了解人工…