|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——【FPGA代码学习】乘法器
3 R8 z" Z2 p+ T三位数相乘数学乘法表达式5 |. `3 z) @ o7 ^ L) ]
A1 A2 A3( O) t" @& a0 V- G
* B1 B2 B3
Z+ c t4 _$ X4 v7 `! }* K" e8 r -------------------------------------------4 F& [/ T$ @! k! j8 y: I
+ B3A1 B3A2 B3A3
0 |* t" _1 i/ ~2 P7 A$ b, s + B2A1 B2A2 B2A35 Z7 X+ `, ]& r+ K0 M
+ B1A1 B1A2 B1A3
0 C1 s' H' ?/ s D) o- a --------------------------------------------/ c% W2 J/ V Z5 h
5列 4列 3列 2列 1列 2 w' B* P, w" }2 A U7 p3 ^* l
# C' a) b* ]8 v- p4 Q. z; s a h, e7 ~& s: L
串行乘法器:9 f! \0 O( o7 N7 W! ~2 j& L
- module multi_CX(clk, x, y, result);
-
- input clk;
- input [7:0] x, y;
- output [15:0] result;
- reg [15:0] result;
- parameter s0 = 0, s1 = 1, s2 = 2;
- reg [2:0] count = 0;
- reg [1:0] state = 0;
- reg [15:0] P, T;
- reg [7:0] y_reg;
- always @(posedge clk) begin
- case (state)
- s0: begin
- count <= 0;
- P <= 0;
- y_reg <= y;
- T <= {{8{1'b0}}, x};
- state <= s1;
- end
- s1: begin
- if(count == 3'b111)
- state <= s2;
- else begin
- if(y_reg[0] == 1'b1)
- P <= P + T;
- else
- P <= P;
- y_reg <= y_reg >> 1;
- T <= T << 1;
- count <= count + 1;
- state <= s1;
- end
- end
- s2: begin
- result <= P;
- state <= s0;
- end
- default: ;
- endcase
- end
- endmodule
% p% z+ j" ] P6 q' i$ n2 T+ h; n
' R8 i% {& h5 `2 `6 ~6 N6 _% d, ?0 m1 f8 J
. }) p6 B( a5 i
8 c( x6 x6 |$ a3 c
9 u1 p+ A; L4 J' U( t* c- u) E
流水线乘法器
& Y% H( N/ }7 H1 O# c* O
* g- R8 Q+ F% Z2 E! v9 \- k- module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);
-
- input [3:0] mul_a, mul_b;
- input clk;
- input rst_n;
- output [7:0] mul_out;
- reg [7:0] mul_out;
- reg [7:0] stored0;
- reg [7:0] stored1;
- reg [7:0] stored2;
- reg [7:0] stored3;
- reg [7:0] add01;
- reg [7:0] add23;
- always @(posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- mul_out <= 0;
- stored0 <= 0;
- stored1 <= 0;
- stored2 <= 0;
- stored3 <= 0;
- add01 <= 0;
- add23 <= 0;
- end
- else begin
- stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
- stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;
- stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;
- stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;
- add01 <= stored1 + stored0;
- add23 <= stored3 + stored2;
- mul_out <= add01 + add23;
- end
- end
- endmodule5 i! X' |' u; Y/ M# h
: X( O d' y% p" `
" @" y% ^. S- D) d" _. R/ [9 v5 f. U9 k+ U8 l
8 N+ Z. Y! B' |0 h0 N |
|