【FPGA/verilog -入门学习12】Verilog可配置的PWM设计,参数传递的3种方式

需求:

基于任务(task)的PWM设计仿真验证

需求分析:

1,需求实现可配置PWM输出(频率,占空比)

2,输入,输出端口

input i_clk, //clk = 50Mhz

input i_rst_n,

input i_en,

output reg o_vld,//有效信号

output reg o_pwm

3,定义计数寄存器reg [7:0]cnt;

用于计数,0~ 分频最大值,

o_pwm 在计数到0~正数占空比来临前置高,其他时间置低

4,o_vld 在最高计数来临时,置高,其他时间置低

实现方案1,使用参数传递方式,将最大计数值和高脉冲占空比计数值通过 参数传递出去

vlg_design

/
/*
    实现pwm 350kHZ,占空比50%的输出
 */
/
`timescale 1ns/1ps

module vlg_design #(
parameter CNT_MAX = 50_000_000/350_000 - 1 , //350Khz计数值,
parameter CNT_MAX_PERCENT = 50_000_000/350_000*0.5 -1 //50%占空比
)
(
    input i_clk,     //clk = 50Mhz
    input i_rst_n,
    input i_en,
    output reg o_vld,    //有效信号
    output reg o_pwm
    );


reg [7:0]cnt;
always@(posedge i_clk) begin
    if(!i_rst_n) cnt <= 'b0;
    else if(!i_en) cnt <= 'b0;
    else if(cnt < CNT_MAX) cnt <= cnt+1'b1;
    else cnt <= 'b0;
end 

always@(posedge i_clk) begin
    if(!i_rst_n) o_pwm <= 'b0;
    else if(!i_en) o_pwm <= 'b0;
    else if(cnt <= CNT_MAX_PERCENT) o_pwm <= 1'b1;
    else o_pwm <= 'b0;
end 
    
always@(posedge i_clk) begin
    if(!i_rst_n) o_vld <= 'b0;
    else if(!i_en) o_vld <= 'b0;
    else if(cnt == CNT_MAX) o_vld <= 1'b1;
    else o_vld <= 'b0;
end 

endmodule

testbench_top

`timescale 1ns/1ps
module testbench_top();


//参数定义
 `define CLK_PERIORD 20    //50Mhz

localparam  CNT_500KHZ_MAX =  50_000_000/500_000 - 1 ; //350Khz计数值
localparam CNT_500KHZ_MAX_10_PERCENT =  50_000_000/500_000*0.1 -1  ;//50%占空比

//接口申明
reg i_clk;
reg i_rst_n;
reg i_en;
wire o_vld;    //有效信号
wire o_pwm;

vlg_design  #(
.CNT_MAX (CNT_500KHZ_MAX),
.CNT_MAX_PERCENT(CNT_500KHZ_MAX_10_PERCENT)
)
vlg_design_inst(
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_en(i_en),
    .o_vld(o_vld),
    .o_pwm(o_pwm) 
    );        
 
initial  begin
i_en <= 0;
i_clk <= 0;
i_rst_n <= 0;
#200;
i_rst_n <= 1;
end
always #(`CLK_PERIORD/2) i_clk = ~i_clk;
//产生激励
initial begin
    @(posedge i_clk);
    @(posedge i_rst_n);    
    i_en <= 1;
    @(posedge i_clk);    
    #5_000;
    i_en <= 0;
    $stop;
end

endmodule
 

实现方案2,将配置分频计数的参数和占空比高脉冲计数参数,配置位输入port,在测试文件中,使用task任务的方式对其赋不同的值,实现参数配置生成不同的PWM信号

vlg_design

/
/*
    实现pwm 350kHZ,占空比50%的输出
 */
/
`timescale 1ns/1ps
module vlg_design (
    input [7:0] i_cnt_max,
    input [7:0] i_cnt_max_percent,
    input i_clk,     //clk = 50Mhz
    input i_rst_n,
    input i_en,
    output reg o_vld,    //有效信号
    output reg o_pwm
    );

reg [7:0]cnt;
always@(posedge i_clk) begin
    if(!i_rst_n) cnt <= 'b0;
    else if(!i_en) cnt <= 'b0;
    else if(cnt < i_cnt_max) cnt <= cnt+1'b1; 
    else cnt <= 'b0;
end 

always@(posedge i_clk) begin
    if(!i_rst_n) o_pwm <= 'b0;
    else if(!i_en) o_pwm <= 'b0;
    else if(cnt <= i_cnt_max_percent) o_pwm <= 1'b1;
    else o_pwm <= 'b0;
end 
    
always@(posedge i_clk) begin
    if(!i_rst_n) o_vld <= 'b0;
    else if(!i_en) o_vld <= 'b0;
    else if(cnt == i_cnt_max) o_vld <= 1'b1;
    else o_vld <= 'b0;
end 

endmodule

testbench_top

`timescale 1ns/1ps
module testbench_top();

//参数定义
 `define CLK_PERIORD 20    //50Mhz

localparam  CNT_500KHZ_MAX =  50_000_000/500_000 - 1 ; //500Khz计数值
localparam CNT_500KHZ_MAX_10_PERCENT =  50_000_000/500_000*0.5 -1  ;//50%占空比

localparam  CNT_350KHZ_MAX =  50_000_000/350_000 - 1 ; //350Khz计数值
localparam CNT_350KHZ_MAX_10_PERCENT =  50_000_000/350_000*0.1 -1  ;//10%章 ?空比

//接口申明
reg [7:0] i_cnt_max;
reg [7:0] i_cnt_max_percent;
reg i_clk;
reg i_rst_n;
reg i_en;
wire o_vld;    //有效信号
wire o_pwm;

vlg_design vlg_design_inst(
    .i_cnt_max(i_cnt_max),
    .i_cnt_max_percent(i_cnt_max_percent),
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_en(i_en),
    .o_vld(o_vld),
    .o_pwm(o_pwm) 
    );        

task setpwmparam;
    input [7:0]t_cnt_max;
    input [7:0]t_cnt_max_percent;
    begin
    
    i_cnt_max <= t_cnt_max;
    i_cnt_max_percent <= t_cnt_max_percent;
    @(posedge i_clk);    
    i_en <= 1;
    repeat(t_cnt_max*2) @(posedge i_clk);
    i_en <= 0;
    end
endtask 

initial  begin
i_en <= 0;
i_clk <= 0;
i_rst_n <= 0;
#200;
i_rst_n <= 1;
end

always #(`CLK_PERIORD/2) i_clk = ~i_clk;
//产生激励
initial begin
    @(posedge i_clk);
    @(posedge i_rst_n);    
    setpwmparam(CNT_500KHZ_MAX,CNT_500KHZ_MAX_10_PERCENT);
    #200;    
    setpwmparam(CNT_350KHZ_MAX,CNT_350KHZ_MAX_10_PERCENT);
    #20000;
    $stop;
end

endmodule
 

方案3:使用vivado VIO功能传递参数

步骤1,添加设计文件到vivado工程

步骤2,添加vio ip核

步骤2,复制veo文件下的例化模板至设计文件中

去掉模块定义中的这4个输入,改为VIO提供,由软件控件配置参数,通过JTAG 线缆,传递给芯片

步骤3,运行综合

步骤4,管脚分配

步骤5,生成bit文件,并烧录

步骤6,添加vio按钮

将i_en 配置成按钮button ,按下是高电平

其他3个配置位,10进制输入

点击i_en 开始测试

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

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

相关文章

设计模式(三)-结构型模式(1)-适配器模式

一、为何需要适配器模式&#xff08;Adapter&#xff09;? 在软件设计中&#xff0c;某个模块里有很多公用的功能接口&#xff0c;其中有些公用接口需要用到不同的类当中时&#xff0c;会出现接口不兼容的问题。因为这些不同的类对这个相同任务的接口&#xff0c;都有各自代码…

DNSLog漏洞探测(七)之SQL注入漏洞实战

DNSLog漏洞探测(七)之SQL注入漏洞实战 在前面的文章之中&#xff0c;我们已经学习了XSS、RCE、XXE、SSRF漏洞中有关于DNSLog平台的使用。这些漏洞本身在执行时就有解析URL地址&#xff0c;发起网络请求的操作&#xff0c;所以只要我们把DNSLog平台获取的子域名地址发送到存在漏…

优化钢铁加工:RFID技术的革新应用

优化钢铁加工&#xff1a;RFID技术的革新应用 RFID是一种无线通信技术&#xff0c;通过将标签上的电子数据以无线电信号的形式传输&#xff0c;实现对物品的远程识别和跟踪。在钢铁加工领域&#xff0c;RFID技术的应用能够提高生产效率、降低成本并优化物流管理。本文将探讨RF…

DevOps 和人工智能 – 天作之合

如今&#xff0c;人工智能和机器学习无处不在&#xff0c;所以它们开始在 DevOps 领域崭露头角也毫不令人意外。人工智能和机器学习正在通过自动化任务改变 DevOps&#xff0c;并使各企业的软件开发生命周期更高效、更深刻和更安全。我们在 DevOps 趋势中简要讨论过这一问题&am…

【Hive】——DDL(DATABASE)

1 概述 2 创建数据库 create database if not exists test_database comment "this is my first db" with dbproperties (createdByAllen);3 描述数据库信息 describe 可以简写为desc extended 可以展示更多信息 describe database test_database; describe databa…

有意思!40小时工作制来了,996再见

​在中国&#xff0c;加班文化已经深入人心。工资越高加班越多&#xff0c;“996”已成为一些行业标签&#xff0c;月薪30k以上的职场人中超过86&#xff05;经常加班。所以今天我就来说一下这40小时工作制到底是从何而来&#xff0c;感兴趣的往下看看吧&#xff01; 40小时工…

【Hive_02】查询语法

1、基础语法2、基本查询&#xff08;Select…From&#xff09;2.1 全表和特定列查询2.2 列别名2.3 Limit语句2.4 Where语句2.5 关系运算函数2.6 逻辑运算函数2.7 聚合函数 3、分组3.1 Group By语句3.2 Having语句3.3 Join语句&#xff08;1&#xff09;等值与不等值Join&#x…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…

uniapp原生插件之安卓动态权限申请原生插件

插件介绍 安卓动态权限申请原生插件&#xff0c;集成了常用的权限申请&#xff0c;可以自定义权限申请 该插件为原生开发&#xff0c;如果您想使用UTS版本可以点击这里 插件地址 安卓动态权限申请原生插件&#xff0c;支持常用的权限申请&#xff0c;支持自定义权限申请 - DC…

CleanMyMac X2024中文版好不好用?有哪些特点

CleanMyMac X您的 Mac。极速如新。点按一下&#xff0c;即可优化调整整个 Mac畅享智能扫描 — 这款超级简单的工具用于优化您的 Mac。只需点按一下&#xff0c;即可运行所有任务&#xff0c;让您的 Mac 保持干净、快速并得到最佳防护。CleanMyMac 是一款功能强大的 Mac 清理程序…

【网络安全】Suspicious DNS Query(可疑的DNS查询)

文章目录 名词解释可能原因分析Action sinkhole在防火墙里面查询Suspicious DNS Query预防Suspicious DNS查询带来的风险推荐阅读 名词解释 “Suspicious DNS Query&#xff08;可疑的DNS查询&#xff09;”通常指的是在网络中检测到的可能具有风险或异常行为的DNS&#xff08…

【数据结构】栈和队列超详解!(Stack Queue)

文章目录 前言一、栈1、栈的基本概念2、栈的实现&#xff08;数组实现&#xff09;3、栈的基本操作3.1 栈的结构设计3.2 栈常见的基本函数接口 4、栈的实现4.1 初始化栈4.2 栈的销毁4.3 入栈4.4 出栈4.5 判空4.6 长度4.7 获取栈顶元素 完整代码Stack.hStack.cTest.c 二、队列1、…

点对点协议PPP

目录 一. PPP协议的特点1.1 PPP 协议应满足的需求1.2 PPP 协议的组成 二. PPP协议的帧格式2.1 PPP协议的透明传输2.1.1 同步传输2.1.2 异步传输 三. PPP协议的工作状态 \quad 一. PPP协议的特点 \quad \quad 用户到ISP的链路使用PPP协议 \quad \quad 1.1 PPP 协议应满足的需求 …

面试题:HashMap 为什么不能一边遍历一遍删除

文章目录 前言foreach 循环&#xff1f;HashMap 遍历集合并对集合元素进行 remove、put、add1、现象为什么会抛出这个异常呢&#xff1f;2、细究底层原理 前言 上面出现这样的原因是在使用 foreach 对 HashMap 进行遍历时&#xff0c;同时进行 put 赋值操作会有问题&#xff0c…

6-6 堆排序 分数 10

typedef int Datatype; typedef struct {Datatype* elem; int Length; }SqList; typedef SqList HeapType; void swap(int* a, int* b) {int tmp *a;*a *b;*b tmp; } //建大堆 //m: 结点个数 s: 待下调父结点下标 void HeapAdjust(HeapType H, int s, int m) {int child …

骨传导耳机和开放式耳机哪个对听力的损伤小一些?

先说结论&#xff0c;骨传导耳机对听力的损伤更小&#xff0c;并且更值得入手。 其实骨传导耳机也算开放式耳机的一种&#xff0c;开放式耳机中又包括了骨传导耳机和气传导耳机&#xff0c;与其说骨传导耳机和入耳式耳机&#xff0c;不如说是骨传导耳机和气传导耳机&#xff0…

代码随想Day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 这道题和前一天的射箭题目思想类似&#xff0c;用总区间个数-不重叠的区间个数等于需要去除的区间个数。首先对左边界排序&#xff0c;如果当前的左边界大于等于上一区间的右边界&#xff0c;则说明是一个不重叠的区间&#xff0c;否则&#xff0c;更新上一重…

基于Web的智慧城市实验室主页系统设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对实验室信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&…

Layui实现自定义的table列悬停事件并气泡提示信息

1、概要 使用layui组件实现table的指定列悬停时提示信息&#xff0c;因为layui组件中没有鼠标悬停事件支持&#xff0c;所以需要结合js原生事件来实现这个功能&#xff0c;并结合layui的tips和列的templte属性气泡提示实现效果。 2、效果图 3、代码案例 <!DOCTYPE html&g…

Hdfs java API

1.在主机上启动hadoop sbin/start-all.sh 这里有一个小窍门&#xff0c;可以在本机上打开8088端口查看三台机器的连接状态&#xff0c;以及可以打开50070端口&#xff0c;查看hdfs文件状况。以我的主虚拟机为例&#xff0c;ip地址为192.168.198.200&#xff0c;所以可以采用下…
最新文章