【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

学习新语法,争做新青年

计数器实验升级,让8个LED灯每个0.5s的速率循环闪烁,流水灯ahh好久不见~ 去年光这个就把我折磨够呛。。我肉眼可见的脱发就是从那时候开始的。。在那两个月我直接掉了10斤啊喂~ (没节食、没运动、没失恋哈哈哈

  • 产生0.5s周期的计数器

文章目录

  • 【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计
  • 1. version 1 - 移位法
    • 1.1 设计输入
    • 1.2 功能仿真
    • 1.3 板子调试
  • 2. version 2 - 循环移位
  • 3. version 3 - 3-8译码器
  • 4. 参数化设计
    • 添加约束文件

1. version 1 - 移位法

1.1 设计输入

module led_run(
    Clk,
    Reset_n,
    Led
);
    input Clk;
    input Reset_n;
    output reg[7:0]  Led;
    
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(counter == 24999999)
        counter <= 0;
    else
        counter <= counter + 1'b1; 
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 8'b0000_0001;
    else if(counter == 24999999) begin
        if(Led == 8'b1000_0000)
            Led <= 8'b0000_0001;
        else
            Led <= Led << 1;
    end
    else 
        Led <= Led; //当然了,时序逻辑中不加这句话默认保持状态
endmodule

1.2 功能仿真

为了避免仿真跑的时间太长,我们ba0.5s替换为0.05s,所以我们姑且把24999999999替换为24999,也就是500ms→500ums。

`timescale 1ns/1ns

module led_run_tb();
    //激励信号
    reg Clk;
    reg Reset_n;
    wire[7:0] Led;
    
 led_run led_run_inst(  //例化
    //连线
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
);
    initial Clk = 1;
    always #10 Clk = ~Clk; //一个周期20ns
    
    initial begin
        Reset_n = 0;
        #201;
        Reset_n = 1;
        #4000000; //8*500us = 40000000ns
        $stop;
    end
    
endmodule
image-20220920092850196

1.3 板子调试

别忘了把时间调回来啊喂!不然可看不出流水了~

是的,我写完这句话就忘调了。。不愧是我

2. version 2 - 循环移位

改进移位

module led_run1(
    Clk,
    Reset_n,
    Led
);
    input Clk;
    input Reset_n;
    output reg[7:0]  Led;
    
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(counter == 25'd24999999)
    //else if(counter == 25'd24999) 
        counter <= 0;
    else
        counter <= counter + 1'b1; 
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 8'b0000_0001;
    else if(counter == 25'd24999999) 
    //else if(counter == 25'd24999) 
        Led <= {Led[6:0], Led[7]};
    else 
        Led <= Led; //当然了,时序逻辑中不加这句话默认保持状态
endmodule
  • Led <= {Led[6:0], Led[7]};
    • {}:位拼接
    • 循环移位

虽然。。这种写法用的也不多~

那我们来仿真一下,test bench把例化时名称改一下就ok

没问题~~

3. version 3 - 3-8译码器

引入3-8译码器的逻辑

模块中调用模块:把文件拷贝过来 → Add files即可

image-20220921101453857

这里例化模块和test bench中是一模一样的方法~ 我我我悟了!

`timescale 1ns/1ns

module led_flash_tb();
    //激励信号
    reg Clk;
    reg Reset_n;
    wire[7:0] Led;
    
 led_run2 led_run_inst(  //例化
    //连线
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
);
    initial Clk = 1;
    always #10 Clk = ~Clk; //一个周期20ns
    
    initial begin
        Reset_n = 0;
        #201;
        Reset_n = 1;
        #4000000; //8*500ms = 40000000ns
        $stop;
    end
    
endmodule
  • 由于现在Led是由底层模块驱动的,我们在底层已经定义为reg型了,所以顶层要去掉

4. 参数化设计

是的,你看到了,我转头就忘了把时间改回来了~

啊这就相当于C语言中的**#define定义常量**

我们在led_run中添加 ——

    parameter MCNT = 25'd24999;

并在led_run_tb中这样写:

     led_run led_run_inst(  //例化
        //连线
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led)
    );    
    defparam led_run_inst.MCNT = 24999;

或者在led_run_tb中这样来写

    led_run2
    #(
        .MCNT(24999)
    )
	led_run_inst(  //例化
        //连线
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led)
    );

让4个LED灯以不同的频率进行闪烁

0.1s, 0.2s, 0.3s, 0.4s…

image-20220921111113398

led_flash.v

module led_flash (
    //端口
    Clk,
    Reset_n, //复位
    Led
);
    //端口定义
    input Clk;
    input Reset_n;
    output reg Led;
    
    parameter MCNT = 24999999;
    reg[24:0] counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        counter <= 0;
	else if(counter == MCNT) 
        counter <= 0;
    else     
        counter <= counter + 1'd1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        Led <=0;
    else if(counter == MCNT) 
        Led <= !Led;

endmodule

led_run_8_test.v

`timescale 1ns / 1ps

module led_run_8_test(
        //端口
        Clk,
        Reset_n, //复位
        Led
    );
    
     //端口定义
     input Clk;
     input Reset_n;
     output[3:0] Led;    
     
    led_flash led_flash_inst0(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[0])
    );
    defparam led_flash_inst0.MCNT = 2499999;//0.1s
    
     led_flash led_flash_inst1(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[1])
    );
    defparam led_flash_inst1.MCNT = 4999999;//0.2s

    
    led_flash led_flash_inst2(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[2])
    );
    defparam led_flash_inst2.MCNT = 7499999; //0.3s 150ms = 150000000ns/20ns = 7500000

    
     led_flash led_flash_inst3(
        .Clk(Clk),
        .Reset_n(Reset_n), 
        .Led(Led[3])
    );
    defparam led_flash_inst3.MCNT = 9999999; //0.4s 200ms = 200000000/20ns = 10000000

   
endmodule

添加约束文件

右击,手动设置为target

image-20220921112522635

复制之前自动生成的代码,并稍作改动,然后下载到板子上就okk啦~ 就是为了巩固一下参数化设计~~

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

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

相关文章

如何使用HTML5新增的标签来优化SEO?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用HTML5新增的标签来优化SEO&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…

NSSCTF——Web题目2

目录 一、[HNCTF 2022 Week1]2048 二、[HNCTF 2022 Week1]What is Web 三、[LitCTF 2023]1zjs 四、[NCTF 2018]签到题 五、[SWPUCTF 2021 新生赛]gift_F12 一、[HNCTF 2022 Week1]2048 知识点&#xff1a;源代码审计 解题思路&#xff1a; 1、打开控制台&#xff0c;查看…

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…

思乐直播系统短视频直播系统源码 直播短视频平台系统APP源码多功能后台系统

思乐直播系统&#xff0c;集直播、短视频等功能&#xff0c;根据市场趋势开发并推出思乐直播APP&#xff0c;APP功能丰富且可在后台管理系统进行配置&#xff0c;做到按需求来开启功能。APP使用起来方便快捷&#xff0c;随时随地开启直播、分享短视频。 整个系统具备非常完善、…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

【设备树笔记整理6】中断系统中的设备树

1 中断概念的引入与处理流程 1.1 中断处理框图 1.2 中断程序的使用 主函数() while(1) {do_routine_task(); }中断处理函数() {handle_interrupt_task(); }如何调用中断处理函数&#xff1f; 1.3 ARM对异常(中断)的处理过程 &#xff08;1&#xff09;初始化 ① 设置中断…

银河麒麟服务器、centos7服务器mysql离线安装:通过获取临时密码进行登录修改新密码

离线安装脚本 cd /home/zenglg/mysql5.7# 判断mysql是否安装# 下面这种方法必须是rpm安装的判断才有效&#xff0c;不通用# IS_INSTALLED$(rpm -qa |grep mysql)# if [ $? -eq 0 ]# 下面的判断方法是查询版本号&#xff0c;比较通用SQL_VERSIONmysql -V | grep -i -o -P 5.7.4…

[Open-source tool] 可搭配PHP和SQL的表單開源工具_Form tools(1):簡介和建置

Form tools是一套可搭配PHP和SQL的表單開源工具&#xff0c;可讓開發者靈活運用&#xff0c;同時其有數個表單模板和應用模組供挑選&#xff0c;方便且彈性。Form tools已開發超過20年&#xff0c;為不同領域的需求者或開發者提供一個自由和開放的平台&#xff0c;使他們可建構…

【C++】容器适配器stack、queue以及deque容器

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、什么是容器适配器1.1 stack的…

面试题(三)

目录 一.Spring 1.Spring IOC & AOP 2.Spring bean (1) 作用域 (2) Spring 中的 bean ⽣命周期 (3) Spring 框架中⽤到了哪些设计模式 二.Mybatis 1.标签 2.Dao接口 3.返回与映射 4.延迟加载 三.Kafka 四.设计模式 1.IO 设计模式 2.Spring 中的设计模式详解…

银河麒麟服务器、centos7服务器一键卸载mysql脚本

脚本 # 查看mysql相关的rpm包写到rmsql.sh文件中 rpm -aq | grep -i mysql >rmsql.sh # 修改文件为卸载mysql的脚本文件 sed -i -e s/^/yum remove -y / rmsql.sh # 修改文本权限 chmod 777 rmsql.sh # 全盘查找mysql相关文件&#xff0c;写到my.sh脚本中 find / -name mysq…

开源游戏开发:机会与挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

深度学习9:简单理解生成对抗网络原理

目录 生成算法 生成对抗网络&#xff08;GAN&#xff09; “生成”部分 “对抗性”部分 GAN如何运作&#xff1f; 培训GAN的技巧&#xff1f; GAN代码示例 如何改善GAN&#xff1f; 结论 生成算法 您可以将生成算法分组到三个桶中的一个&#xff1a; 鉴于标签&#…

函数指针.

首先看一段代码&#xff1a; #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 输出结果&#xff1a; 输出的是两个地址&#xff0c;这两个地址是 test 函…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

深度学习1.卷积神经网络-CNN

目录 卷积神经网络 – CNN CNN 解决了什么问题&#xff1f; 需要处理的数据量太大 保留图像特征 人类的视觉原理 卷积神经网络-CNN 的基本原理 卷积——提取特征 池化层&#xff08;下采样&#xff09;——数据降维&#xff0c;避免过拟合 全连接层——输出结果 CNN …

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…

小程序input的placeholder不垂直居中的问题解决

input的placeholder不垂直居中&#xff0c;input设置高度后&#xff0c;使用line-height只能使输入的文字垂直居中&#xff0c;但是placeholder不会居中&#xff0c;反而会偏上。 首先placeholder样式自定义 有两种方法&#xff0c;第一种行内样式&#xff1a; <input ty…

​LeetCode解法汇总5-正则表达式匹配​

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一棵…

Redis三种特殊数据类型

Redis三种特殊数据类型 geospatial 地理位置 Redis 地理空间数据类型简介 Redis 地理空间索引允许您存储坐标并搜索它们。 此数据结构可用于查找给定半径或边界框内的邻近点。 基本命令 GEOADD 将位置添加到给定的地理空间索引&#xff08;请注意&#xff0c;使用此命令&a…