【IC每日一题:IC常用模块--RR/handshake/gray2bin】

news2024/11/18 20:35:36

IC每日一题:IC常用模块--RR/handshake/gray2bin

  • 1 RR仲裁器
  • 2 异步握手信号处理
  • 3 格雷码和二进制相互转换

1 RR仲裁器

应用:在多个FIFO请求pop时存在仲裁策略,还有比如多master申请总线控制权的仲裁等这些应用场合;假如当前是最高优先级,下一次就是最低优先级;
RR_arbiter是公平性的仲裁器,基于顺序轮转优先级,最高优先级是循环的;


module rr_arbiter
(
input clk,
input rst_n,
input [3:0]req,
input req_en,
output[3:0]grant_arb
);
reg [3:0] state_c_arb;
reg [3:0] state_n_arb;
always @(posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		state_c_arb<=0;
	end
	else if(req_en)begin
		state_c_arb<=state_n_arb;
	end
	else begin
		state_c_arb<=0;
	end
end
 
always @(*) begin
	if (!rst_n) begin
		state_n_arb<=0;
	end
	else begin
		case(state_c_arb)
			4'b0001:begin
						case(1'b1)
							req[1]:state_n_arb<=4'b0010;
							req[2]:state_n_arb<=4'b0100;
							req[3]:state_n_arb<=4'b1000;
							req[0]:state_n_arb<=4'b0001;
							default:state_n_arb<=4'b0001;
						endcase
						end
			4'b0010:begin
						case(1'b1)
							req[2]:state_n_arb<=4'b0100;
							req[3]:state_n_arb<=4'b1000;
							req[0]:state_n_arb<=4'b0001;
							req[1]:state_n_arb<=4'b0010;
							default:state_n_arb<=4'b0010;
						endcase
						end
			4'b0100:begin
						case(1'b1)
							req[3]:state_n_arb<=4'b1000;
							req[0]:state_n_arb<=4'b0001;
							req[1]:state_n_arb<=4'b0010;
							req[2]:state_n_arb<=4'b0100;
							default:state_n_arb<=4'b0100;
						endcase
						end
			4'b1000:begin
						case(1'b1)
							req[0]:state_n_arb<=4'b0001;
							req[1]:state_n_arb<=4'b0010;
							req[2]:state_n_arb<=4'b0100;
							req[3]:state_n_arb<=4'b1000;
							default:state_n_arb<=4'b1000;
						endcase
						end
			default:state_n_arb<=4'b0001;
			endcase
	end
end
assign 	grant_arb=state_n_arb;

endmodule

2 异步握手信号处理

题目时序图如下:

在这里插入图片描述

//==========================================================
//--Author  : colonel
//--Date    : 11-14
//--Module  : asy_handshake_data
//--Function: use handshake to asy the data
//==========================================================
module asy_handshake_data(
    input tclk,
    input t_rstn,
    input rclk,
    input r_rstn,
    input [4:0] data_in,

    output [4:0] data_out
);

//==========================< 信号 >=========================
wire ack;
wire req;
reg [4:0] data_reg;

//==========================< instance >====================
tx u_tx(
    .tclk(tclk),
    .t_rstn(t_rstn),
    .i_ack(ack),
    .i_data_in(data_in),
    .o_req(req),
    .o_tx_data(data_reg)
);

rx u_rx(
    .rclk(rclk),
    .r_rstn(r_rstn),
    .i_req(req),
    .i_data_in(data_reg),
    .o_ack(ack),
    .o_rx_data(data_out)
);

endmodule

//=============================tx_module=====================
module tx (
    input tclk,
    input t_rstn,
    input i_ack,
    input [4:0] i_data_in,
    output reg o_req,
    output reg[4:0] o_tx_data
);

//==========================< 信号 >=========================
reg des_sync_src_ack_1;
reg des_sync_src_ack_2;

always @(posedge tclk or negedge t_rstn) begin
    if (!t_rstn) begin
        des_sync_src_ack_1 <= 1'b0;
        des_sync_src_ack_2 <= 1'b0;
    end else begin
        des_sync_src_ack_1 <= i_ack;
        des_sync_src_ack_2 <= des_sync_src_ack_1;
    end
end

wire des_sync_src_neg = !des_sync_src_ack_1 & des_sync_src_ack_2;

always @(posedge tclk or negedge t_rstn) begin
    if (!t_rstn) begin
        o_tx_data <= 'b0;
    end else if (des_sync_src_neg) begin
        o_tx_data <= i_data_in;
    end
end

//=============================
//--o_req
//=============================
always @(posedge tclk or negedge t_rstn) begin
    if (!t_rstn) begin
        o_req <= 1'b0;
    end else if (des_sync_src_ack_2) begin
        o_req <= 1'b0;
    end else begin
        o_req <= 1'b1;
    end
end

endmodule

//==============================rx module===========
module rx(
    input rclk,
    input r_rstn,
    input i_req,
    input [4:0] i_data_in,
    output reg o_ack,
    output reg [4:0] o_rx_data
);
//==========================< 信号 >=========================
reg src_sync_des_req_1;
reg src_sync_des_req_2;

always @(posedge rclk or r_rstn) begin
    if (!r_rstn) begin
        src_sync_des_req_1 <= 1'b0;
        src_sync_des_req_2 <= 1'b0;
    end else begin
        src_sync_des_req_1 <= i_req;
        src_sync_des_req_2 <= src_sync_des_req_1;
    end
end

always @(posedge rclk or negedge r_rstn) begin
    if (!r_rstn) begin
        o_ack <= 1'b0;
    end else begin
        o_ack <= src_sync_des_req_2;
    end
end

always @(posedge rclk or negedge r_rstn) begin
    if (!r_rstn) begin
        o_rx_data <= 'b0;
    end else if (src_sync_des_req_2) begin
        o_rx_data <= i_data_in;
    end else begin
        o_rx_data <= o_rx_data;
    end
end
    
endmodule

3 格雷码和二进制相互转换

二进制码转换为格雷码: 从最右边一位开始,依次将每一位与它左边的一位进行异或操作(XOR),得到的结果就是格雷码。
格雷码转换为二进制码:从最右边一位开始,依次将每一位与它左边的一位进行异或操作,但是需要注意的是,每次异或操作的结果需要与左边的原始位进行比较,如果不同,则将结果取反

module gray_trans#(
    parameter SIZE=8
)(
    input [SIZE-1] bin,
    output[SIZE-1] gray,
);
    assign gray=bin^{1'b0,bin[SIZE-1:1]};
endmodule

module gray_trans#(
    parameter SIZE=8
)(
    input [SIZE-1:0] gray,
    output[SIZE-1]:0 bin
);
    assign bin[SIZE-1]=gray[SIZE-1];

    genvar i;
    generate
        for (i=SIZE-2;i>0;i=i-1)
        begin:trans
            assign bin[i]=gray[i]^bin[i+1];
        end
    endgenerate
endmodule

【REF】
1.https://blog.csdn.net/yueqiu693/article/details/125073144

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

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

相关文章

2024 - 超火的多模态深度学习公共数据纯生信5+思路分享

超火的多模态深度学习公共数据纯生信5思路分享 多模态深度学习具有处理和整合多种类型信息的优势&#xff0c;特别是在预测患者预后方面能够结合不同类型的生物医学数据&#xff0c;如临床数据、基因表达数据、蛋白质组学数据、成像数据等&#xff0c;进而提高预后预测的准确性…

抽象java入门1.5.3.1——类的进阶

前言&#xff1a;在研究神技代码Hello word的时候&#xff0c;发现了一个重大公式bug&#xff0c;在代码溯源中&#xff0c;我发现了一个奇怪的东西&#xff0c;就是OUT不是类中类&#xff08;不是常规类的写法&#xff09; 内容总结&#xff1a; 代码运行的顺序复习 正片开始…

k8clone二进制工具迁移k8s中的无状态应用

1 概述 k8clone是一个简便的Kubernetes元数据克隆工具&#xff0c;它可以将Kubernetes元数据&#xff08;对象&#xff09;保存为本地压缩包&#xff0c;在恢复时可将这些元数据恢复到目标集群中&#xff08;已存在的资源不会被覆盖&#xff09;。它不依赖远程存储&#xff0c…

HelloMeme 上手即用教程

HelloMeme是一个集成空间编织注意力的扩散模型&#xff0c;用于生成高保真图像和视频。它提供了一个代码库&#xff0c;包含实验代码和预训练模型&#xff0c;支持PyTorch和FFmpeg。用户可以通过简单的命令行操作来生成图像和视频。 本文将详细介绍&#xff0c;如何在GPU算力租…

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type

3步实现贪吃蛇

方法很简单&#xff0c;打开页面&#xff0c;复制&#xff0c;粘贴 一.整体思维架构 我们根据游戏的开始&#xff0c;运行&#xff0c;结束&#xff0c;将整个游戏划分成三个部分。在每个部分下面又划分出多个功能&#xff0c;接下来我们就根据模块一一实现功能。 二.Gamesta…

使用 Go 实现将任何网页转化为 PDF

在许多应用场景中&#xff0c;可能需要将网页内容转化为 PDF 格式&#xff0c;比如保存网页内容、生成报告、或者创建网站截图。使用 Go 编程语言&#xff0c;结合一些现有的库&#xff0c;可以非常方便地实现这一功能。本文将带你一步一步地介绍如何使用 Go 语言将任何网页转换…

.NET 9.0 中 System.Text.Json 的全面使用指南

以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式&#xff0c;包括序列化、反序列化、配置选项等&#xff0c;并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为&#xff1a;geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下&#xff1a; {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO&#xff1a;SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目&#xff1a;分发糖果 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后&#xff0c;下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后&#xff0c;打开点击右键&#xff…

【MySQL】MySQL数据库入门:构建你的数据基石

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f985;数据库基础&#x1f400;什么是数据库&#x1f40f;主流数据库&#x1f986;MySQL数据库的基本…

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中&#xff0c;我们将展示如何使用 Python 和 pyecharts 库&#xff0c;通过对招聘数据的分析&#xff0c;制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表&#xff08;如柱状图、饼图、词云图等&#xff09;展示招聘行业、职位要求、薪资分布等信息。 …

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目&#xff0c;它们犹如璀璨星辰&#xff0c;用各自的故事和成就&#xff0c;为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者&#xff0c;共同撰写并分享项目在GitCode平台上托管的体验&#xff0c;挖掘平…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

Android Framework AMS(16)进程管理

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…