Verilog语言“加减可控任意进制计数器”及“占空比50%的任意整数分频器”设计

2023-05-16

Verilog语言“加减可控任意进制计数器”及“占空比50%的任意整数分频器”设计

今天(2017年12月28)考EDA实验,考的真是惊险刺激,最后实现了四分之三的功能。
今天的使用时设计一个可以实现使用指定拨码开关控制加减计数、使能、清零的13进制计数器,并且是由两位数码管显示结果,在加法计数器中,加法加到最大值12时需要点亮一盏LED,加法计数器中减到最小值0时也需要点亮一盏LED。下面是我的程序:

  counter13.v文件:
  /*
CLK位时钟输入,CLR为1异步清零,A_S_CTRL为加减控制端
*/
module counter12 (CLK, CLR,EN,A_S_CTRL,SHOW1,SHOW2,LED1,LED2);
    input CLK,EN,CLR,A_S_CTRL;//时钟,使能,清零,加减控制
    output LED1,LED2;//最大值进位,最小值借位,用来满足题目对LED点亮的要求
    wire[3:0] DISP1,DISP2;//中间变量,数码管要显示的数字
    output[6:0] SHOW1,SHOW2;//输出变量,数码管的段码
    reg[3:0] DOUT;//计数器计数输出,此处不需要输出,仅作为中间变量
    reg LED1,LED2;
    assign DISP1 = (DOUT < 10) ? DOUT : (DOUT - 10);//小于10则,直接显示,大于10则减去10,只显示个位
    assign DISP2 = (DOUT >= 10) ? 1 : 0;//大于等于10,则十位为1,否则十位为0
    always@(posedge CLK or negedge CLR)
        begin
            if(!CLR)//asynchronous reset,low level actve
                DOUT = 0;
            else if(EN)//synchronous enable,high level actve
                begin
                    if(A_S_CTRL == 1 & DOUT == 12)
                        begin
                        DOUT = 0;
                        LED1 = 1;
                        end
                    else if(A_S_CTRL == 0 & DOUT == 0)
                        begin
                        DOUT = 12;
                        LED2 = 1;
                        end
                    else if(A_S_CTRL == 1)// up counter加法计数
                        begin
                        DOUT = DOUT + 1;
                        LED1 = 0;
                        end
                    else if(A_S_CTRL == 0)// down counter接法计数
                        begin
                        DOUT = DOUT - 1;
                        LED2 = 0;
                        end
                end
        end
    display U1(.datain(DISP1),.sm_db(SHOW1));//例化语句调用显示模块
    display U2(.datain(DISP2),.sm_db(SHOW2));
endmodule
display.v文件:
/*显示0到9的数字,数码管译码器*/
module display(datain,sm_db);
    input[3:0] datain;
    output[6:0]sm_db;
    reg[6:0]sm_db;
    always@(datain)
        begin
            case(datain)
                4'h0:sm_db <= 7'b0111111;
                4'h1:sm_db <= 7'b0000110;
                4'h2:sm_db <= 7'b1011011;
                4'h3:sm_db <= 7'b1001111;
                4'h4:sm_db <= 7'b1100110;
                4'h5:sm_db <= 7'b1101101;
                4'h6:sm_db <= 7'b1111101;
                4'h7:sm_db <= 7'b0000111;
                4'h8:sm_db <= 7'b1111111;
                4'h9:sm_db <= 7'b1101111;
                4'ha:sm_db <= 7'b1110111;
                4'hb:sm_db <= 7'b1111100;
                4'hc:sm_db <= 7'b0111001;
                4'hd:sm_db <= 7'b1011110;
                4'he:sm_db <= 7'b1111001;
                4'hf:sm_db <= 7'b1110001;
                default:;
            endcase
        end
endmodule 

以上程序实现了这个功能。
以上程序是由一个加减可控的可预置的十进制计数器修改而成的,通过修改几个参数,既可以构成任意进制的计数器:

counter10.h文件:
module counter10 (DIN,CLK, CLR,EN,LOAD,A_S_CTRL,COUT,DOUT);
    input [3:0] DIN;
    input CLK,EN,CLR,LOAD,A_S_CTRL;
    output[3:0] DOUT;
    output COUT;
    reg[3:0] DOUT;
    reg COUT;

    always@(posedge CLK or negedge CLR or negedge LOAD)
        begin
            if(!CLR)//asynchronous reset,low level actve
                DOUT = 0;
            else if(!LOAD)//asynchronous load,low level actve
                DOUT = DIN;
            else if(EN)//synchronous enable,high level actve
                begin
                    if(A_S_CTRL == 1 & DOUT ==9)
                        begin
                        COUT = 1;
                        DOUT = 0;
                        end
                    else if(A_S_CTRL == 0 & DOUT ==0)
                        begin
                        COUT = 1;
                        DOUT = 9;
                        end
                    else if(A_S_CTRL == 1)// up counter
                        begin
                        COUT = 0;
                        DOUT = DOUT + 1;
                        end
                    else if(A_S_CTRL == 0)// down counter
                        begin
                        COUT = 0;
                        DOUT = DOUT - 1;
                        end
                end
        end
endmodule

以下是我修改的一个6进制计数器,可以对比看一下,只修改了很少的东西:

module counter6 (DIN, CLK, CLR, EN, LOAD, A_S_CTRL, COUT, DOUT);
    input [3:0] DIN;
    input CLK,EN,CLR,LOAD,A_S_CTRL;
    output[3:0] DOUT;
    output COUT;
    reg[3:0] DOUT;
    reg COUT;

    always@(posedge CLK or negedge CLR or negedge LOAD)
        begin
            if(!CLR)//asynchronous reset,low level actve
                DOUT = 0;
            else if(!LOAD)//asynchronous load,low level actve
                DOUT = DIN;
            else if(EN)//synchronous enable,high level actve
                begin
                    if(A_S_CTRL == 1 & DOUT == 5)
                        begin
                        COUT = 1;
                        DOUT = 0;
                        end
                    else if(A_S_CTRL == 0 & DOUT == 0)
                        begin
                        COUT = 1;
                        DOUT = 5;
                        end
                    else if(A_S_CTRL == 1)// up counter
                        begin
                        COUT = 0;
                        DOUT = DOUT + 1;
                        end
                    else if(A_S_CTRL == 0)// down counter
                        begin
                        COUT = 0;
                        DOUT = DOUT - 1;
                        end
                end
        end
endmodule

接下来设占空比为百分之50的任意整数分频器:
顶层文件:

module FrqDivder (fin,fout,m);//分频输入,偶分频输出,奇分频输出,分频系数
input fin;
output fout;
input[3:0] m;
wire foute,fouto;
EvenFrqDiv U1(.fin(fin),.fout(foute),.m(m));
OddFrqDiv U2(.fin(fin),.fout(fouto),.m(m));
mux21(.fin1(fouto), .fin2(foute), .ctrl(m), .fout(fout));

endmodule

偶数分频器:

EvenFrqDiv.v文件:
module EvenFrqDiv (fin,fout,m);//输入,输出,分频系数
input fin;
input[3:0] m;
wire[3:0] n;
assign n = m/2;
output fout;
reg fout;
reg [3:0] q1;
always @ (posedge fin)
    begin
      q1=q1+1;
      if(q1 >= n)
        begin
           q1=0;
           fout=~fout;
        end
    end
endmodule

奇数分频器:

module OddFrqDiv (fin,fout,m);//输入,输出,分频系数
input fin;
input[3:0] m;
wire[3:0] n;
output fout;
reg fout1,fout2;
reg [3:0] q1,q2;
assign n = (m+1) >> 1;
always @ (posedge fin)
    begin
      q1=q1+1;
      if(q1 == n)
      begin
          fout1=~fout1;
      end
      else if(q1 == m)
      begin
           q1=0;
           fout1=~fout1;
      end
    end 
always @ (negedge fin)
    begin
      q2=q2+1;
      if(q2 == n)
      begin
          fout2=~fout2;
      end
      else if(q2 == m)
      begin
           q2=0;
           fout2=~fout2;
      end
    end 
assign fout = fout1 | fout2;
endmodule

二选一多路选择器:

module mux21(fin1,fin2,ctrl,fout);
    input fin1,fin2;
    input [3:0] ctrl;
    output fout;
    assign fout = ctrl[0] ? fin1 : fin2;
endmodule

RTL图:
本工程是在QUARTUS ii9.0上得到的结果
工程结构图:
这里写图片描述

今天(2017年12月28)考EDA实验,考的真是惊险刺激,最后实现了四分之三的功能。
这个过程中我做的很认真,自认为设计思路也是很好,但刚开始的方案不可行,后来改了一种方案,编译没有错。然后一步步的修改完善,把所有的功能一步一步往上加,把多余的功能一定一定删掉,使得整个程序简洁直观。最后的仿真很完美,然后准备下载。可是正当下载进去准备见证奇迹的时候,却发现毫无反应。时间已经到达最后关头,我还心里提醒自己:镇静,冷静找一下错误,仿真那么完美,不可能有错的,可能只是一个小错误。找了一会儿,还是没找出来,哎,先写报告吧,等老师验收的时候问一下老师吧。好来老师到了,我把情况说明了,老师也没马上找出原因。我说老师,我申请换一台实验箱,老师说那你换一下吧,可是换了实验箱仍然没有什么用。哎,为什么,老师突然说,你是不是绑定完引脚没有重新编译啊。我突然想起,是啊,平常在电脑上一直使用仿真,从来没有下载进去,好久没下载了,都忘记了绑定引脚要编译,唉,该死。重新编译下载进去后终于好了,数码管亮了,然后我略有慌乱的拨弄了控制开关,终于后面三个功能都实现了。
还剩第一个分频器,那个题目其实感觉很简单,因为我之前花了不少时间研究分频器,只是没实现那么高频率的分频。思路很清晰,20MHZ分频成1Hz,使用一个25位的计数器,2的25次方等于(33,554,432),计数到10乘以10的6次翻转一次电平就可以了,然后达到20兆分频了。我说老师,那个分频器窝可以在做一下吗,我改两个参数应该就可以了。老师说不行,没时间了。那好吧,老师对我也算仁至义尽了。于是我就坐在倒数第二排把没写完的报告写完。
过后的那种感觉真的很奇妙,就是有些事情你真的用心去做 了,努力了,你会真的很在乎它,你绝对不会吧失败看的风轻云淡,至少要有一些成果。遗憾也常常是有的,就是那种差一点就成功了,却不能够成功。但最终事后还是开心的,因为你问心无愧。真的努力过,结果一般都会有一些,可能只是没有达到期望的而已。
这让我想起了今年夏天的电赛,我的队长,他真的是很在乎这个比赛,他说他想去西安,参加国赛。他说这话的时候,很认真,他的话让我心里有些不安,因为我知道,我撑不起他的梦想,我太菜了。电赛期间,他经常通宵到半夜两三点,当然通宵也算他的一种习惯吧。后来实现了前面三项功能。在省赛区验收的时候,由于我们的电路板的工艺的问题,调试时实现的功能,有的没实现,而且偏差很大。队长很紧张,我可以看出来,他一直在咽口水,调试的手也在发抖。最终被封箱了,留作下一步评审,后来得了个省级二等奖。队长很不甘心,他说心里真不是滋味。但对于我这种菜鸡来说,已经挺不错的了。事后队长说,他调试那时候,紧张到肚子疼。现在我觉得我可以理解这种感觉了。唉,无奈,有时我也替队长惋惜,他选队友怎么会选我这种菜鸡,我真的是拖队长的后腿了。但是通过暑假电赛,说真的,我学到了很多,收获了很多,还认识了不少人,还沾队长和另一位队友的光得了个小奖(可是这也是我目前科技方面大学得的最高奖了,由此知道我有多菜了吧)。大家有没有发现我老是一口一个队长队长的,我的队长并不是有多突出,技术不是说有多厉害,是因为我感谢他,心里面敬重他,他可以说是我动手实践入门的“导师”。通过这次暑假电赛,我觉的我和队长也结下了不解的友缘,我觉的我的队长很真诚,乐于助人,不虚伪,没有那种很多人有的自以为是的盲目傲慢,我们也很熟了,我觉得队长真的算我大学里的一个朋友了。在此写了这么多,也表示对队长的感谢。
突然肚子咕噜一响,好像还没吃晚饭呢,哇,已经11点多了,该休息了。约到后面越写的不详细,改天在更吧,希望对大家有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog语言“加减可控任意进制计数器”及“占空比50%的任意整数分频器”设计 的相关文章

  • linux修改系统时间

    一 查看和修改Linux的时区1 查看当前时区 命令 xff1a 34 date R 34 1 修改设置Linux服务器时区方法 A 命令 xff1a 34 tzselect 34 依据引导进行选择 二 查看和修改Linux的时间1 查看时
  • Win2012系统忘记密码,修改密码。

    请准备一张相应操作系统版本的光盘 Server2012R2安装光盘ISO 步骤 1在虚拟机的光盘中选择Server2012R2的ISO 并确定 如果是物理机 直接把ISO刻录成光盘 放入光驱即可 2重启服务器 修改启动项从CD ROM启动
  • 防火墙firewall-cmd

    防火墙firewall cmd 一 centos7查看防火墙所有信息 firewall cmd list all 二 centos7查看防火墙开放的端口信息 firewall cmd list ports 三 开放 删除端口号 3 1 开放
  • docker与firewalld冲突解决

    firewall的底层是使用iptables进行数据过滤 xff0c 建立在iptables之上 xff0c 而docker使用iptables来进行网络隔离和管理 xff0c 这可能会与 Docker 产生冲突 当 firewalld 启
  • gradle和gradle wrapper

    wrapper保证了团队中每一个开发者都使用同样版本的Gradle并能使用Gradle进行项目构建 1 Gradle Wrapper 是什么 Gradle Wrapper 由几个文件组成 xff0c 这些文件在你的项目目录中 l gradl
  • ApplicationContextAware及InitializingBean及bean注入执行顺序

    1 spring先检查注解注入的 bean xff0c 并将它们实例化 2 然后 spring初始化 bean 的顺序是按照 xml 中配置的顺序依次执行构造 3 如果某个类实现了 ApplicationContextAware接口 xff
  • git 报错: http request failed

    解决方案 xff1a 卸载Centos自带的git1 7 1 xff0c 安装版本git2 2 1 1 查看当前git版本 git version git version 1 7 1 2 卸载git1 7 1 yum remove git
  • 关于sh时命令不识别无法正常执行.sh文件

    为什么不能执行呢 xff0c 因为我们的命令很多时候是以bash的规范的 xff0c 所以如果shell不是bash类型 xff0c 很容易出现命令不识别这类问题 先检查shell类型 echo SHELL 这是正常的 xff0c 是bas
  • Powershell美化(oh-my-posh)

    效果展示 xff1a 1 通过cmd下载oh my posh或者直接微软商店搜索下载 winget install oh my posh 2 打开powershell 7或者powershell xff08 推荐以下载的最高版本为主 xff
  • O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

    虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能 xff0c 但是随着使用时间从增长 xff0c 数据表存放的数据量也会急剧增长 此时 xff0c 仍然需要有合适的方案来解决数据量产生的系统性能瓶颈 本
  • POI Excel导出样式设置

    HSSFSheet sheet 61 workbook createSheet 34 sheetName 34 创建sheet sheet setVerticallyCenter true 下面样式可作为导出左右分栏的表格模板 sheet
  • SQL强化:将相同的或连续的时间段合并

    问题描述 xff1a 有一张签到表 xff0c 需要将连续或相同的时间段合并 xff0c 即把多条记录查询合并成一条连续的时间段记录 数据表如下 xff1a DROP TABLE IF EXISTS 96 timesheets 96 CRE
  • Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

    最近做数据处理时候 xff0c 遇到一个问题 用一个id自增主键时候 xff0c 数据表中会插入大量重复数据 xff08 除ID不同 xff09 这虽然对最终数据处理结果没有影响 xff0c 但是有1个问题 xff0c 如果数据量超大 xf
  • 2014年秋找工作经历

    博主学渣一枚 xff0c 读研期间做过几个不上档次的管理系统 xff0c 学历不太好 xff0c 基础知识不太牢固 xff0c 所以校招找工作难免辛酸 记下这个过程 xff0c 以便日后回顾来时的路 9月 xff0c 酱油了 xff0c 只
  • 服务器端获取webservice客户端IP地址

    一 基于xfire发布的webservice获取客户端ip的方法 public String getClientIp String ip 61 34 34 try HttpServletRequest request 61 XFireSer
  • @Autowired,@Qualifier @Required @Resource @Component,@Service,@Controller,@Repository @PostConstruct

    1 64 Autowired 注解 xff1a 首先在使用时候需要引入配置 xff1a lt 该 BeanPostProcessor 将自动起作用 xff0c 对标注 64 Autowired 的 Bean 进行自动注入 gt lt bea
  • HTML中select标签单选多选详解

    select 元素可创建单选或多选菜单 当提交表单时 xff0c 浏览器会提交选定的项目 xff0c 或者收集用逗号分隔的多个选项 xff0c 将其合成一个单独的参数列表 xff0c 并且在将 lt select gt 表单数据提交给服务器
  • Tomcat正常启动,访问所有页面均报404异常,404异常总结

    今天遇到一个问题 xff1a Tomcat正常启动 xff0c 访问所有页面均报404异常 404异常 xff0c 很常见 xff0c 大多情况是路径错误 web xml文件映射路径写错 服务器设置 servlet的jar包未导进去或者没有
  • oracle中游标详细用法

    游标的概念 游标是SQL的一个内存工作区 xff0c 由系统或用户以变量的形式定义 游标的作用就是用于临时存储从数据库中提取的数据块 在某些情况下 xff0c 需要把数据从存放在磁盘的表中调到计算机内存中进行处理 xff0c 最后将处理结果
  • ckeditor 缺少图像源文件地址

    ckeditor 上传服务器 回显示js代码 javaweb整合ckeditor做上传图片的功能 xff0c 图片上传到tomcat服务器成功了 xff0c 但是没有跳转到到预览框里去 xff0c 却在原先的页面显示出这段js代码 xff1

随机推荐