|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——【FPGA代码学习】乘法器
9 M5 [# Y( J: L# T8 C三位数相乘数学乘法表达式
& Q I/ @ k5 e A1 A2 A3
2 F/ Q7 Z' U' w2 |' ~ * B1 B2 B35 l! d/ d1 y, D1 I8 E
-------------------------------------------7 J; u( d, v. V/ n% o! G2 q4 u
+ B3A1 B3A2 B3A31 b/ G8 t% j7 ]& _( k; S
+ B2A1 B2A2 B2A3
( T" r- y% i; {# a8 h) _ + B1A1 B1A2 B1A3
. O+ [( E% L5 l! g+ \. ? --------------------------------------------
0 t- ], O4 E2 z; K" `4 B8 j 5列 4列 3列 2列 1列
% A. w% u2 C+ Z& e/ W( ~! D' N7 m0 \
& Q6 o: H V8 b串行乘法器:
' \! _0 C$ U, k7 }5 R7 k! E- 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
( d! t4 @: @* v* C* F# P2 q' m1 A
' Z: R$ S/ W! C% A) I3 j8 O# I Z3 o& N
1 ?- O" R! P) ]6 \1 T5 @9 d
5 D" P0 |- f9 h6 U# T5 |! x
7 G' S; ^/ N; X3 O
流水线乘法器1 j- y6 A4 V: S$ p
5 r+ y7 b/ p$ }1 J2 e7 s x- @
- 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
- endmodule
* f H6 p0 S: O/ L2 i( }& |
' P" u" l% P( ^6 Z. x# ~* M/ G
5 N& N& S+ r: |, f1 }6 r [* p
' G) w% o2 A$ A4 ^& c
7 I* ^# A+ A* c& U1 n# M$ L |
|