FPGA Verilog实现一个脉冲波形变换

一、波形变换需求

二、思路

(1)脉冲边沿提取,得到波形的上升沿r_rise和下降沿r_fall

(2)将上升沿r_rise延迟一节拍r_r_rise,r_rise更新上一周期的周期和脉宽并清空上一次的脉冲周期计数和脉宽周期计数,r_r_rise启动本次脉冲周期计数和脉宽计数,r_fall结束本次脉宽计数

三、代码

`timescale 1ns / 1ps
module pulse_transfer(ttl_in	,// mcu ttl inputsys_clk	,// 100MHz clk inputreset_n	,// negtive reset inputttl_out,  // fpga ttl output				);/*! -------------------------------------------------------------------------- */
/*!  module port defination */
input							ttl_in	;
input							sys_clk	;
input							reset_n	;
output							ttl_out	;parameter FRE_SYS		 = 30'd100000000;//100MHz/*! -------------------------------------------------------------------------- */
/*!  module macro defination */
parameter MAX_PULSE_WIDTH_COUNT	= 16'd20000; /*! max width  200us = 10ns*20000 */
parameter MAX_PULSE_PERIOD_COUNT = 30'd100000000;           /*! max period  1s */
parameter COUNT_OFFSET = 3'd2;
parameter TIME_1US = 8'd100;							
parameter TIME_300NS = 8'd30;/*! -------------------------------------------------------------------------- */
/*!  get rise and fall edge  */
wire 							w_is_rise_trigger;
wire 							w_is_fall_trigger;
reg							    r_ttl_in_delay;
reg							    r_ttl_in_delay_1;
always	@	(	posedge sys_clk  or negedge reset_n )
beginif(	!reset_n )	beginr_ttl_in_delay   	<=	1'b0	;r_ttl_in_delay_1	<=	1'b0	;endelsebeginr_ttl_in_delay	    <=	ttl_in	;r_ttl_in_delay_1	<=	r_ttl_in_delay	;end
end	//assign	w_is_rise_trigger =  ~r_ttl_in_delay&ttl_in;
//assign	w_is_fall_trigger =  ~ttl_in&r_ttl_in_delay;/*! -------------------------------------------------------------------------- */
/*!  synch rise and fall trigger  */
reg								r_is_rise_trigger;
reg								r_is_fall_trigger;
always	@	(	posedge sys_clk or negedge reset_n)
beginif(	!reset_n )	beginr_is_rise_trigger <= 1'b0;r_is_fall_trigger <= 1'b0;endelse if({r_ttl_in_delay,r_ttl_in_delay_1} == 2b'10)beginr_is_rise_trigger	<= 1'b1;r_is_fall_trigger <= 1'b0;endelse if({r_ttl_in_delay,r_ttl_in_delay_1} == 2b'01)beginr_is_rise_trigger	<= 1'b0;r_is_fall_trigger <= 1'b1;endelse beginr_is_rise_trigger <= 1'b0;r_is_fall_trigger <= 1'b0;end
end/*! -------------------------------------------------------------------------- */
/*!  get start count trigger  */
reg								r_count_start_trigger;
wire							w_count_clear_trigger;
assign w_count_clear_trigger = r_is_rise_trigger;
always	@	(	posedge sys_clk or negedge reset_n )
beginif(	!reset_n )	r_count_start_trigger	<=	1'b0;elser_count_start_trigger	<=	w_count_clear_trigger;
end	/*! -------------------------------------------------------------------------- */
/*!  get period and width count enable flag  */
reg								r_is_pulse_period_count_enable;
reg								r_is_pulse_width_count_enable;
always	@	(	posedge sys_clk or negedge reset_n)
beginif(	!reset_n )	beginr_is_pulse_period_count_enable = 1'b0;r_is_pulse_width_count_enable = 1'b0;endelse	beginif( r_is_rise_trigger )beginr_is_pulse_period_count_enable = 1'b0;r_is_pulse_width_count_enable = 1'b0;endif( r_count_start_trigger )beginr_is_pulse_width_count_enable  = 1'b1;r_is_pulse_period_count_enable = 1'b1;endif( r_is_fall_trigger )r_is_pulse_width_count_enable = 1'b0;end
end	/*! -------------------------------------------------------------------------- */
/*!  pulse width and period count handle */
reg			[30:0]				r_pulse_period_count;
reg			[30:0]				r_pulse_period;
reg			[30:0]				r_pulse_width_count;
reg			[30:0]				r_pulse_width;
always	@	(	posedge sys_clk or negedge reset_n )
beginif(	!reset_n )	beginr_pulse_width_count <= 30'd0;r_pulse_width <= 30'd0;r_pulse_period_count <=	30'd0;r_pulse_period <= 30'd0;endelsebeginif(	r_is_rise_trigger )begin				r_pulse_period_count <= 30'd0;r_pulse_width_count <= 30'd0;endif( r_is_pulse_width_count_enable )r_pulse_width_count <= r_pulse_width_count + 1'b1;elsebeginr_pulse_width <= r_pulse_width_count;endif( r_is_pulse_period_count_enable )r_pulse_period_count <= r_pulse_period_count + 1'b1;elsebeginr_pulse_period <= r_pulse_period_count;endend
end/*! -------------------------------------------------------------------------- */
/*!  output pulse handle */
reg			[30:0]			r_out_cnt;
reg							r_ttl_out;		
always	@	(	posedge sys_clk or negedge reset_n )
beginif(	!reset_n )	beginr_ttl_out <= 1'b0;r_out_cnt <= 1'b0;endelsebegin//if( r_pulse_period > MAX_PULSE_PERIOD_COUNT || r_pulse_width > MAX_PULSE_WIDTH_COUNT)//	begin//		r_ttl_out <= 1'b0;//		r_out_cnt <= 1'b0;//	end//elseif(r_pulse_period == 0 || r_pulse_width == 0)beginr_out_cnt <= 1'b0;endelsebeginif( r_pulse_width <= TIME_1US + 4'd10 )//*note in <1.1us casebeginif( r_out_cnt < TIME_300NS )//0.3usbeginr_ttl_out <= 1'b1;r_out_cnt <= r_out_cnt + 1'b1;endelse if ( r_out_cnt < r_pulse_period )beginr_ttl_out <= 1'b0;r_out_cnt <= r_out_cnt + 1'b1;	endelsebeginr_ttl_out <= 1'b0;	r_out_cnt <= 1'b0;	endendelsebeginif( r_out_cnt < r_pulse_width - TIME_1US)//*note -1usbeginr_ttl_out <= 1'b1;r_out_cnt <= r_out_cnt + 1'b1;endelse if ( r_out_cnt < r_pulse_period )beginr_ttl_out <= 1'b0;r_out_cnt <= r_out_cnt + 1'b1;	endelsebeginr_ttl_out <= 1'b0;	r_out_cnt <= 1'b0;	endendendend
end/*! -------------------------------------------------------------------------- */
/*!  output assign handle */
assign	ttl_out	= r_ttl_out;endmodule

四、行为仿真

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

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

相关文章

STM32 DSP库的使用方法

一、工程中如何添加DSP库 在keil5软件中点击 Pack&#xff0c;CMISIS组件选择DSP资源&#xff0c;可以选择Source源码或者Library库导入到项目中&#xff0c;点击OK&#xff0c;可以在项目树中看到该资源已经导入了工程。 二、 如何使用DSP库 DSP库对浮点计算做了优化和增强&…

SharePoint 2010-随机出现的页面性能问题

有个客户, 服务器的配置巨牛, 24核CPU, 64GB内存, 这样的三台机器组成了一个SharePoint 2010的服务器场. 就是这样牛的配置, 出现了性能问题. 看performance log, 发现CPU, 内存都资源非常充裕, 问题发生的时候request/sec的值也非常的低. 问题发生的频率很低, 一天十次以内. …

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一、简单介绍 线程的创建&#xff1a; self.thread[[NSThread alloc]initWithTarget:self selector:selector(test) object:nil]; 说明&#xff1a;创建线程有多种方式&#xff0c;这里不做过多的介绍。 线程的开启&#xff1a; [self.thread star…

Qt 编写应用程序升级的配置文件json 生成工具

通过此工具将需要更新的应用程序和相关目录下的依赖文件配置成json格式的升级文件&#xff0c;客户端版本监控软件通过读取此json文件&#xff0c;对比相应字段&#xff0c;实现自动拉取文件&#xff0c;从而保证客户端应用程序自动更新。 此json文件放在待升级的exe同级目录下…

以太网供电新标准POE+,IEEE802.3at解析

以太网供电新标准POE&#xff0c;IEEE802.3at解析 以太网供电新标准POE&#xff0c;IEEE802.3at一、IEEE 802.3at标准出现的背景为了遵循IEEE 802.3af规范&#xff0c;受电设备(PD)上的PoE功耗被限制为12.95W&#xff0c;这对于传统的IP电话以及网络摄像头而言足以满足需求&am…

KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法

1、问题 KEIL compiler 设置为 “use default compiler version 5” 可以正确编译以下汇编和C混合代码&#xff0c;更改编译器为V6.12后不识别__ASM关键字&#xff0c;并对汇编语法报错。 替换为 __ASM void MSR_MSP(uint32_t addr) {MSR MSP, r0 BX r14 } 2、解决办法 6.12…

JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)

作者&#xff1a;JIURL日期&#xff1a;2015年10月30日分页机制Linux&#xff08;x64CPU&#xff09;使用基于分页机制的虚拟内存。每个进程有256TB&#xff08;48位&#xff09;的虚拟地址空间。基于分页机制&#xff0c;这256TB地址空间的一些部分 被映射了物理内存&#xff…

STM32 设置片外SRAM分散加载

STM32F407 通过FSMC外挂一片SRAM 容量1MB&#xff0c; 设置应用程序的中的超大数组存放在外部SRAM。 &#xff08;1&#xff09;首先通过设置FSMC&#xff0c;保证正确挂接SRAM。 &#xff08;2&#xff09;MDK设置 &#xff08;3&#xff09;应用程序用__attribute__指定需要…

.NET4.0 之 Dynamic VS Refle“.NET研究”ction 效率

在我先前的文章中&#xff0c;不断的推广.NET4.0新特性。特别是.NET4.0 Dynamic 这个新特性。随之而来的问题也出现了—Dynamic 执行效率如何&#xff1f; 我们做开发的不光需要代码简洁&#xff0c;能够希望自己能够写出好的架构。还有一点非常重要的就是&#xff0c;我们的写…

lwip+freeRTOS 无法ping通的解决方案

0、工程环境 STM32F407ZGT6LAN8720FreeRTOSlwIP 1、硬件 &#xff08;1&#xff09;确认PHY芯片RMII管脚是否配置正确&#xff1b; &#xff08;2&#xff09;PHY芯片初始化完成后&#xff0c;用HAL_ETH_ReadPHYRegister读一下寄存器0&#xff0c;1&#xff0c;2&#xff0c…

数据流图

数据流图(Data Flow Diagram&#xff0c;简称DFD)是一种图形化技术&#xff0c;它描绘信息流和数据从输入移动到输出的过程中所经历的变换&#xff0c;其既提供了功能建模机制也提供了信息建模机制。是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。 它以…

lwip+freeRTOS 实现热插拔功能

1、lwip启用LWIP_NETIF_CALLBACK 宏&#xff0c;cubeMX会自动生成相关函数&#xff08;&#xff09;。 /* Set the link callback function, this function is called on change of link status*/netif_set_link_callback(&gnetif, ethernetif_update_config); 回调函数在v…

iOS设计模式 - 享元

iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件&#xff0c;用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件&#xff1b;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结…

带箭头的菜单列表

<title>带箭头的菜单列表</title><style>body{background-color:#999;}#menu{font-size:16px;width:140px;margin:0 auto;border:solid 1px #ccc;}#menu a,#menu a:visited{text-decoration:none;text-align:center;color:#c00;display:block;padding:4px;ba…

gcc编译选项-Os的用法

From: http://hi.baidu.com/caosicong/item/e61fa700581980d11ff0469c **********************gcc/egcs 的主要选项********* gcc 命令的常用选项 选项 解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色&#xff0c; 例如 asm 或 typeof 关键词。…

ASP.NET和PHP全面对比

谁是速度之王&#xff1f; 刚刚在9月编程语言排行榜上取得历史性突破的PHP在Web开发领域最到的对手可能就是基于微软.NET技术的ASP.NET。近日&#xff0c;微软的 Joe Stagner在博客上发表了一系列文章比较了PHP和ASP.NET性能方面的文章&#xff0c;引起了来自双方程序员的大量回…

40个漂亮的单页网站设计案例(上篇)

有很多人喜欢单页网站&#xff0c;这种网站只有一个页面&#xff0c;设计都很精美&#xff0c;通过锚记进行平滑的导航。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站…

jsoncpp之初体验

参考文章 http://blog.csdn.net/JoeBlackzqq/article/details/9043315 , 我将里面的代码做在了一个工程亲自体验了下。 1. 下载jsoncpp源码&#xff0c; 地址: http://nchc.dl.sourceforge.net/project/jsoncpp/jsoncpp/0.5.0/jsoncpp-src-0.5.0.tar.gz 2. 编译json&#xff0…

让Windwos Server 2008 R2 SP1的FTP真正能访问

今天把FTP配置好后&#xff0c;在本机上匿名访问没有问题了&#xff0c;以为万事大吉&#xff0c;于是把需要的文件放入后&#xff0c;到另一台机子上去试试&#xff0c;结果发现出现下面的画面。访问不通&#xff01;什么原因&#xff1f;于是把防火墙完全关闭了&#xff0c;发…

几款用于电能质量测量的芯片

1、ATT7022B ATT7022B 是专用的智能电表计量芯片&#xff0c;ATT7022B 包含六路二阶 sigma-delta ADC、电能质量参数数字信号处理等电路。ATT7022B 可以测量系统的电压、电流、频率、有功功率、无功功率、有功能量、无功能量等参数。ATT7022B 通过 SPI 通信接口进行数据通信。…