【Verilog】big_small_cnt

news2024/11/25 22:59:22

通用大小计数器

`timescale 1ns / 1ps
//
// Company: 
// Engineer:    wengf
// Create Date: 
// Design Name: 
// Module Name: big_small_cnt
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 通用的大小计数器,输入想要开始的条件,直到条件终止
//
module big_small_cnt(
clk       ,
rst       ,
clk_p     ,
start     ,

//BIG_LENGTH,// 添加

big_cnts  ,
small_cnts
    );
//    
parameter BIG_LENGTH=16'd8;
parameter SMALL_LENGTH=8'd11;
//
input clk,rst,clk_p,start;
//input [15:0] BIG_LENGTH;//添加

output [15:0] big_cnts;
output [7:0] small_cnts;
//
reg [7:0] small_cnts;
always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	small_cnts<=8'hff;
	end
	
	else if(clk_p)
	begin
		if(start)//起始位置
		begin
		small_cnts<=8'd0;	
		end
		
		else if((small_cnts==SMALL_LENGTH-1)&&(big_cnts<BIG_LENGTH-1))//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,自动停止
		begin
		small_cnts<=8'd0;		
		end
		
		else if(big_cnts<=BIG_LENGTH-1)//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,结束循环,保持循环达不到的最大值
		begin
		small_cnts<=small_cnts +1'b1;			
		end
		
		else
		begin
		small_cnts<=small_cnts;		
		end
	end
	
	else
	begin
	small_cnts<=small_cnts;			
	end
end
//
reg [15:0] big_cnts;
always @ (posedge clk or posedge rst)
begin
	if(rst)
	begin
	big_cnts<=16'hffff;
	end
	
	else if((start)&&(clk_p))//起始位置 
	begin
	big_cnts<=16'd0;	
	end
	
	else if((small_cnts==SMALL_LENGTH-1)&&(clk_p))所需长度减1,最大值受最小值控制,按照最小值走几个周期即可。
	begin
	big_cnts<=big_cnts + 1'b1;		
	end
	
	else
	begin
	big_cnts<=big_cnts;			
	end
end
//


endmodule

通用大小计数器,去除 clk_p

`timescale 1ns / 1ps
//
// Company: 
// Engineer:    wengf
// Create Date: 
// Design Name: 
// Module Name: big_small_cnt
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 通用的大小计数器,输入想要开始的条件,直到条件终止
//
module big_small_cnt(
    clk             ,
    rst             ,
    start           ,
    
    forward_cnts    ,
    backward_cnts   , 
    big_cnts        ,
    small_cnts      ,
    small_pulse_start,
    small_pulse_end,
    pulse_end
);
  
parameter BIG_LENGTH=16'd8;
parameter SMALL_LENGTH=8'd8;
parameter COUNT = BIG_LENGTH * SMALL_LENGTH;

input clk,rst,start;
output [15:0] forward_cnts,backward_cnts;
output [15:0] big_cnts;
output [7 :0] small_cnts;
output small_pulse_start;
output small_pulse_end;
output pulse_end;

reg [15:0] forward_cnts,backward_cnts;
reg [15:0] big_cnts;
reg [7:0] small_cnts;
reg small_pulse_start,small_pulse_end,pulse_end;

always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	forward_cnts<=16'hffff;
	end
	else if(start)//起始位置
	begin
	forward_cnts<=16'd0;	
	end
	
	else if(big_cnts<=BIG_LENGTH-1)//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,结束循环,保持循环达不到的最大值
	begin
	forward_cnts<=forward_cnts +1'b1;			
	end
	
	else
	begin
	forward_cnts<=forward_cnts;		
	end
end

always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	backward_cnts <= 16'hffff;
	end
	else if(start)//起始位置
	begin
	backward_cnts <= COUNT-1'b1;	
	end
	
	else if(big_cnts<=BIG_LENGTH-1)//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,结束循环,保持循环达不到的最大值
	begin
	backward_cnts<=backward_cnts-1'b1;			
	end
	
	else
	begin
	backward_cnts<=backward_cnts;		
	end
end


always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	small_cnts<=8'hff;
	end
	else if(start)//起始位置
	begin
	small_cnts<=8'd0;	
	end
	
	else if((small_cnts==SMALL_LENGTH-1)&&(big_cnts<BIG_LENGTH-1))//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,自动停止
	begin
	small_cnts<=8'd0;		
	end
	
	else if(big_cnts<=BIG_LENGTH-1)//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,结束循环,保持循环达不到的最大值
	begin
	small_cnts<=small_cnts +1'b1;			
	end
	
	else
	begin
	small_cnts<=small_cnts;		
	end
end

always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	small_pulse_start<=1'b0;
	end
	else if(start)//起始位置
	begin
	small_pulse_start<=1'b1;
	end
	
	else if((small_cnts==SMALL_LENGTH-1)&&(big_cnts<BIG_LENGTH-1))//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,自动停止
	begin
	small_pulse_start<=1'b1;	
	end
	
	else
	begin
	small_pulse_start<=1'b0;	
	end
end

always @ (posedge clk or posedge rst)//小计数器
begin
	if(rst)
	begin
	small_pulse_end <= 1'b0;
	end
	else if(start)//起始位置
	begin
	small_pulse_end <= 1'b0;
	end
	
	else if(small_cnts==SMALL_LENGTH-2)//所需长度减1,在这里面进行循环,当big_cnt大于该长度后,自动停止
	begin
	small_pulse_end <=8'd1;		
	end
	
	else
	begin
	small_pulse_end <= 1'b0;
	end
end

always @ (posedge clk or posedge rst)
begin
	if(rst)
	begin
	big_cnts<=16'hffff;
	end
	
	else if(start)//起始位置 
	begin
	big_cnts<=16'd0;	
	end
	
	else if(small_cnts==SMALL_LENGTH-1) 
	begin
	big_cnts<=big_cnts + 1'b1;		
	end
	
	else
	begin
	big_cnts<=big_cnts;			
	end
end

// pulse_end
always @ (posedge clk or posedge rst)
begin
	if(rst)
	begin
	pulse_end<=1'b0;
	end
	
	else if(start)//起始位置 
	begin
	pulse_end <= 1'b0;
	end
	
	else if((small_cnts==SMALL_LENGTH-1) && (big_cnts==BIG_LENGTH-1)) 
	begin
	pulse_end <= 1'b1;
	end
	
	else
	begin
	pulse_end <= 1'b0;
	end
end

endmodule


在这里插入图片描述

wire [15:0] forward_cnts,backward_cnts;
wire [15:0] big_cnts;
wire [7:0] small_cnts;
wire small_pulse_start,small_pulse_end;
wire pulse_end;

big_small_cnt
# ( .BIG_LENGTH(16'd8), 
    .SMALL_LENGTH(16'd3))
big_small_cnt(
    .clk                (clk),
    .rst                (rst),
    .start              (cnts == 8'd10),
    
    .forward_cnts       (forward_cnts),
    .backward_cnts      (backward_cnts),
    .big_cnts           (big_cnts),
    .small_cnts         (small_cnts),
    .small_pulse_start  (small_pulse_start),
    .small_pulse_end    (small_pulse_end),
    .pulse_end          (pulse_end)
);

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

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

相关文章

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快&#xff0c;五天假期说没就没&#xff0c;因为一些事情耽搁到现在&#xff0c;不过还是要继续学习的&#xff0c;之后就照常更新&#xff0c;先说一下&#xff0c;这个100题是菜鸟教程里面的&#xff0c;但是有一些题&#xff0c;我加入了自己的理解&#xff0c;甚…

odoo实施之创建行业demo

创建数据库&#xff0c;添加公司数据 选择应用&#xff0c;获取15天免费试用 创建完成 设置客户公司logo 创建用户 更改用户语言 前置条件&#xff1a;配置邮件 开发模式下&#xff0c;额外信息 加载demo数据

Conda下Richdem包遇到问题

Conda中Richdem包遇到问题 文章目录 Conda中Richdem包遇到问题问题一报错解决 问题二报错解决 参考 问题一 报错 RichDEM 是一套数字高程模型 &#xff08;DEM&#xff09; 水文分析工具&#xff0c;这次打算用richdem进行地形分析&#xff0c;尝试在conda里面安装richdem包的…

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

windows vscode设置扩展和缓存目录

vscode的扩展和缓存占了很大的空间&#xff0c;而且默认在C盘&#xff0c;很烦。。。 修改vscode快捷方式的目标处&#xff1a;"C:\Users\Nv9\AppData\Local\Programs\Microsoft VS Code\Code.exe" --extensions-dir "D:\Program Cache\VScode\extensions"…

sql注入练习

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一&#xff0c;它不是利用操作系统的BUG来实现攻击&#xff0c;而是针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号登录&#xff0c;甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

Spring Boot集成Swagger快速入门Demo

1.什么是Swagger&#xff1f; Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 主要作用&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作。&#xff08;实际开发中&#xff0c;接口文档的内容会不停的…

kafka学习笔记(三、生产者Producer使用及配置参数)

1.简介 1.1.producer介绍 生产者就是负责向kafka发送消息的应用程序。消息在通过send()方法发往broker的过程中&#xff0c;有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用后才能被真正的发往broker。 demo: public class Kafk…

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题&#xff0c;主要内容是&#xff1a;学习导入NTPClient库&#xff0c;通过这个库获取实时网络时间&#xff0c;显示在1.3寸TFT液晶屏幕上。此前三个专题&#xff0c;请选择查看以下链接。 第一专题内容&#xff0c;请参考 【N…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看&#xff08;非必须&#xff09; docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地&#xff0c;这样即使容器被删除&#xff0c;数据也不会丢失。 mkd…

牛客NC142 最长重复子串【中等 字符串 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc 思路 注意&#xff1a;题目给的时间复杂度是O(N^2)那么直接套用双重循环&#xff1a;外层循环i为假定起始重复子串的初始位置&#xff0c;内层循环的j为假定重复子串的结束位置…

每日一题5:Pandas-修改列

一、每日一题 一家公司决定增加员工的薪水。 编写一个解决方案&#xff0c;将每个员工的薪水乘以2来 修改 salary 列。 返回结果格式如下示例所示。 解答&#xff1a; import pandas as pddef modifySalaryColumn(employees: pd.DataFrame) -> pd.DataFrame:employees.loc[…

人工神经网络初步

大家好&#xff0c;这里是七七&#xff0c;由于各种比赛的缘故&#xff0c;使用了很多人工神经网络模型。但是很多的原理都不是很明白&#xff0c;就导致了不能灵活地运用┭┮﹏┭┮。为此&#xff0c;去看了些人工神经网络原理书&#xff0c;写下此专题。 在进入正文之前要先…

Delta lake with Java--数据增删改查

之前写的关于spark sql 操作delta lake表的&#xff0c;总觉得有点混乱&#xff0c;今天用Java结合真实的数据来进行一次数据的CRUD操作&#xff0c;所涉及的数据来源于Delta lake up and running配套的 GitGitHub - benniehaelen/delta-lake-up-and-running: Companion reposi…

Mac idea gradle解决异常: SSL peer shut down incorrectly

系统&#xff1a;mac 软件&#xff1a;idea 解决异常: SSL peer shut down incorrectly 查看有没有安装 gradle -v安装 根据项目gradle提示安装版本 brew install gradle7idea的配置 在settings搜索gradle&#xff0c;配置Local installation&#xff0c;选择自己的安装目录…

Unity Shader中获取像素点深度信息

1.顶点着色器中对深度进行计算 v2f vert(appdata v) {v2f o;o.pos UnityObjectToClipPos(v.vertex);o.uv TRANSFORM_TEX(v.uv, _MainTex);o.depth (o.pos.z / o.pos.w 1.0) * 0.5; // Normalize depth to [0, 1]return o; }但是达不到预期&#xff0c;最后返回的值一直大于…

连通“数据”,让制造变“聪明”

说起数据智能&#xff0c;你第一时间想到的是什么呢&#xff1f;是科技感十足的智慧城市&#xff1f;还是炫酷的人工智能景象&#xff1f; 数据作为企业的战略资产越来越受到重视&#xff0c;从最初的数据协助业务协同&#xff0c;转化为数据驱动业务&#xff0c;数据驱动运营…

Hive两代命令行客户端(Hive、Beeline)

Hive命令行客户端 Hive有两个主要的客户端工具&#xff0c;分别是旧版的Hive CLI&#xff08;Command Line Interface&#xff09;和新版的Beeline。 Hive CLI&#xff1a; Hive CLI 是 Hive 最早期的命令行客户端工具&#xff0c;它使用 JDBC 连接到 Hive 服务器&#xff0c;…

栈的2道面试题【有效的括号】【用栈实现队列】

栈的面试题&#xff1a; 1.有效的括号 题目&#xff1a; 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合…