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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从dos上传shell脚本文件到Linux、麒麟执行报错“/bin/bash^M:解释器错误:没有那个文件或目录”

[rootkylin tmp]#./online_update_wars-1.3.0.sh ba51:./online_update_wars-1.3.0.sh:/bin/bash^M:解释器错误:没有那个文件或目录 使用scp命令上传文件到麒麟系统&#xff0c;执行shell脚本时报错 “/bin/bash^M:解释器错误:没有那个文件或目录” 解决方法&#xff1a; 执行…

几何合理的分片段感知的3D分子生成 FragGen - 评测

FragGen 来源于 2024 年 3 月 25 日 预印本的文章&#xff0c;文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation&#xff0c; 作者是 Odin Zhang&#xff0c;侯廷军&#xff0c;浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多&#xff0c;不仅如此&#xff0c;代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作&#xff0c;少写几个for循环&#xff08;&#xff09;。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…

Spring纯注解开发

在我的另一篇文章中&#xff08;初识Spring-CSDN博客&#xff09;&#xff0c;讲述了Bean&#xff0c;以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候&#xff0c;可以直接在类的上面标明“注解”&#xff0c;以此来声明类。 1. 常…

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤&#xff1a; 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 &#xff0c;用于制作U盘启动 下载一个引导程序制作工具&#xff0c;我使用…

PyCharm2024.2.4安装

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

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下&#xff0c;防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所&#xff0c;例如医院、学校、公共交通工具等地&#xff0c;口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…

STM32保护内部FLASH

在实际发布的产品中&#xff0c;在STM32芯片的内部FLASH存储了控制程序&#xff0c;如果不作任何保护措施的话&#xff0c;可以使用下载器直接把内部FLASH的内容读取回来&#xff0c;得到bin或hex文件格式的代码拷贝&#xff0c;别有用心的厂商即可利用该代码文件山寨产品。为此…

前端 - 使用uniapp+vue搭建前端项目(app端)

文章目录 前提概要项目搭建1、打开HBuilder工具&#xff0c;选择文件->新建->项目2、下载依赖&#xff0c;需要先手动创建package.json文件&#xff0c;在自定义文件的最外层3、创建文件夹4、创建忽略文件 .gitignore5、创建vue.config.js文件 &#xff0c;解决跨域问题&…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…

飞创直线电机模组 VS 传统丝杆模组:谁是自动化传动领域的王者?

在现代自动化技术领域&#xff0c;直线电机模组与传统丝杆模组作为两种常见的传动方式&#xff0c;各自有独特的特点和优势。然而&#xff0c;随着科学的不断进步和应用需求的日益提高&#xff0c;两者在精度、速度、寿命及可拓展性方面的差异愈发显著。本文将重点对比飞创直线…

第二十一周学习周报

目录 摘要Abstract1. LSTM原理2. LSTM反向传播的数学推导3. LSTM模型训练实战总结 摘要 本周的学习内容是对LSTM相关内容的复习&#xff0c;LSTM被设计用来解决标准RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制来控制信息的流动&#xff0c;从而…

《鸿蒙生态:开发者的机遇与挑战》

一、引言 在当今科技飞速发展的时代&#xff0c;操作系统作为连接硬件与软件的核心枢纽&#xff0c;其重要性不言而喻。鸿蒙系统的出现&#xff0c;为开发者带来了新的机遇与挑战。本文将从开发者的角度出发&#xff0c;阐述对鸿蒙生态的认知和了解&#xff0c;分析鸿蒙生态的…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了快速的搜索能力&#xff0c;支持大规模的数据分析&#xff0c;广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建&#xff0c;也就…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后&#xff0c;app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

Visual Studio 2022 安装

下载链接 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&channelRelease&versionVS2022&sourceVSLandingPage&cid2030&passivefalse 安装 以c为例&#xff0c;列出需要勾选的项目&#xff0c;有3个&a…

文件 fd

&#x1f3f7;️ 预备工作 ❓ 当我们在系统中创建一个空文件时&#xff0c;这个文件要不要占据磁盘的空间&#xff08;注意是空文件哟&#xff09; 答案&#xff1a;当然是要占据磁盘的空间的&#xff0c;文件不仅只包括内容&#xff0c;还有它的属性呀&#xff0c;就是创建时…

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…