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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
" p# E; `* h; u: ?% P4 {
引言
* z1 @( T7 h- LC语言,C++语言等软件编程语言吸引我们的一个很重要的原因是他们都能提供非常丰富的函数库供我们使用,大大提高coding的效率。
3 ]8 N" o  e  }, m& o( O8 s, l: r+ B1 I1 w
但是像verilogHDL等HDL语言这方面做的比较弱,尤其是可综合的语法,基本没有通用的模块库供我们使用,所以编码效率会比较低。如果我们把平时经常使用的一些模块积累起来,慢慢的标准化,这样以后我们再设计新的电路时,就会方便很多,今天就是开始。
8 ~5 ^# E( }# @* ]) F# }3 |6 t/ l* J- y5 J0 E8 h1 }3 p
1,判断两个信号是否相等
4 U1 p. K8 k1 F. Q. {  O, b( d; ~3 p+ r
  • function Fcompare;
  •         input valid_a,valid_b;
  •         input [31:0] a,b;

  • ! L( t/ k2 S- o& U' U2 k
  •         Fcompare = valid_a & valid_b & (({32{valid_a}} & a) == ({32{valid_b}} & b));
  • . Y7 O; x7 u' V
  • endfunction! J8 O# \) @9 F- q9 d  L
  
6 t  c+ r+ G% T) |" B, m5 A+ R" T# ^$ {; c5 |, w5 P6 z
2,对一个one-hot的值,得到是对应bit的十进制数% C5 z9 `" n# [5 y4 i

+ A- W* d% m7 v  u; _7 R8 c+ i* E
  • function [2:0] Fcode_8b;
  •         input [7:0] one_hot;

  • 2 O0 p3 K' R- s$ H, ?$ q2 m
  •         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;
  •                                 );
  • $ a! Q; V  V& k$ |3 ^, \
  • endfunction" h6 \8 }7 e% J; }" z' m
  
- G& y7 B- B+ u9 s. [6 I$ p" D1 v( z% L2 L8 ]1 u' q
3,上面函数的反向功能
4 |# X/ @8 _  W9 G; d( S2 `- C, G( d/ b/ D3 C
  • function [7:0] Fdecode_8b;
  •         input [2:0] value;

  • $ y& @; M  t  r9 G8 [1 T
  •         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 );

  • * M+ e" X+ w4 p3 a: N1 M' r: R
  • endfunction
    7 @% G9 o: Z0 ~4 |: v
  ! o2 e3 h$ d7 i: y( |9 e; m

5 ^. @. {2 P2 }2 o4,clock gage+ C( y! D# e" |! ^) E2 d" `) k& ^
在实际的电路设计中,低功耗(low-power)是我们必须时刻都需要谨记在心的一条法则,这条法则的具体实现中最重要的就是clock gage了。
' C9 G4 ?8 j: Y) N" K2 F7 Z1 x+ s, }. e! W" P' ^* E3 {+ S
但是一般情况下DC会提供专门的gating cell,在做仿真时,我们还是需要一个简单的模型。# V& i9 _7 X3 n; z( o8 h, t2 U
  ~5 G  w7 g) n- W
  • module clk_gate
  • (
  • input enable,
  • input clk,
  • output clk_o
  • );

  • , Z: u2 W. S7 m* H) G, p" }
  • reg not_gate;
  • & x0 r$ [8 I: l. w8 f: x# U
  • always @(enable or clk)
  •         if(~clk)
  •                 not_gate = enable;
  • assign clk_o = clk & not_gate;
  • 3 V* z5 n, y+ j; p
  • endmodule
    0 ~/ x- N' [- C1 s* D
   
& C2 _* |# A' Q
* r, a3 i) r& t% D; Q; k" d6 P5,获得信号的上升沿' w# ?' G% |  p0 u
# c2 ?4 A' f0 d. N, P& f: C
  • module sig_posedge
  • (
  • input clk,
  • input signal,
  • 3 h* E: z) D6 j* L
  • output signal_posedge
  • );
  • : I: f( I. E& t) h1 G9 L, ~
  •         reg tmp_r;

  • % y$ x$ R  `4 b
  •         always @(posedge clk)
  •                 tmp_r <= signal;
  •         assign signal_posedge = signal & ~tmp_r;
  • & p3 H- y' n, `* z- ~5 [
  • endmodule
    ( ]/ c: O  R5 m" K% ?9 l
    ! ~+ ^& c  Z$ }- f6 r" _3 Z

9 J8 z' k) ~+ |+ F- L. \( L6,获得信号的下降沿
' r; O% i% x8 t, P. O" o* u& M% S. L5 T3 D3 E1 q
  • module sig_negedge
  • (
  • input clk,
  • input signal,

  • & }# l0 c+ V* e: ?  n* M: H* V
  • output signal_negedge
  • );
  • - q8 y8 s) b2 }+ w$ s" l1 k; a
  •         reg tmp_r;
  • - t0 q2 i3 X! \' ^& s, t0 {
  •         always @(posedge clk)
  •                 tmp_r <= signal;
  •         assign signal_negedge = ~signal & tmp_r;
  • , X6 c; z! c: X
  • endmodule
    ' `5 U4 Q. y4 l0 o2 t
   
2 w* C( L* N1 d* H# a0 w/ {. M9 K' `4 e
7,round-robin arbiter(2选1)/ g6 t; N3 A% r  U% w
$ F# k/ ?2 w+ E0 n
  • 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; d  z& S: m; u
, g7 K& @  q0 ^
1 u' @# N9 f9 ?% ?7 \5 W
8,round-robin arbiter(4选1)
- x5 A' Z7 a& {* `: @+ S7 \9 r4 Q' A2 J/ \% `4 i5 ]2 Z; F
  • 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);

  • ; Y# ^6 G, i" n, u* X0 W- A# m
  •                 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);
  • ) t- z4 K( E7 H+ F- C3 V
  •                 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);

  • % F  V, \! x- ]& `$ w$ _" ]
  •                 Fround_robin_4 = {grant_d,grant_c,grant_b,grant_a} & req_en & grant_en;
  •         end
  • endfunction
    + W+ j% }  F- j# c. ?, ~3 @, ~/ R
     J' t! \# u9 z

) U0 A) P( f; F( T4 P. m* s9,round-robin arbiter(8选1)
# s9 R8 Y" _: S% m8 E5 j+ d% X- q
0 k0 G. \3 O5 _1 ]. p
  • 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);
  • 8 B% A1 \2 H1 F% E3 j# g- k, n1 f/ M
  •                 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);
  • ) H5 I" N, P( G+ t" w; K
  •                 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);
  • 9 |& e9 f6 b+ A$ B
  •                 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
    ; _) W( W& ~" a/ \
   . M; _2 W# x) m8 b
1 R  j2 Q6 }7 n6 D6 S
10,简易同步fifo8 H6 v9 c  @/ R  t; I8 P' m1 e

6 K/ o9 Q4 k8 H" K9 i' C% K
  • module simple_syn_fifo
  • #(
  • parameter WIDTH = 32,
  • parameter DEPTH = 4,
  • parameter PTR_WIDTH = 2
  • )
  • (
  • input clk,
  • input rst_n,

  • ) S. U! K7 ?' j6 A3 x* C
  • input ren,
  • input wen,
  • input [WIDTH-1:0] din,

  • $ i5 p) v1 V0 I. u7 T2 B
  • output full,
  • output empty,
  • output valid,
  • output [WIDTH-1:0] dout
  • );

  • ) b/ q+ U& Y8 Q4 A
  • reg [WIDTH-1:0] mem_r[0:DEPTH-1];

  • ) D$ B+ }! C; b! ^' a4 J% U7 b
  • reg [PTR_WIDTH-1:0] rptr_r;
  • reg [PTR_WIDTH-1:0] wptr_r;
  • reg [PTR_WIDTH:0] flag_r;
  • 0 e: ?& p$ C7 W! v
  • always @(posedge clk)
  •         if(wen)
  •                 mem_r[wptr_r] <= din;

  • % {0 U: \5 j6 P$ k
  • 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;

  • 5 o* Y1 P# T* \' F2 [
  • endmodule1 P& J' g8 z- `% f
       1 }# }( P: m* f6 G5 w6 n
% \# i" L: j# K1 I% y! I) }4 B5 M

2 x2 C% |4 R7 P& {

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-26 14:02 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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