File tree Expand file tree Collapse file tree 1 file changed +59
-0
lines changed Expand file tree Collapse file tree 1 file changed +59
-0
lines changed Original file line number Diff line number Diff line change
1
+ // ------------------------------------------------------------------------------
2
+ // barrel_shifter.sv
3
+ // Konstantin Pavlov, [email protected]
4
+ // ------------------------------------------------------------------------------
5
+
6
+ // INFO -------------------------------------------------------------------------
7
+ // Barrel shifter written in System Verilog
8
+ //
9
+
10
+ /* --- INSTANTIATION TEMPLATE BEGIN ---
11
+
12
+ barrel_shifter #(
13
+ .DATA_W( 32 )
14
+ ) bs_inst (
15
+ .clk( clk ),
16
+ .nrst( nrst,),
17
+ .ena( 1'b1 ),
18
+ .l_nr( 1'b1 ),
19
+ .dst( ),
20
+
21
+ .id( id[31:0] ),
22
+ .od( od[31:0] )
23
+ );
24
+
25
+ --- INSTANTIATION TEMPLATE END ---*/
26
+
27
+
28
+ module barrel_shifter # ( parameter
29
+ DATA_W = 32 ,
30
+ DIST_W = $clog2(DATA_W )
31
+ )(
32
+ input clk, // clock
33
+ input nrst, // negative reset
34
+ input ena, // enable
35
+ input l_nr, // shift left or right
36
+ input [DIST_W - 1 : 0 ] dst, // shift distance in bits
37
+
38
+ input [DATA_W - 1 : 0 ] id, // input data vector
39
+ output logic [DATA_W - 1 : 0 ] od = '0 // shifted data vector
40
+ );
41
+
42
+ always_ff @ (posedge clk) begin
43
+ if ( ~ nrst ) begin
44
+ od[DATA_W - 1 : 0 ] <= '0 ;
45
+ end else begin
46
+ if ( ena ) begin
47
+
48
+ if ( l_nr ) begin
49
+ od[DATA_W - 1 : 0 ] <= ({ 2 { id[DATA_W - 1 : 0 ]}} << dst[DIST_W - 1 : 0 ]) >> DATA_W ;
50
+ end else begin
51
+ od[DATA_W - 1 : 0 ] <= { 2 { id[DATA_W - 1 : 0 ]}} >> dst[DIST_W - 1 : 0 ];
52
+ end // if l_nr
53
+
54
+ end // if ena
55
+ end // nrst
56
+ end
57
+
58
+ endmodule
59
+
You can’t perform that action at this time.
0 commit comments