找回密码
 注册
关于网站域名变更的通知
查看: 198|回复: 1
打印 上一主题 下一主题

常用数字集成电路设计模块集锦分享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-7-9 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

7 I" z' E0 X) v" z7 f" d引言
) Q: @2 X- s% L( a1 u3 U, sC语言,C++语言等软件编程语言吸引我们的一个很重要的原因是他们都能提供非常丰富的函数库供我们使用,大大提高coding的效率。% C* i6 g, m* \7 Q' ?

8 m  G8 Y7 A( u但是像verilogHDL等HDL语言这方面做的比较弱,尤其是可综合的语法,基本没有通用的模块库供我们使用,所以编码效率会比较低。如果我们把平时经常使用的一些模块积累起来,慢慢的标准化,这样以后我们再设计新的电路时,就会方便很多,今天就是开始。
" M: D- o/ j! ?+ f) G7 _2 V3 I0 m# d8 K" B4 k5 }# s9 s
1,判断两个信号是否相等
- s7 c, c9 a  v& `( i; k8 k
* y: N2 M: ^" C
  • function Fcompare;
  •         input valid_a,valid_b;
  •         input [31:0] a,b;

  • ' P$ r6 h- X6 ?) m
  •         Fcompare = valid_a & valid_b & (({32{valid_a}} & a) == ({32{valid_b}} & b));
  • ! d+ U' {3 N0 i4 j+ X5 g
  • endfunction
    ; J# E0 O/ P2 w4 d0 i4 j
  ' d* {% H+ W0 b! f) K5 N# J
% v8 y4 n( J; H; W# U1 f( l
2,对一个one-hot的值,得到是对应bit的十进制数, M4 [: S: I( Y8 p# e! I
+ {8 M7 V4 Z1 ]- {, [+ H8 l& W/ q
  • function [2:0] Fcode_8b;
  •         input [7:0] one_hot;

  • % @* S/ p0 q+ d
  •         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;
  •                                 );
  • ( K0 J8 g- m' L7 X  L; z
  • endfunction
    " n- q1 l. q$ B' }  ?9 y1 M
  
* _6 \4 ^. g5 }( V* c. U1 k* }9 w& f  l8 f/ ]/ g6 q! u" V& P
3,上面函数的反向功能. R9 u: s0 f: r) d; r) y

1 J3 {% x( G& A: @) `
  • function [7:0] Fdecode_8b;
  •         input [2:0] value;
  • , C; V; f7 k8 e1 {8 ?5 [! e4 c
  •         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 );
  • , r" g% L$ C$ L* G/ Y
  • endfunction$ E; Q2 e. b* ]  l( N
  
  V9 }9 J8 G$ Y6 b; n& K3 y1 H9 ]/ D' N
4,clock gage9 {8 s3 d! l4 N/ [
在实际的电路设计中,低功耗(low-power)是我们必须时刻都需要谨记在心的一条法则,这条法则的具体实现中最重要的就是clock gage了。
7 @$ J& E; r5 l
8 B! p9 U+ p3 [7 k但是一般情况下DC会提供专门的gating cell,在做仿真时,我们还是需要一个简单的模型。6 |# E! H* Z0 H
/ ]+ i- b+ p0 S4 R
  • module clk_gate
  • (
  • input enable,
  • input clk,
  • output clk_o
  • );

  • * G0 N" D% S2 Q- L. C
  • reg not_gate;
  • ' b6 M: V* g) a  [" p$ b1 k, e
  • always @(enable or clk)
  •         if(~clk)
  •                 not_gate = enable;
  • assign clk_o = clk & not_gate;
  • # C9 J4 w7 |9 g. r0 l+ R7 p
  • endmodule
    4 A1 b1 G% [; e
   0 E4 t- s8 [0 }4 @
* p$ A6 e6 k3 f0 E  {
5,获得信号的上升沿1 x$ S6 _6 I' u$ I4 n$ h9 |

& t! C2 k7 ]/ h1 N3 |
  • module sig_posedge
  • (
  • input clk,
  • input signal,

  • ) V$ @& A* w/ H# N& D6 c. [( w& e
  • output signal_posedge
  • );
  • 6 N2 Y  D5 k1 j
  •         reg tmp_r;
  • + c: }+ @  e2 C
  •         always @(posedge clk)
  •                 tmp_r <= signal;
  •         assign signal_posedge = signal & ~tmp_r;
  • ' |$ Z4 Z5 J, Y4 t
  • endmodule. P1 r" T) L3 n: E- F
   
: Z$ P- O: C# ~+ ?, E% M. |4 n* @1 \* z0 f( }
6,获得信号的下降沿6 T7 {% v+ W9 }& W

0 a4 Q3 k4 t4 d
  • module sig_negedge
  • (
  • input clk,
  • input signal,

  • $ R! _) N6 P2 \* k  g
  • output signal_negedge
  • );
  • 1 B0 L0 ?7 B5 I" j* o
  •         reg tmp_r;
  • & g  o3 F7 A8 c( f
  •         always @(posedge clk)
  •                 tmp_r <= signal;
  •         assign signal_negedge = ~signal & tmp_r;

  • 2 }2 f7 I4 d. R5 D# C
  • endmodule
    " R4 k7 p. O! f0 J9 M
   
5 y9 m; {$ X' @& r: f. M
6 g6 G2 e" q0 e  v+ }0 i7 X7,round-robin arbiter(2选1)
1 d8 _9 c# v. L4 e+ Y2 ]$ f* Y6 C  l
  • 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
  • endfunction1 Q$ S! `3 a7 ~

+ E# Q7 G9 T1 u+ R2 T1 M- n9 V5 [) C, i: x+ N
8,round-robin arbiter(4选1)
$ v0 F( I" r, O7 `! z6 l! N- [, C* U6 d
  • 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);

  • 8 A. h# C+ Z# n; ]9 R  s& E+ j
  •                 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);

  • 4 S3 W$ L8 g6 d; R7 O
  •                 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);
  • 8 ?4 k. d2 k( Y  N: G0 [0 N
  •                 Fround_robin_4 = {grant_d,grant_c,grant_b,grant_a} & req_en & grant_en;
  •         end
  • endfunction
    # I$ D2 I. T: R
   2 K* }- P! |; N# ]: p3 }

, ~3 }& u" @2 ]/ o- A  p9,round-robin arbiter(8选1)
* a; {5 w$ \) d) K' c. m4 m: a! s( s( c$ y7 S; {
  • 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);

  • " s5 c- w, V; Q, j
  •                 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);

  • 4 w4 b  S0 t" y. j$ E6 o
  •                 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);

  • , |3 ~) l, L; c( J+ u! c
  •                 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
    3 }2 ^( i  t& b. Z% g
   
. m, D5 B& B5 d; Z6 z6 T2 H
  h2 u/ n5 E6 \0 l0 S10,简易同步fifo0 o% u3 O9 ]- ~. K! W) g
' F& F+ [. A6 i5 c) d1 W
  • module simple_syn_fifo
  • #(
  • parameter WIDTH = 32,
  • parameter DEPTH = 4,
  • parameter PTR_WIDTH = 2
  • )
  • (
  • input clk,
  • input rst_n,

  • 6 P; Q; y  s8 H! C: a
  • input ren,
  • input wen,
  • input [WIDTH-1:0] din,
  • & T# k' Y2 n2 W/ T. S. }  F
  • output full,
  • output empty,
  • output valid,
  • output [WIDTH-1:0] dout
  • );
  • / V7 f5 f* ?  t" m& h6 N1 J
  • reg [WIDTH-1:0] mem_r[0:DEPTH-1];
  • : |! X$ k2 e$ s  y" u, b
  • reg [PTR_WIDTH-1:0] rptr_r;
  • reg [PTR_WIDTH-1:0] wptr_r;
  • reg [PTR_WIDTH:0] flag_r;

  • ' I$ r; _4 R& G
  • always @(posedge clk)
  •         if(wen)
  •                 mem_r[wptr_r] <= din;

  • , U& D  X1 X: `6 D, m
  • 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;
  • ( G2 K( c6 V5 D, t# o* E
  • endmodule
    & r. ~1 ]: l( U$ r
       7 X+ j5 T' f1 j- P8 d+ T7 P

, t- a. G- U  F* G4 J1 [1 G+ r* r; s3 s0 T; e9 L7 S% w9 [! Y* {. S

该用户从未签到

2#
发表于 2020-7-9 14:56 | 只看该作者
常用数字集成电路设计模块集锦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-28 20:53 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表