引言

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

10,简易同步fifo

module simple_syn_fifo
#(
parameter WIDTH = 32,
parameter DEPTH = 4,
parameter PTR_WIDTH = 2
)
(
input clk,
input rst_n,input ren,
input wen,
input [WIDTH-1:0] din,output full,
output empty,
output valid,
output [WIDTH-1:0] dout
);reg [WIDTH-1:0] mem_r[0:DEPTH-1];reg [PTR_WIDTH-1:0] rptr_r;
reg [PTR_WIDTH-1:0] wptr_r;
reg [PTR_WIDTH:0] flag_r;always @(posedge clk)if(wen)mem_r[wptr_r] <= din;always @(posedge clk)if(~rst_n)wptr_r <= (PTR_WIDTH-1)'d0;else if(wen)wptr_r <= wptr_r + 1'b1;always @(posedge clk)if(~rst_n)rptr_r <= (PTR_WIDTH-1)'d0;else if(wen)rptr_r <= rptr_r + 1'b1;always @(posedge clk)if(~rst_n)flag_r <= PTR_WIDTH'd0;else if(wen & ~ren)flag_r <= flag_r + 1'b1;else if(~wen & ren)flag_r <= flag_r - 1'b1;assign dout = mem_r[rptr_r];
assign full = (flag_r >= DEPTH);
assign empty = (flag_r == PTR_WIDTH'd0);
assign valid = ren;endmodule

数字集成电路设计-13-常用模块集锦相关推荐

  1. VerilogHDL(1)数字集成电路设计方法概述

    一.数字集成电路设计方法概述 2.什么是硬件描述语言,其主要的作用是什么? 硬件描述语言是一种用形式化方式来描述数字电路和系统的语言. 它的主要作用是:数字电路系统的设计者利用这种语言可以从上层到下层 ...

  2. 数字集成电路设计中------各种工程师职责

    数字集成电路设计实现流程是个相当漫长的过程,拿手机基带芯片为例,对于3G, 4G, 5G, 工程师最初见到的是无数页的协议文档. 架构师要根据协议来确定:协议的哪些部分可以用软件实现,哪些部分需要用硬 ...

  3. 数字集成电路设计简介及设计方法

    简介 数字集成电路(Digital Integrated Circuits,DIC)是一种能够处理数字信号的电路.它由多个数字逻辑电路元件组成,包括逻辑门.寄存器.计数器.加法器.乘法器等.数字集成电 ...

  4. 数字集成电路设计(一、Verilog HDL数字集成电路设计方法概述)

    文章目录 集成电路发展 HDL产生 HDL分类 Verilog HDL的发展 Verilog HDL与VHDL Verilog HDL在数字集成电路设计中的优点 组合逻辑电路原理图设计和Verilog ...

  5. 数字集成电路设计的流程1

    数字集成电路设计的流程 芯片验证属于前端 每个阶段的工作 使用的EDA工具,Linux系统(lincense) 三家软件公司,Mentor(questasim).Synopsys(VCS).Caden ...

  6. Python常用模块集锦

    常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...

  7. 【笔记】 数字集成电路设计(一)

    [笔记] 数字集成电路设计 书籍:<数字集成电路--电路.系统与设计>(第二版) 第一章 引论 1. 数字设计中需解决的问题 摩尔定律 技术突破才能推动摩尔定律 特征尺寸 28nm是传统制 ...

  8. 入门数字集成电路设计系列(一)——Modelsim安装及破解过程记录

    入门数字集成电路设计系列(一) #Modelsim破解教程(记录) Modelsim是由 Mentor Graphics 公司开发的软件,它是世界最优秀的Verilog HDL语言仿真工具,是FPGA ...

  9. 数字集成电路设计入门书籍

    本文介绍的是有关数字集成电路的基础入门书籍,涵盖全流程,主要是外文书. 基础概念书籍 <数字集成电路设计基础>(Fundamentals of Digital Logic Design): ...

最新文章

  1. python-----利用filecmp删除重复文件
  2. oracle将一个表中字段的值赋值到另一个表中字段(批量)
  3. 包python_Python 包:
  4. python爬取图片源码_python抓取百度图片源码
  5. 谈谈如何使用Netty开发实现高性能的RPC服务器
  6. 算法实践--最小生成树(Kruskal算法)
  7. Java中从String到Long的转换
  8. match和exec
  9. 修改Eclipse的WorkSpace保持数[转载]
  10. Python 求解斐波那切(三种方法)
  11. log4j教程 11、日志记录到文件
  12. Browser-Solidity的本地安装及使用介绍
  13. Android开发之摇一摇
  14. python爬京东优惠券_京东抽奖爬虫LiteVersion
  15. jquery日期控件使用,起止时间
  16. 项目源码+付费进群系统分享
  17. 第九章SpringBoot整合Spring Data JPA
  18. mysql timestamp格式化_mysql TIMESTAMP(时间戳)详解
  19. 红米手机里突然出现android,红米手机有隐藏应用的功能吗?
  20. 新人如何从零开始学习Linux?

热门文章

  1. BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜
  2. docerfile 文件
  3. OpenCV 32F 与 8U Mat数据类型相互转换(C++版)
  4. Java基础系列19:使用JXL或者POI生成和解析Excel文件
  5. 关于栈迁移的那些事儿
  6. 对于路缘石滑模机使用的工地综合管理
  7. 百度快照被劫持跳转到博彩网站 终极解决办法
  8. 2019年苹果iOS App上架详细图文教程
  9. c语言枚举法课程设计报告,枚举法的程序实现及优化
  10. 重装Windows修复Ubuntu启动