fpga系列 HDL:ModelSim显示模拟波形+十进制格式数值(临时方法和设置持久化的默认值)

news2025/1/5 14:26:12

模拟波形

  • FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。
  • 右键波形->Format-> Analog
    在这里插入图片描述
  • 效果
    在这里插入图片描述

数值格式显示

  • 不同的数值格式显示:右键波形->Radix-> Decimal
    在这里插入图片描述
  • 效果
    在这里插入图片描述

临时设置格式

  • 这个格式可在当前项目的中所有仿真中保持(不关闭窗口的每次重新仿真),不用向上面一样没测设置https://ww1.microchip.com/downloads/aemDocuments/documents/FPGA/swdocs/modelsim/modelsim_user_2024_2.pdf
    在这里插入图片描述

设置默认值

  • 编辑modelsim.ini的DefaultRadix
    在这里插入图片描述

示例代码

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) begin
        if (reset) begin
            state = 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) begin
    if (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: begin
            if (valid_data)
                next_state = FIND_PEAK;
        end
        
        FIND_PEAK: begin
            // 查找正峰
				if(buffer_index>= 12)begin
					i = buffer_index-12;
				end 
				else begin 
					i = buffer_index + DEPTH - 12;
				end
					
				 if (data_buffer[i] > POS_THRESHOLD) begin
					  // 确认是否为局部最大值
					  bPeak = 1;
					  for (j = 1; j < 12; j = j + 1) begin
							if (data_buffer[(i+j) % DEPTH] > data_buffer[i]) begin
								 bPeak = 0;
							end
					  end

					  // 是局部最大值
					  if (bPeak) begin
							peak_index = i;
							next_state = CHECK_NEGATIVE_PEAK;
					  end
              end
        end
        
        CHECK_NEGATIVE_PEAK: begin
            // 验证正峰后的负峰
            for (k = 18; k <= 24; k = k + 1) begin
                if (data_buffer[(peak_index+k) % DEPTH] < NEG_THRESHOLD) begin
                    // 找到符合条件的负峰
                    next_state = SYNC_FOUND;
                end
            end
        end
        
        SYNC_FOUND: begin
            // 已经找到同步头
            next_state = IDLE;
        end
    endcase
end

// 输出逻辑
always @(posedge CLK_for_FIFO) begin
    sync_detected <= 0;
    case (state)
        SYNC_FOUND: begin
            sync_detected <= 1;
        end
        default: begin
            sync_detected <= 0;
        end
    endcase
end

endmodule

tb

// Testbench for SyncDetect

`timescale 1ns/1ps

module MySyncDetect_tb;
    // Inputs
    reg CLK_for_FIFO;
    reg [15:0] DATA_from_DFIFO;
    reg full_from_DFIFO;
    reg [11:0] usedw_from_DFIFO;
	 integer i;
    // Output
    wire 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 generation
    initial begin
        CLK_for_FIFO = 0;
        forever #5 CLK_for_FIFO = ~CLK_for_FIFO; // 10 ns clock period
    end

    // Stimulus
	 initial begin
        // Initialize inputs
        DATA_from_DFIFO = -16'd23000;
        full_from_DFIFO = 0;
        usedw_from_DFIFO = 12'd0;
		  
		  // Apply test cases
        #100;
        DATA_from_DFIFO = -16'd23000; // Example data
        usedw_from_DFIFO = 12'd1;

        #20;
        DATA_from_DFIFO = -16'd1; // Example data
        usedw_from_DFIFO = 12'd2;

        #30;
        DATA_from_DFIFO = 16'h1234; // Example data
        usedw_from_DFIFO = 12'd3;

        #50;
        DATA_from_DFIFO = 16'hDEAD; // Example data
        usedw_from_DFIFO = 12'd4;

        // Apply test cases
        #10;
        for (i = 0; i < 5; i = i + 1) begin
            DATA_from_DFIFO = -16'd23000 + i; // Example data with variation
            full_from_DFIFO = (i % 2 == 0) ? 1 : 0;
            usedw_from_DFIFO = 12'd100 + i * 10;
            #20;
        end
		  
		  for (i = 0; i < 20; i = i + 1) begin
            DATA_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 data
        usedw_from_DFIFO = 12'd1;

        #20;
        DATA_from_DFIFO = -16'd1; // Example data
        usedw_from_DFIFO = 12'd2;

        #30;
        DATA_from_DFIFO = 16'h1234; // Example data
        usedw_from_DFIFO = 12'd3;

        #50;
        DATA_from_DFIFO = 16'hDEAD; // Example data
        usedw_from_DFIFO = 12'd4;

        // Apply test cases
        #10;
        for (i = 0; i < 5; i = i + 1) begin
            DATA_from_DFIFO = -16'd23000 + i; // Example data with variation
            full_from_DFIFO = (i % 2 == 0) ? 1 : 0;
            usedw_from_DFIFO = 12'd100 + i * 10;
            #20;
        end
		  
		  for (i = 0; i < 20; i = i + 1) begin
            DATA_from_DFIFO = -16'd23000 + i*10; // Example data with variation
            #20;
        end
    end

endmodule

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

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

相关文章

Linux 中 sysctl 和 systemctl 有什么区别?

sysctl 和 systemctl 是两个不同的命令行工具&#xff0c;它们在 Linux 系统中分别用于不同的目的。理解这两个命令的区别对于系统管理和配置非常重要。 1. sysctl 功能 用途&#xff1a;sysctl 用于动态地修改内核参数&#xff0c;这些参数控制着操作系统的某些行为。配置文…

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…

Redis数据库主要数据结构类型

Redis数据库提供了丰富多样的数据结构类型&#xff0c;以满足不同场景下的数据存储需求。以下是Redis中的主要数据结构类型&#xff1a; 一、五种基础数据结构 字符串&#xff08;String&#xff09; 简介&#xff1a;字符串是Redis最基本的数据类型&#xff0c;可以存储字符串…

基于Springboot + vue实现的校园周边美食探索及分享平台

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(1):Oracle Dataguard 概述

Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Dataguard 概述 目录 Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Data…

mapbox基础,测面功能实现

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️Turf 框架二、🍀测面功能实现1. ☘️实现思路2. ☘️代码样例一、🍀…

基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】

目录 主要内容 理论研究 整体模型 PQ计算模块 功率控制模块 PWM反馈模块 结果一览 下载链接 主要内容 该仿真针对微电网中分布式电源接入后产生的谐波影响&#xff0c;除了污染网络外&#xff0c;还会恶化微电网变流器输出电流&#xff0c;为了消除谐波影响&a…

2025差旅平台推荐:一体化降本30%

医药行业因其高度专业化的特点&#xff0c;同时在运营过程中又极为依赖供应链和销售网络&#xff0c;因此差旅管理往往成为成本控制的重要环节。本期&#xff0c;我们以差旅平台分贝通签约伙伴——某知名药企为例&#xff0c;探讨企业如何通过差旅一体化管理&#xff0c;在全流…

【漫话机器学习系列】027.混淆矩阵(confusion matrix)

混淆矩阵&#xff08;Confusion Matrix&#xff09; 混淆矩阵是机器学习中评估分类模型性能的一种工具&#xff0c;特别是在多类别分类问题中。它通过对比模型预测结果和真实标签&#xff0c;帮助我们理解模型的分类效果。 1. 混淆矩阵的结构 混淆矩阵通常是一个二维表格&am…

【AIGC】 ChatGPT实战教程:如何高效撰写学术论文引言

&#x1f4a5; 欢迎来到我的博客&#xff01;很高兴能在这里与您相遇&#xff01; 首页&#xff1a;GPT-千鑫 – 热爱AI、热爱Python的天选打工人&#xff0c;活到老学到老&#xff01;&#xff01;&#xff01;导航 - 人工智能系列&#xff1a;包含 OpenAI API Key教程, 50个…

redis的学习(二)

4 哈希表 哈希类型中的映射关系通常称为field-value&#xff0c;⽤于区分Redis整体的键值对&#xff08;key-value&#xff09;&#xff0c; 注意这⾥的value是指field对应的值&#xff0c;不是键&#xff08;key&#xff09;对应的值&#xff0c; 4.1 操作命令 hset&#xff…

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…

统信系统设置代理的问题

统信系统设置代理的问题 问题表现方式一方式二 问题表现 统信系统下有系统代理和应用代理两个代理。设置系统代理时&#xff0c;git不能经过代理拉取代码。但是设置应用代理时&#xff0c;可以用git通过代理拉代码。 这是系统代理&#xff0c;在这里设置 ip 端口&#xff0c;…

U盘提示格式化?原因、恢复方案与预防措施全解析

一、U盘提示格式化现象概述 在日常使用U盘的过程中&#xff0c;我们有时会遇到一个令人头疼的问题——U盘插入电脑后&#xff0c;系统却弹出一个提示框&#xff0c;告知我们U盘需要格式化才能访问。这个提示往往伴随着数据的潜在丢失风险&#xff0c;让我们不禁为之心焦。U盘提…

Hack The Box-Starting Point系列Responder

答案 When visiting the web service using the IP address, what is the domain that we are being redirected to?&#xff08;当使用IP地址浏览网站时&#xff0c;我们被重定向到了哪个站点&#xff1f;&#xff09; unika.htbWhich scripting language is being used on …

网络物理互连

案例简介 美乐公司为新创建公司&#xff0c;公司现需要架设网络&#xff0c;需要下属分公司通过路由器与外网服务器联通&#xff0c;请使用Packet Tracer&#xff0c; 按照任务要求完成实验。实验中需配置设备或端口的IP地址。 1、绘制拓扑图 2、配置ip地址 3、配置路由ip R0 …

GDB:条件断点:判断相等时使用一个等号还是两个等号

GDB&#xff1a;条件断点&#xff1a;判断相等时使用一个等号还是两个等号 这其实是一个特别简单的问题&#xff0c;网上不同的人分享的也不一样&#xff0c;有的例子用“”&#xff0c;有的例子用“”。 用最简单的helloworld来实验一下&#xff1a; #include <stdio.h&…

TypeScript 常用类型

文章目录 1. 类型注解2. 原始类型3. 数组类型4. 联合类型5. 类型别名6. 函数类型7. 对象类型8. 接口类型8.1 接口声明8.2 接口继承 9. 元组类型10. 类型断言11. 字面量类型12. 枚举类型12.1 数字枚举12.2 字符串枚举 13. any 类型14. typeof 运算符 1. 类型注解 前言&#xff1…

路由基本配置实验

路由器用于实现不同类型网络之间的互联。 路由器转发ip分组的基础是路由表。 路由表中的路由项分为直连路由项、静态路由项和动态路由项。 通过配置路由器接口的ip地址和子网掩码自动生成直连路由项。 通过手工配置创建静态路由项。 热备份路由器协议允许将由多个路由器组…

在Ubuntu 18.04.6 LTS安装OpenFace流程

修改配置:将gcc8&#xff0c;g8作为默认选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 sudo update-alternatives --config gcc sudo update-alternatives --install /usr/bin/g g /usr/bin/g-8 100 sudo update-alternatives --config g 查…