fpga系列 HDL:ModelSim显示模拟波形以及十进制格式数值
-
FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。
-
右键波形
->Format
->Analog
-
效果
-
不同的数值格式显示:
右键波形
->Radix
->Decimal
-
效果
示例代码
verilog
/*
- 输出 是否找到同步头- 找正峰- 尝试找到超过正阈值的点作为潜在的正峰。- 对每个可能的正峰,进一步检查它是否是局部最大值(通过比较接下来的12个样本),并记录峰值的位置。- 验证正峰后的负峰 :- 一旦找到一个正峰,检查其后大约18或24个样本处是否存在低于负阈值的负峰。- 如果找到了符合条件的负峰,则认为找到了一个同步信号的开始,
*/ module MySyncDetect (input wire reset,input wire CLK_for_FIFO, // 同步FIFO控制信号input wire [15:0] DATA_FIR_from_DFIFO, // 来自FIFO的数据流input wire full_from_DFIFO, // FIFO满标志input wire [11:0] usedw_from_DFIFO, // FIFO已用深度output reg sync_detected, // 是否找到同步头output reg[2:0] state // 状态机状态
);parameter SYNCLEN = 64; // 同步长度参数,可以根据实际情况调整
parameter POS_THRESHOLD = 100; // 正阈值
parameter NEG_THRESHOLD = -100; // 负阈值
localparam DEPTH = 32; // 数据缓冲区深度
localparam FIND_RANGE = 20; // 数据缓冲区深度// 状态机定义
localparam IDLE = 3'b000;
localparam FIND_PEAK = 3'b001;
localparam CHECK_NEGATIVE_PEAK = 3'b010;
localparam SYNC_FOUND = 3'b011;
// reg [2:0] state;
reg [2:0] next_state;reg [15:0] data_buffer[0:DEPTH-1]; // 数据缓冲区
reg [4:0] buffer_index; // 缓冲区索引
reg [4:0] peak_index; // 峰值索引
reg bPeak; // 是否找到峰值
reg bFirstTag; // 第一个标签标记integer i=0;
integer j;
integer k;// 初始化状态always @(posedge reset) beginif (reset) beginstate = IDLE;next_state = IDLE;buffer_index = 5'b0;end
end// 控制信号
wire valid_data = (usedw_from_DFIFO > 0);// && !full_from_DFIFO;
wire [15:0] current_data = DATA_FIR_from_DFIFO;// 时钟边沿触发过程
always @(posedge CLK_for_FIFO) beginif (valid_data) begin// 更新数据缓冲区data_buffer[buffer_index] <= current_data;buffer_index <= (buffer_index == DEPTH-1) ? 0 : buffer_index + 1;end// 状态机转换state <= next_state;
end// 下一状态逻辑
always @(posedge CLK_for_FIFO) begin// next_state = state;case (state)IDLE: beginif (valid_data)next_state = FIND_PEAK;endFIND_PEAK: begin// 查找正峰if(buffer_index>= 12)begini = buffer_index-12;end else begin i = buffer_index + DEPTH - 12;endif (data_buffer[i] > POS_THRESHOLD) begin// 确认是否为局部最大值bPeak = 1;for (j = 1; j < 12; j = j + 1) beginif (data_buffer[(i+j) % DEPTH] > data_buffer[i]) beginbPeak = 0;endend// 是局部最大值if (bPeak) beginpeak_index = i;next_state = CHECK_NEGATIVE_PEAK;endendendCHECK_NEGATIVE_PEAK: begin// 验证正峰后的负峰for (k = 18; k <= 24; k = k + 1) beginif (data_buffer[(peak_index+k) % DEPTH] < NEG_THRESHOLD) begin// 找到符合条件的负峰next_state = SYNC_FOUND;endendendSYNC_FOUND: begin// 已经找到同步头next_state = IDLE;endendcase
end// 输出逻辑
always @(posedge CLK_for_FIFO) beginsync_detected <= 0;case (state)SYNC_FOUND: beginsync_detected <= 1;enddefault: beginsync_detected <= 0;endendcase
endendmodule
tb
// Testbench for SyncDetect`timescale 1ns/1psmodule MySyncDetect_tb;// Inputsreg CLK_for_FIFO;reg [15:0] DATA_from_DFIFO;reg full_from_DFIFO;reg [11:0] usedw_from_DFIFO;integer i;// Outputwire sync_detected;wire[2:0] state;// Instantiate the Unit Under Test (UUT)M2SyncDetect uut (.CLK_for_FIFO(CLK_for_FIFO),.DATA_FIR_from_DFIFO(DATA_from_DFIFO),.full_from_DFIFO(full_from_DFIFO),.usedw_from_DFIFO(usedw_from_DFIFO),.sync_detected(sync_detected),.state(state));// Clock generationinitial beginCLK_for_FIFO = 0;forever #5 CLK_for_FIFO = ~CLK_for_FIFO; // 10 ns clock periodend// Stimulusinitial begin// Initialize inputsDATA_from_DFIFO = -16'd23000;full_from_DFIFO = 0;usedw_from_DFIFO = 12'd0;// Apply test cases#100;DATA_from_DFIFO = -16'd23000; // Example datausedw_from_DFIFO = 12'd1;#20;DATA_from_DFIFO = -16'd1; // Example datausedw_from_DFIFO = 12'd2;#30;DATA_from_DFIFO = 16'h1234; // Example datausedw_from_DFIFO = 12'd3;#50;DATA_from_DFIFO = 16'hDEAD; // Example datausedw_from_DFIFO = 12'd4;// Apply test cases#10;for (i = 0; i < 5; i = i + 1) beginDATA_from_DFIFO = -16'd23000 + i; // Example data with variationfull_from_DFIFO = (i % 2 == 0) ? 1 : 0;usedw_from_DFIFO = 12'd100 + i * 10;#20;endfor (i = 0; i < 20; i = i + 1) beginDATA_from_DFIFO = -16'd23000 + i*10; // Example data with variation#20;end#50;$stop; // End simulation// Apply test cases#100;DATA_from_DFIFO = -16'd23000; // Example datausedw_from_DFIFO = 12'd1;#20;DATA_from_DFIFO = -16'd1; // Example datausedw_from_DFIFO = 12'd2;#30;DATA_from_DFIFO = 16'h1234; // Example datausedw_from_DFIFO = 12'd3;#50;DATA_from_DFIFO = 16'hDEAD; // Example datausedw_from_DFIFO = 12'd4;// Apply test cases#10;for (i = 0; i < 5; i = i + 1) beginDATA_from_DFIFO = -16'd23000 + i; // Example data with variationfull_from_DFIFO = (i % 2 == 0) ? 1 : 0;usedw_from_DFIFO = 12'd100 + i * 10;#20;endfor (i = 0; i < 20; i = i + 1) beginDATA_from_DFIFO = -16'd23000 + i*10; // Example data with variation#20;endendendmodule
相关文章:

fpga系列 HDL:ModelSim显示模拟波形以及十进制格式数值
FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。 右键波形->Format-> Analog 效果 不同的数值格式显示:右键波形->Radix-> Decimal 效果 示例代码 ver…...

Linux 基本指令
目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…...

GO语言基础面试题
一、字符串和整型怎么相互转换 1、使用 strconv 包中的函数 FormatInt 、ParseInt 等进行转换 2、转换10进制的整形时,可以使用 strconv.Atoi、strconv.Itoa: Atoi是ParseInt(s, 10, 0) 的简写 Itoa是FormatInt(i, 10) 的简写 3、整形转为字符型时&#…...

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量
文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …...

小程序基础 —— 10 如何调试小程序代码
如何调试小程序代码 在进行项目开发的时候,不可避免需要进行调试,那么如何调试小程序呢? 打开微信开发者工具后,有一个模拟器,通过模拟器能够实时预览自己写的页面,如下: 在上部工具栏中有一个…...

Vue项目如何设置多个静态文件;如何自定义静态文件目录
Vite实现方案 安装插件 npm i vite-plugin-static-copy在vite.config.ts引入 import { viteStaticCopy } from vite-plugin-static-copy配置 plugins: [viteStaticCopy({targets: [{src: "要设置的静态文件目录的相对路径 相对于vite.config.ts的", dest: ./, // …...

CentOS Stream 9 安装 JDK
安装前检查 java --version注:此时说明已安装过JDK,否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用,或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址:https://www.oracle.com/java/technologies/downloads…...

前端(htmlcss)
前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...
py打包工具
pyinstaller 安装 大佬文档参考 pip install pyinstallerpyinstaller 参数 -i 给应用程序添加图标 -F 只生成一个exe格式的文件 -D 创建一个目录,包含exe文件,但会依赖很多文件(默认选项) -c 有黑窗口 -w 去掉黑窗口pyinstalle…...
华为OD E卷(100分)39-最长子字符串的长度(二)
前言 工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力…...

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案
问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…...

JSON结构快捷转XML结构API集成指南
JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中,数据交换格式的选择对于系统的互操作性和效率至关重要。JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种广泛使用的数据表…...

【视觉惯性SLAM:四、相机成像模型】
相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容,它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型,以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…...
网络编程:TCP和UDP通信基础
TCP 简易服务器: #include<myhead.h>int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_STREAM,0);if(oldfd -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server {.sin_family AF_INET,.…...
声波配网原理及使用python简单的示例
将自定义的信息内容(如Wi-Fi配置、数字数据)转换为音波是一种音频调制与解调技术,广泛应用于声波配网、数据传输和近场通信中。这项技术的实现涉及将数字信息编码为音频信号,并通过解码还原信息。 实现方法 1. 数字数据编码 将原…...
深度学习任务中的 `ulimit` 设置优化指南
深度学习任务中的 ulimit 设置优化指南 1. 什么是 ulimit?2. 深度学习任务中的关键 ulimit 设置2.1 max locked memory(-l)2.2 open files(-n)2.3 core file size(-c)2.4 stack size(…...

【学生管理系统】权限管理
目录 6.4 权限管理(菜单管理) 6.4.1 查询所有(含孩子) 6.4.2 添加权限 6.4.3 核心3:查询登录用户的权限,并绘制菜单 6.4 权限管理(菜单管理) 6.4.1 查询所有(含孩子…...

Java编程题_面向对象和常用API01_B级
Java编程题_面向对象和常用API01_B级 第1题 面向对象、异常、集合、IO 题干: 请编写程序,完成键盘录入学生信息,并计算总分将学生信息与总分一同写入文本文件 需求:键盘录入3个学生信息(姓名,语文成绩,数学成绩) 求出每个学生的总分 ,并…...

JUC并发工具---线程协作
信号量能被FixedThreadPool代替吗 Semaphore信号量 控制需要限制访问量的资源,没有获取到信号量的线程会被阻塞 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;public class Sem…...

Excel for Finance 08 `XNPV`和`XIRR` 函数
Excel 的 XNPV 函数用于计算基于特定日期的净现值(Net Present Value, NPV)。与标准的 NPV 函数相比,XNPV 更灵活,可以考虑不规则的现金流间隔,而不仅限于等间隔的期数。 语法: XNPV(rate, values, dates)…...

Redis7底层数据结构解析
redisObject 在 Redis 的源码中,Redis 会将底层数据结构(如 SDS、hash table、skiplist 等)统一封装成一个对象,这个对象叫做 redisObject,也简称 robj。 typedef struct redisObject {unsigned type : 4; // 数…...
Linux gron 命令使用详解
简介 gron 是一个独特的命令行工具,用于将 JSON 数据转换为离散的、易于 grep 处理的赋值语句格式。它的名字来源于 “grepable on” 或 “grepable JSON”,主要解决在命令行中处理复杂 JSON 数据的难题。 核心价值 gron 的核心是将 JSON 数据展平为类…...

STM32之IIC(重点)和OLED屏
内部集成电路概述 基本概念 内部集成电路(Inter Integrated Circuit)的简称叫做IIC或者I2C,是一种简单的、半双工同步通信的串行通信接口,IIC总线是上世纪80年代(1982年)由飞利浦公司设计出来,…...
python魔法函数
Python 中的魔法方法(Magic Methods),也称为特殊方法(Special Methods)或双下方法(Dunder Methods),是以双下划线 __ 开头和结尾的方法。它们用于定义类的行为,例如运算符…...

第12讲、Odoo 18 权限控制机制详解
目录 引言权限机制概述权限组(Groups)访问控制列表(ACL)记录规则(Record Rules)字段级权限控制按钮级权限控制菜单级权限控制综合案例:多层级权限控制最佳实践与注意事项总结 引言 Odoo 18 提…...

openresty+lua+redis把非正常访问的域名加入黑名单
一、验证lua geoIp2是否缺少依赖 1、执行命令 /usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb 执行安装命令报错,缺少Digest/MD5依赖 2、Digest/MD5依赖 yum -y install perl-Digest-MD5 GeoIP2 lua库依赖动态库安装,lua库依赖libmaxminddb实…...
如何将vue2使用npm run build打包好的文件上传到服务器
要将 Vue 2 项目打包并部署到服务器上,并使用 Nginx 作为 Web 服务器,可以按照以下步骤操作: 1. 打包 Vue 2 项目 首先,确保你的 Vue 2 项目已经开发完成,并且可以在本地正常运行。然后使用以下命令进行打包…...

Flutter下的一点实践
目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前,…...
关于5090安装tensorrt(python api)的过程
前提条件 硬件5090 ubuntu24.04 cuda版本12.8 找到适配的tensorrt版本 Nvidia官网 完事了之后找到对应版本tar安装包 tar -xvzf tensorrt-你的安装包.tar 然后记得将路径加入到环境变量中 #在这里插入代码片 gedit ~/.bashrc # 添加 export PATH/PATH/To/TensorRT-你的按安…...
mysql安装教程--笔记
一、Windows 系统安装 方法1:使用 MySQL Installer(推荐) 1. 下载安装包 访问 MySQL 官网下载页面,选择 MySQL Installer for Windows。 2. 运行安装程序 双击下载的 .msi 文件,选择安装类型: ◦ Developer…...