模六十计数器(三)

news2024/12/23 6:42:36

文章目录

  • 前言
  • 一、代码模板
  • 二、Verilog程序
    • 1、顶层模块
    • 2、计数模块
    • 3、显示模块
  • 三、Testbench程序
  • 四、仿真波形
  • 五、实测结果
  • 总结


前言

又隔了将近一年,学习明德扬编程规范,重新编写模六十计数器程序,使其符合规范,并采用模板化与模块化编程,使程序思路更加清晰。与之前不同,此次编程在Quartus II 13.0中建立项目,在AX530开发板上下载调试,引脚定义与配置需要视情况更改,项目文件将上传到资源中。


一、代码模板

修改明德扬代码模板

:ab Zhushi /***************注释***************/
:ab Shixu always@(posedge clk or negedge rst_n)begin<Enter>if(!rst_n)begin<Enter>end<Enter>else begin<Enter>end<Enter>end
:ab Zuhe always@(*)begin<Enter>end
:ab Module module module_name(<Enter>clk,<Enter>rst_n,<Enter>//<Enter>dout<Enter>);<Enter><Enter>//参数定义<Enter>parameter  LENGTH = 8;<Enter>//输入输出<Enter>input                clk;<Enter>input                rst_n;<Enter>output     [7:0]     dout;<Enter>reg        [7:0]     dout;<Enter>//中间信号<Enter>reg                  signal;<Enter><Enter><Enter>endmodule
:ab Unit module_name Unit(<Enter>.clk(clk),<Enter>.rst_n(rst_n),<Enter>.dout(dout)<Enter>);
:ab Ztj    /***************四段式状态机***************/<Enter>//状态更新<Enter>always@(posedge clk or negedge rst_n)begin<Enter>if(!rst_n)<Enter>state_c <= IDLE;<Enter>else<Enter>state_c <= state_n;<Enter>end<Enter>//状态转移<Enter>always@(*)begin<Enter>case(state_c)<Enter>IDLE:begin<Enter>if(idle_s1)<Enter>state_n = S1;<Enter>else <Enter>state_n = state_c;<Enter>end<Enter>S1:begin<Enter>if(s1_s2)<Enter>state_n = S2;<Enter>else <Enter>state_n = state_c;<Enter>end<Enter>S2:begin<Enter>if(s2_s3)<Enter>state_n = S3;<Enter>else <Enter>state_n = state_c;<Enter>end<Enter>default:begin<Enter>state_n = IDLE;<Enter>end<Enter>endcase<Enter>end<Enter>//转移条件<Enter>assign idle_s1 = (state_c == IDLE) && ();<Enter>assign s1_s2 = (state_c == S1) && ();<Enter>assign s2_s3 = (state_c == S2) && ();<Enter>//(寄存器输出)<Enter>always@(posedge clk or negedge rst_n)begin<Enter>if(!rst_n)begin<Enter>out1 <= 1'b0;<Enter>end<Enter>else if(state_c == S1)begin<Enter>out1 <= 1'b1;<Enter>end<Enter>else begin<Enter>out1 <= 1'b0;<Enter>end<Enter>end
:ab Jsq    reg [3:0] cnt;<Enter>wire en;<Enter>wire co;<Enter>always@(posedge clk or negedge rst_n)begin<Enter>if(!rst_n)begin<Enter>cnt <= 0;<Enter>end<Enter>else if(en)begin<Enter>if(co)<Enter>cnt <= 0;<Enter>else<Enter>cnt <= cnt + 1;<Enter>end<Enter>end<Enter>assign en = ;       <Enter>assign co = (en) && (cnt ==); 

二、Verilog程序

1、顶层模块

顶层模块尽量减少逻辑描述,只实现子模块之间的连接
计数模块实现间隔为1s的六十进制计数器
显示模块完成数码管的驱动,可作为基本模块使用

/***************模六十计数器顶层模块***************/
module Mo60(
    clk,
    rst_n,
    smg_sig,
    smg_loc
    );

    //输入输出
    input                clk;
    input                rst_n;
    output     [7:0]     smg_sig;
    output     [5:0]     smg_loc;
    wire       [7:0]     smg_sig;
    wire       [5:0]     smg_loc;
    //中间信号
    wire       [7:0]     cnt_val;
    wire       [23:0]    data;

    /***************计数模块***************/
    Count U_count(
        .clk(clk),
        .rst_n(rst_n),
        .cnt_val(cnt_val)
    );
    assign  data = {16'b0, cnt_val};
    /***************显示模块***************/
    Display U_display(
        .clk(clk),
        .rst_n(rst_n),
        .data(data),
        .smg_sig(smg_sig),
        .smg_loc(smg_loc)
    );

endmodule

2、计数模块

计数器模板额外包括了使能与进位信号,对应于加一条件与结束条件,虽然代码量上升,但思路更加清晰且不容易出错
进位信号需要在使能的条件下输出

/***************计数模块***************/
module Count(
    clk,
    rst_n,
    cnt_val
    );

    //参数定义
    parameter  CNT_1S = 26'd49_999_999;
    parameter  CNT_1US = 26'd49;
    //输入输出
    input                clk;
    input                rst_n;
    output     [7:0]     cnt_val;
    wire       [7:0]     cnt_val;
    
    /***************分频计数器***************/
    reg [25:0] cnt_div;
    wire en_div;
    wire co_div;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_div <= 0;
        end
        else if(en_div)begin
            if(co_div)
                cnt_div <= 0;
            else
                cnt_div <= cnt_div + 1;
        end
    end
    assign en_div = 1;       
    assign co_div = (en_div) && (cnt_div == CNT_1S);   
    /***************个位计数器***************/
    reg [3:0] cnt0;
    wire en0;
    wire co0;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt0 <= 0;
        end
        else if(en0)begin
            if(co0)
                cnt0 <= 0;
            else
                cnt0 <= cnt0 + 1;
        end
    end
    assign en0 = co_div;     
    assign co0 = (en0) && (cnt0 == 9);   
    /***************十位计数器***************/
    reg [3:0] cnt1;
    wire en1;
    wire co1;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt1 <= 0;
        end
        else if(en1)begin
            if(co1)
                cnt1 <= 0;
            else
                cnt1 <= cnt1 + 1;
        end
    end
    assign en1 = co0;       
    assign co1 = (en1) && (cnt1 == 5);   
    /***************输出计数***************/
    assign cnt_val = {cnt1, cnt0};

endmodule

3、显示模块

和之前一样,分频、扫描、译码、显示
在一个always中只对一个信号进行赋值

/***************显示模块***************/
module Display(
    clk,
    rst_n,
    data,
    smg_sig,
    smg_loc
    );

    //参数定义
    parameter  CNT_2MS = 17'd99_999;
    parameter  CNT_200NS = 17'd9;
    //输入输出
    input                clk;
    input                rst_n;
    input      [23:0]    data;
    output     [7:0]     smg_sig;
    output     [5:0]     smg_loc;
    reg        [7:0]     smg_sig;
    reg        [5:0]     smg_loc;
    
    /***************分频***************/
    reg [16:0] cnt_div;
    wire en_div;
    wire co_div;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_div <= 0;
        end
        else if(en_div)begin
            if(co_div)
                cnt_div <= 0;
            else
                cnt_div <= cnt_div + 1;
        end
    end
    assign en_div = 1;       
    assign co_div = (en_div) && (cnt_div == CNT_2MS);   
    /***************扫描***************/
    reg [3:0] cnt_scan;
    wire en_scan;
    wire co_scan;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_scan <= 0;
        end
        else if(en_scan)begin
            if(co_scan)
                cnt_scan <= 0;
            else
                cnt_scan <= cnt_scan + 1;
        end
    end
    assign en_scan = co_div;       
    assign co_scan = (en_scan) && (cnt_scan == 5);
    /***************取数***************/
    reg [3:0] smg_data;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            smg_data <= 0;
        end
        else begin
            case(cnt_scan)
                0: smg_data <= data[3:0];
                1: smg_data <= data[7:4];
                2: smg_data <= data[11:8];
                3: smg_data <= data[15:12];
                4: smg_data <= data[19:16];
                5: smg_data <= data[23:20];
            endcase
        end
    end
    /***************显示***************/
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            smg_loc <= 6'b000000;
        end
        else begin
            case(cnt_scan)
                0: smg_loc <= 6'b111110;
                1: smg_loc <= 6'b111101;
                2: smg_loc <= 6'b111011;
                3: smg_loc <= 6'b110111;
                4: smg_loc <= 6'b101111;
                5: smg_loc <= 6'b011111;
            endcase
        end
    end
    /***************译码***************/
    always@(*)begin
        case(smg_data)
            0: smg_sig = 8'b00000011;
		    1: smg_sig = 8'b10011111;
		    2: smg_sig = 8'b00100101;
		    3: smg_sig = 8'b00001101;
		    4: smg_sig = 8'b10011001;
		    5: smg_sig = 8'b01001001;
		    6: smg_sig = 8'b01000001;
		    7: smg_sig = 8'b00011111;
		    8: smg_sig = 8'b00000001;
		    9: smg_sig = 8'b00001001;
		    default: smg_sig = 8'b01100001;//E
        endcase
    end

endmodule

三、Testbench程序

对Quartus生成的模板文件进行修改

`timescale 1 ns/ 1 ns
module Mo60_tb();

reg clk;
reg rst_n;
// wires                                               
wire [5:0]  smg_loc;
wire [7:0]  smg_sig;

// assign statements (if any)                          
Mo60 u1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.rst_n(rst_n),
	.smg_loc(smg_loc),
	.smg_sig(smg_sig)
);
initial begin
    clk = 0;
    rst_n = 1;
end

always begin
    #10 clk = ~clk;
end

initial begin
    #100 rst_n = 0;
    #100 rst_n = 1;
end

endmodule

四、仿真波形

在仿真时,将计数间隔设为CNT_1US,扫描间隔设为CNT_200NS,以加快仿真速度

五、实测结果

与之前不同,AX530开发板上有6个数码管
在这里插入图片描述


总结

使用模板可以提高编程速度,使逻辑更加清晰,特别是解决了计数器逻辑混乱的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿秀去面腾讯了(社招两年面试经验)

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 小伙伴们大家好&#xff0c;我是阿秀。 前段时间说了自己换工作的事&#xff1a;阿秀离职了&#xff0c;虽然最后选择去了外企&#xff0c;但在换工作期间也看了不少机会&#xff0c;基本国内的…

独立开发变现周刊(第89期):一个 AI 小工具,两个月内赚7.3万美元

分享独立开发、产品变现相关内容&#xff0c;每周五发布。 目录 1、privateGPT: 可以和本地文档进行交互的聊天机器人2、chatbutler: 无代码可视化创建聊天机器人3、CommaFeed&#xff1a;可以自托管RSS阅读器开源项目4、roop: 一键深度换脸5、deeplearning: 吴恩达在推特上宣布…

搜索帮助demo:F4IF_INT_TABLE_VALUE_REQUEST 返回多列值

货铺QQ群号&#xff1a;834508274微信群不能扫码进了&#xff0c;可以加我微信SAPliumeng拉进群&#xff0c;申请时请提供您哪个模块顾问&#xff0c;否则是一律不通过的。进群统一修改群名片&#xff0c;例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接&#xff0c;小程…

零基础开发小程序第三课-列表功能开发

最近我新研究了一款无代码开发工具&#xff0c;主打的是一行代码都不写来开发小程序。已经有了两篇文章 利用无代码工具开发一款小程序 公民开发者学习无代码编程&#xff0c;从CRUD开始 前两篇文章已经介绍了如何创建项目&#xff0c;如何建立数据表&#xff0c;以及开发新…

智哪儿×广州光亚展专栏:对话8家AIoT及芯片方案企业,解读其核心竞争优势及成熟项目案例,参展亮点提前看

2023年6月9-12日&#xff0c;第二十八届广州国际照明展览会&#xff08;光亚展&#xff0c;GILE2023&#xff09;将在广州中国进出口商品交易会展馆正式启幕。本届展会以“「光」未来”为主题&#xff0c;将迎来3,318家来自18个国际及地区的参展企业&#xff0c;展示规模将横跨…

【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)

文章目录 顺序结构分支结构CJNE的使用规则 循环结构包含部分分类 常考题型例题1题目描述题解 例题2题目描述题解 例题3题目描述题解 顺序结构 程序默认以顺序结构执行&#xff1b; 分支结构 用CJNE进行分支&#xff1b; CJNE的使用规则 CJNE A, #data rel 若(A) (data)&a…

高完整性系统工程(九):Invariants

目录 1. INVARIANTS 1.1 例子 1.2 正式的证明 1. INVARIANTS 一个不变式需要满足以下三个属性&#xff1a; 当循环开始时&#xff0c;不变式是正确的在每一次循环迭代之后&#xff0c;不变式仍然是正确的当循环条件为假时&#xff0c;不变式能推出循环结束后的条件&#x…

刘知远团队提出:如何通过扩大高质量指导性对话数据集,来提高模型的性能和效率...

深度学习自然语言处理 原创作者 | 刘嘉玲 随着开源语言大模型(LLM)的百花齐放&#xff0c;模型的性能和效率关乎到产品的成本和服务体验的均衡。那么&#xff0c;有没有办法让语言大模型变得更高效、更优秀呢&#xff1f; 为了进一步提高开源模型的上限&#xff0c;清华大学的研…

数据库新闻速递 明白3中主流的数据迁移方法 (译)

头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共8…

Webstorm 支持微信小程序开发插件 Wechat mini program support

支持微信小程序插件安装&#xff1a; Wechat mini program support&#xff0c; 微信小程序语法支持&#xff0c;rpx 单位报错解决。 插件官方文档 Wiki - Gitee.com 安装方法&#xff1a; File-> Settings->Plugins 选择Marketplace: 输入Wechat ,搜索&#xff0c;然…

岭回归有看点:正则化参数解密,显著性不再成问题!

一、概述 「L2正则化&#xff08;也称为岭回归&#xff09;」 是一种用于线性回归模型的正则化方法&#xff0c;它通过在模型的损失函数中添加一个惩罚项来防止过拟合。L2正则化的惩罚项是模型参数的平方和&#xff0c;乘以一个正则化参数λ&#xff0c;即&#xff1a; L2正则化…

初阶二叉树的相关题目

前言&#xff1a; 前面我们介绍了初阶二叉树的相关知识&#xff0c;二叉树常考的还是链式二叉树&#xff0c;而且二叉树也会考很多选择题&#xff0c;本文重点是在给出一些常考的二叉树的性质定理推导和经典练习题目配合强化巩固知识。 目录 一、二叉树的常见性质定理 二、常…

你的业务被AI所取替的风险度有多高?AI社交、克隆人、角色扮演、代理人

hi&#xff0c;大家好&#xff0c;最近我们陆续会推出各种实验性项目&#xff0c;把我们在AIGC和数字体验上的思考进行验证&#xff0c;欢迎持续关注我们的进展。&#xff08;文末领取PDF&#xff09; 目前&#xff0c;已经有不少的例子证明了ChatGPT有多好用了。 亚马逊员工在…

定制比例阀控制放大器

定制比例阀控制放大器是为特定应用场景设计的定制化控制系统。它可以根据客户的需求和应用要求&#xff0c;配置输入输出及颤振频率等参数&#xff0c;对现有的控制器进行修改和优化&#xff0c;以满足特定的性能指标和功能要求。随着工业自动化技术的不断发展&#xff0c;定制…

关于安卓viewpager实现堆叠卡片交互

背景 长江后浪推前浪&#xff0c;无聊的需求一浪接一浪。 最近做到一个关于卡片堆叠的需求&#xff0c;觉得挺有意思&#xff0c;所以特此记录一下。 文末将附上源码链接 首先看设计图&#xff1a; 可以看到&#xff0c;是一个卡片堆叠的效果&#xff0c;关于这种UI的实现&…

Android系统安全技术---FBE密钥框架和技术详解

一、前言 用户数据加密是移动设备的重要功能&#xff0c;是使用对称加密算法对Android设备上的所有用户数据进行编码的过程&#xff0c;防止用户数据被未经授权的用户或应用程序访问。 本文是Android系统安全技术系列第二篇&#xff0c;主要介绍基于文件的加密技术。首先介绍An…

到底什么是“云手机”?

今天这篇文章&#xff0c;我们来聊一个很有趣的东东——云手机。 说到云手机&#xff0c;有些童鞋可能并不会觉得陌生。是的&#xff0c;它确实并不是一个新名词。早在2011年左右&#xff0c;国内就有厂商推出了云手机的概念。掐指一算&#xff0c;至今已经有12个年头了。 大家…

APP在应用市场内该如何做推广

苹果应用商城的自然流量都是通过精品推荐&#xff0c;畅销排行榜和搜索来获取的&#xff0c;此外&#xff0c;应用名称、副标题、应用截图视频、应用描述、用户评论、下载量、用户留存率还有曝光量&#xff0c;这些都是影响ASO优化的关键因素。 为了防止一些应用堆砌热词&…

传统设备充电接口如何升级成USB-C PD快充接口?

早在 2009 年开始&#xff0c;欧盟就致力于推动消费电子产品充电接口的统一进程&#xff0c;减少资源浪费推动绿色环保进程&#xff0c;同时充电配件通用化也为消费者带来更好的充电体验。2022 年 10 月 4 日&#xff0c;欧洲议会全体会议上表决通过&#xff0c;在 2024 年底之…

C++服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase结构

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发7——日志系统LogFormatter_2 C服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase…