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

news2024/11/20 15:39:05

【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啦~ 就是为了巩固一下参数化设计~~

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

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

相关文章

Linux学习记录——이십유 多线程(3)

文章目录 1、生产者消费者模型1、基于BlockingQueue的生产者消费者模型2、对模型全面的认识3、多生产者多消费者 2、信号量1、POSIX信号量2、基于环形队列的生产消费模型3、多生产者多消费者 3、多生产者多消费者模型的意义 1、生产者消费者模型 顾名思义&#xff0c;就像是供…

sed编辑器在windows平台上的使用

一、写在前面 我们经常在linux上使用sed命令去替换文件里面固定字符串&#xff0c;但是有时候我们使用的windows系统&#xff0c;文件太大又不方便传到linux上去操作&#xff0c;反复上去和下载浪费空间&#xff0c;又浪费传输的带宽。所以在windows上我们也必须要有sed工具&a…

Node.js 的 Buffer 是什么?一站式了解指南

在 Node.js 中&#xff0c;Buffer 是一种用于处理二进制数据的机制。它允许你在不经过 JavaScript 垃圾回收机制的情况下直接操作原始内存&#xff0c;从而更高效地处理数据&#xff0c;特别是在处理网络流、文件系统操作和其他与 I/O 相关的任务时。Buffer 是一个全局对象&…

为DOSBOX创建互联网能力

DOSBOX能运行DOS游戏及MASM&#xff0c; C等开发语言&#xff0c;要让它联接互联网还是要一些特殊配置的。 1. 安装npcap软件 下载最新版免费软件npcap.exe&#xff0c;正常安装。它会自己绑定到每一张网卡&#xff0c;建立网卡数据与DOSBOX的交互通道。 2. 查看系统中的网卡…

基于流计算 Oceanus(Flink) CDC 做好数据集成场景

由于第一次做实时&#xff0c;所以踩坑比较多&#xff0c;见谅(测试环境用的flink),小公司没有用到hadoop组件 一、踩坑记录 1:本地代码的flink版本是flink1.15.4&#xff0c;生产环境是flink1.16.1&#xff0c;在使用侧输出流时报错&#xff0c;需要使用以下写法,需要使用Si…

SpingMVC拦截器-异常处理的思路,用户体验不好的地方

1、异常处理机制 1.1 原先我们的异常都是手动的try..catch() 2、他存在着一些缺陷&#xff1a;这里创建了一个Demo的controller,内部有一个show方法&#xff1a; 3、访问内部&#xff0c;我要实现demoshow方法&#xff0c;我们来调用show1和show2的方法&#xff1a; 4、有一…

【HAproxy】

目录 一、概述 1.简介 2.核心功能 3.关键特性 4.应用场景 二、使用步骤 1.内核配置 3.建立配置文件 4.添加为系统服务 5.添加3和5运行级别下自启动 6.启动haproxy 三、调度算法 四、配置文件 五、负载均衡 1.七层负载 1.1 配置负载 1.2 配置监控页面 2.四层负…

丰田中国vs中国丰田:一次历史性的战略探讨

比亚迪、长城、奇瑞等中国汽车品牌表现优异&#xff0c;让原本处于领先地位的日系、美系、德系等合资品牌面临压力&#xff0c;市场份额遭受前所未有的全新挑战。 东风雷诺、广汽菲克、广汽讴歌等逐渐退出中国市场&#xff0c;丰田也面临销售下滑。在中国汽车市场全新竞争格局下…

浅谈容器网络

1.什么是容器网络 容器网络是一种新兴的应用程序沙箱机制&#xff0c;用于家庭桌面和网络规模的 企业网络 解决方案&#xff0c;其概念与虚拟机类似。容器内部与主机和所有其他容器隔离的是一个功能齐全的 Linux 环境&#xff0c;具有自己的用户、文件系统、进程和网络堆栈。容…

跨部门协作如何实现高效无障碍?强推这6个协同办公工具!

在现代职场中&#xff0c;跨部门协作变得越来越常见。不同部门之间的协作能力直接影响到工作效率和协同成果。因此&#xff0c;寻找一款能够有效促进跨部门协作的工具是非常重要的。下面向大家推荐6款可以跨部门协作的工具&#xff0c;并从不同的职场场景进行介绍。 1、飞项 …

P1065 [NOIP2006 提高组] 作业调度方案

题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件&#xff0c;每个工件都有 m m m 道工序&#xff0c;每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作&#xff0c;我们用记号 j-k 表示一个操作&…

C#_GDI+ 绘图编程入门

官网提供相关API GDI 基本图形功能_drawing 高级二维和矢量图形功能_drawing2D GDI 图像处理功能_Imaging GDI 排版功能_text Windows 窗体应用程序提供打印功能_Printing 像素 构成图像的最小单位就是像素&#xff1b;屏幕上显示不管是位图或者矢量图&#xff0c;当描述…

I2C通信协议

I2C总线接口 I2C(IIC,Inter一Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 主器件用于启动总线传送数据&#xff0c;并产生时钟以开放传送的器件&#xff0c;此时任何被寻址…

1448. 统计二叉树中好节点的数目(C++题解)

1448. 统计二叉树中好节点的数目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,nu…

门店数字化系统怎么做?

​如果门店只做线下生意&#xff0c;相信前几年的经历已经充分说明一旦客户不上门、生意就玩完&#xff1b;如果门店只做线上生意&#xff0c;无数平台的血泪教训也表明哪怕砸钱也无法跟大平台抗衡&#xff1b;因此&#xff0c;线上线下深度融合已经成为实体行业的必然趋势&…

解决 ‘bee‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在学习go 中的beego框架,在下载依赖 之后执行bee new projectname 后出现了一个问题: 网上教程说是缺少环境变量,又说什么需要自己收到beego的src文件夹下编译main.go 忙活了半天,最后都以失败告终; 解决方案是: go install github.com/beego/bee/v2master执行bee ve…

【2023全网最全最火教程】WebSocket协议测试实战

当涉及到WebSocket协议测试时&#xff0c;有几个关键方面需要考虑。在本文中&#xff0c;我们将探讨如何使用Python编写WebSocket测试&#xff0c;并使用一些常见的工具和库来简化测试过程。 1、什么是WebSocket协议&#xff1f; WebSocket是一种在客户端和服务器之间提供双向…

爬虫逆向实战(二十一)-- 某某点集登录与获取数据

登录 一、数据接口分析 主页地址&#xff1a;某某点集 1、抓包 通过抓包可以发现登录接口是phonePwdLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有pwd和sig两个加密参数 请求头是否加密&#xff1f; 无响应是否加密&#x…

Java并发工具类

JDK并发包中常用并发工具类&#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段&#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…

LTK5313功放芯片

LTK5313 是一款内置自适应升压F类音频功率放大芯片&#xff0c;具有AGC防破音功能、AB/D类模式切换、自适应、超低底噪、超低EMI。自适应升压在输出幅度较小时升压电路不工作&#xff0c;功放直接由电源供电&#xff0c;当输出较大时内部自动启动升压电路&#xff0c;功放供电…