数字集成电路设计-13-常用模块集锦

引言

C语言,C++语言等软件编程语言吸引我们的一个很重要的原因是他们都能提供非常丰富的函数库供我们使用,大大提高coding的效率。

但是像verilogHDL等HDL语言这方面做的比较弱,尤其是可综合的语法,基本没有通用的模块库供我们使用,所以编码效率会比较低。如果我们把平时经常使用的一些模块积累起来,慢慢的标准化,这样以后我们再设计新的电路时,就会方便很多,今天就是开始。

1,判断两个信号是否相等

function Fcompare;
	input valid_a,valid_b;
	input [31:0] a,b;

	Fcompare = valid_a & valid_b & (({32{valid_a}} & a) == ({32{valid_b}} & b));

endfunction

2,对一个one-hot的值,得到是对应bit的十进制数

function [2:0] Fcode_8b;
	input [7:0] one_hot;

	Fcode_8b =( one_hot[0] ? 3‘d0 :
				one_hot[1] ? 3‘d1 :
				one_hot[2] ? 3‘d2 :
				one_hot[3] ? 3‘d3 :
				one_hot[4] ? 3‘d4 :
				one_hot[5] ? 3‘d5 :
				one_hot[6] ? 3‘d6 :
				one_hot[7] ? 3‘d7 : 3‘d0;
				);

endfunction

3,上面函数的反向功能

function [7:0] Fdecode_8b;
	input [2:0] value;

	Fdecode_8b =( value==3‘d7,value==3‘d6,value==3‘d5,value==3‘d4,value==3‘d3,value==3‘d2,value==3‘d1,value==3‘d0 );

endfunction

4,clock gage

在实际的电路设计中,低功耗(low-power)是我们必须时刻都需要谨记在心的一条法则,这条法则的具体实现中最重要的就是clock gage了。

但是一般情况下DC会提供专门的gating cell,在做仿真时,我们还是需要一个简单的模型。

module clk_gate
(
input enable,
input clk,
output clk_o
);

reg not_gate;

always @(enable or clk)
	if(~clk)
		not_gate = enable;

assign clk_o = clk & not_gate;

endmodule

5,获得信号的上升沿

module sig_posedge
(
input clk,
input signal,

output signal_posedge
);

	reg tmp_r;

	always @(posedge clk)
		tmp_r <= signal;

	assign signal_posedge = signal & ~tmp_r;

endmodule

6,获得信号的下降沿

module sig_negedge
(
input clk,
input signal,

output signal_negedge
);

	reg tmp_r;

	always @(posedge clk)
		tmp_r <= signal;

	assign signal_negedge = ~signal & tmp_r;

endmodule

7,round-robin arbiter(2选1)

function [1:0] Fround_robin_2;
	input [1:0] req,req_en,grant_en;
	input priority_in;

	reg rq_a,rq_b,grant_a,grant_b,prio_a,prio_b;

	begin
		{rq_a,rq_b} = req;
		{prio_b,prio_a} = {priority_in==1‘b1,priority_in==1‘b0};

		grant_a = ( prio_a & rq_a |
					prio_b & rq_a & ~rq_b);

		grant_b = ( prio_b & rq_b |
					prio_a & rq_b & ~rq_a);

		Fround_robin_2 = {grant_b,grant_a} & req_en & grant_en;
	end
endfunction

8,round-robin arbiter(4选1)

function [3:0] Fround_robin_4;
	input [3:0] req,req_en,grant_en;
	input [1:0] priority_in;

	reg rq_a,rq_b,rq_c,rq_d;
	reg grant_a,grant_b,grant_c,grant_d;
	reg prio_a,prio_b,prio_c,prio_d;

	begin
		{rq_d,rq_c,rq_b,rq_a} = req;
		{prio_d,prio_c,prio_b,prio_a} = {priority_in==2‘b11,priority_in==2‘b10,priority_in==2‘b01,priority_in==2‘b00};

		grant_a = ( prio_a & rq_a |
					prio_b & rq_a & ~rq_b & ~rq_c & ~rq_d |
					prio_c & rq_a & ~rq_c & ~rq_d |
					prio_d & rq_a & ~rq_d);

		grant_b = ( prio_b & rq_b |
					prio_c & rq_b & ~rq_c & ~rq_d & ~rq_a |
					prio_d & rq_b & ~rq_d & ~rq_a |
					prio_a & rq_b & ~rq_a);

		grant_c = ( prio_c & rq_c |
					prio_d & rq_c & ~rq_d & ~rq_a & ~rq_b |
					prio_a & rq_c & ~rq_a & ~rq_b |
					prio_b & rq_c & ~rq_b);

		grant_d = ( prio_d & rq_d |
					prio_a & rq_d & ~rq_a & ~rq_b & ~rq_c |
					prio_b & rq_d & ~rq_b & ~rq_c |
					prio_c & rq_d & ~rq_c);

		Fround_robin_4 = {grant_d,grant_c,grant_b,grant_a} & req_en & grant_en;
	end
endfunction

9,round-robin arbiter(8选1)

function [7:0] Fround_robin_8;
	input [7:0] req,req_en,grant_en;
	input [2:0] priority_in;

	reg rq_a,rq_b,rq_c,rq_d,rq_e,rq_f,rq_g,rq_h;
	reg grant_a,grant_b,grant_c,grant_d,grant_e,grant_f,grant_g,grant_h;
	reg prio_a,prio_b,prio_c,prio_d,prio_e,prio_f,prio_g,prio_h;

	begin
		{rq_h,rq_g,rq_f,rq_e,rq_d,rq_c,rq_b,rq_a} = req;
		{prio_h,prio_g,prio_f,prio_e,prio_d,prio_c,prio_b,prio_a} = {priority_in==3‘b111,priority_in==3‘b110,priority_in==3‘b101,priority_in==3‘b100,priority_in==3‘b011,priority_in==3‘b010,priority_in==3‘b001,priority_in==3‘b000};

		grant_a = ( rq_a &
						(prio_a
						|prio_b & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h
						|prio_c & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h
						|prio_d & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h
						|prio_e & ~rq_e & ~rq_f & ~rq_g & ~rq_h
						|prio_f & ~rq_f & ~rq_g & ~rq_h
						|prio_g & ~rq_g & ~rq_h
						|prio_h & ~rq_h);

		grant_b = ( rq_b &
						(prio_b
						|prio_c & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a
						|prio_d & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a
						|prio_e & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a
						|prio_f & ~rq_f & ~rq_g & ~rq_h & ~rq_a
						|prio_g & ~rq_g & ~rq_h & ~rq_a
						|prio_h & ~rq_h & ~rq_a
						|prio_a & ~rq_a);

		grant_c = ( rq_c &
						(prio_c
						|prio_d & ~rq_d & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b
						|prio_e & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b
						|prio_f & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b
						|prio_g & ~rq_g & ~rq_h & ~rq_a & ~rq_b
						|prio_h & ~rq_h & ~rq_a & ~rq_b
						|prio_a & ~rq_a & ~rq_b
						|prio_b & ~rq_b);

		grant_d = ( rq_d &
						(prio_d
						|prio_e & ~rq_e & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c
						|prio_f & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c
						|prio_g & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c
						|prio_h & ~rq_h & ~rq_a & ~rq_b & ~rq_c
						|prio_a & ~rq_a & ~rq_b & ~rq_c
						|prio_b & ~rq_b & ~rq_c
						|prio_c & ~rq_c);	

		grant_e = ( rq_e &
						(prio_e
						|prio_f & ~rq_f & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d
						|prio_g & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d
						|prio_h & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d
						|prio_a & ~rq_a & ~rq_b & ~rq_c & ~rq_d
						|prio_b & ~rq_b & ~rq_c & ~rq_d
						|prio_c & ~rq_c & ~rq_d
						|prio_d & ~rq_d);	

		grant_f = ( rq_f &
						(prio_f
						|prio_g & ~rq_g & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e
						|prio_h & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e
						|prio_a & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e
						|prio_b & ~rq_b & ~rq_c & ~rq_d & ~rq_e
						|prio_c & ~rq_c & ~rq_d & ~rq_e
						|prio_d & ~rq_d & ~rq_e
						|prio_e & ~rq_e);

		grant_g = ( rq_g &
						(prio_g
						|prio_h & ~rq_h & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f
						|prio_a & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f
						|prio_b & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f
						|prio_c & ~rq_c & ~rq_d & ~rq_e & ~rq_f
						|prio_d & ~rq_d & ~rq_e & ~rq_f
						|prio_e & ~rq_e & ~rq_f
						|prio_f & ~rq_f);

		grant_h = ( rq_h &
						(prio_h
						|prio_a & ~rq_a & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g
						|prio_b & ~rq_b & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g
						|prio_c & ~rq_c & ~rq_d & ~rq_e & ~rq_f & ~rq_g
						|prio_d & ~rq_d & ~rq_e & ~rq_f & ~rq_g
						|prio_e & ~rq_e & ~rq_f & ~rq_g
						|prio_f & ~rq_f & ~rq_g
						|prio_g & ~rq_g);
		Fround_robin_8 = {grant_h,grant_g,grant_f,grant_e,grant_d,grant_c,grant_b,grant_a} & req_en & grant_en;
	end
endfunction
时间: 2024-10-27 17:20:43

数字集成电路设计-13-常用模块集锦的相关文章

数字集成电路设计-20-multi-cycle

引言 前面我们介绍了流水线的写法(http://blog.csdn.net/rill_zhen/article/details/45980039),流水线是数字设计中很常用的一种设计方法,可以提高运行频率,提高吞吐量. 如果组合逻辑延迟较大,一个时钟周期完成不了时,除了插入寄存器将组合逻辑拆分成流水线外,还可以采用multi-cycle的方式. multi-cycle的工作机制很简单,从给定输入之后,等待多个周期之后,再去采样输出结果. 本小节我们将通过一个小实验来说明multi-cycle的具

数字集成电路设计-12-状态机的四种写法

引言 在实际的数字电路设计中,状态机是最常用的逻辑,而且往往是全部逻辑的核心部分,所以状态机的质量,会在比较大的程度上影响整个电路的质量. 本小节我们通过一个简单的例子(三进制脉动计数器)来说明一下状态机的4中写法. 1,模块功能 由于我们的目的在于说明状态机的写作方式,所以其逻辑越简单有利于理解.就是一个简单的脉动计数器,每个三个使能信号输出一个标示信号. 2,一段式 状态机的写法,一般有四种,即一段式,两段式,三段式,四段式.对于一段式的写法,整个状态机的状态转移.转移条件.对应状态的输出都

Python学习之路13?常用模块

一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. 格式化的时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时) 1 import time 2 #

数字集成电路设计-16-关于AXI协议

引言 AXI协议有可能是我们平时电路设计时经常遇到的一个协议,也是一个不错的协议,本小节我们就来熟悉一下. 乍一看,AXI协议的信号众多,眼花缭乱,容易发蒙.但其实其基本思想很简单.只要掌握以下几点: 1,valid/ready协议 axi协议是典型的基于valid/ready协议的总线协议.valid/ready协议的优势就是master和slave的相对独立性比较好.对于一次传输,作为master的发起方不用检查salve是否准备好,就可以将传输内容放到总线上:同样对于接收方的slave来说

数字集成电路设计经验技巧分享

废话不多说,直接贴出电路及电路设计经验技巧大合集84个资料的文件列表,太多了,只显示一部分吧,有需要的朋友可以到闯客网技术论坛下载,同时可以加入我们的技术交流裙:613377058,无偿共享,在线解答各种技术问题.资料链接:https://bbs.usoftchina.com/thread-206874-1-1.html 文件列表:BUCKBOOST电路原理分析.docxCAN总线接口电路设计注意事项.docxDC-DC升压电路.docxFPGACPLD数字电路设计经验分享.docxMIC电路工

数字集成电路设计-19-pipeline的写法

引言 之前,我们介绍了数字设计中一些基本组合逻辑的写法(http://blog.csdn.net/rill_zhen/article/details/39586191)以及状态机的写法(http://blog.csdn.net/rill_zhen/article/details/39585367),本小节我们通过一个小实验来熟悉一下pipeline的写法. 在多数的资料和教课书中提到pipeline时,大多只是解释概念,很少介绍其具体RTL实现的,给人一种高达上的感觉.有的资料中会提到具体写法,

数字集成电路设计-18-UVM

引言 UVM(Universal Verification Methodology)可以理解为形而上的东西,可以理解为是基于System verilog的一个库,提供一些API调用. 其实没必要把UVM抬的那么高,上升到形而上的层次.因为在实际的IC验证时,对某个复杂DUT的验证时,一般都会拆分成那几个模块. 要对DUT测试,肯定需要先产生测试用例,就是UVM中的sequencer和sequence概念. 产生测试用例之后,肯定需要把测试用例送到DUT端口上,作为激励,就是UVM中的driver

PHP盛宴——常用函数集锦

最近写了蛮多PHP,也接触到挺多常用的函数,大多都记了笔记,发个博客出来,共同学习.其实感觉学习一门语言,语法逻辑是软素质,而对语言的熟悉程度只能随着使用时间的增长而慢慢增长,当对一门语言的函数.库.特性都深深了解了,才能勉强称得上是熟练或者精通吧. 1. trim(),从字符串两端删除空白字符和其他预定义字符,当然可以删除指定的字符. 类似的还有ltrim().rtrim(). 2. __CLASS__,该常量返回该类被定义时的名字. 3. strtotime(),将任何英文文本的日期时间描述

python 学习笔记 13 -- 常用的时间模块之time

Python 没有包含对应日期和时间的内置类型,不过提供了3个相应的模块,可以采用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包含一些函数用于获取时钟时间和处理器的运行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口.datetime 中的类支持算术.比较和时区配置. *    calendar 模块可以创建周.月和年的格式化表示.它还可以用来计算重复事件.给定日期是星期几,以及其他基