Skip to content

Commit ca43500

Browse files
author
Konstantin Pavlov
committed
Added ReverseVector combinational module
1 parent b7f3bee commit ca43500

File tree

3 files changed

+183
-25
lines changed

3 files changed

+183
-25
lines changed

README.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,31 @@
55

66
### CONTENTS:
77

8-
**/Advanced Synthesis Cookbook/** - useful code from Altera's cookbook
9-
**/KCPSM6_Release9_30Sept14/** - Xilinx's Picoblaze soft processor
10-
**/pacoblaze-2.2/** - version of Picoblaze adapted for Altera devices
11-
12-
**Main_tb.v** - basic testbench template
13-
14-
**ActionBurst** - multichannel one-shot triggering module
15-
**ActionBurst2** - multichannel one-shot triggering with variable steps module
16-
**ClkDivider** - wide reference clock divider
17-
**DeBounce** - two-cycle debounce for input buttons
18-
**DynDelay** - dynamic delay for arbitrary input signal made on general-purpose trigger elements
19-
**EdgeDetect** - edge detector, gives one-tick pulses on every signal edge
20-
**Encoder** - digital encoder input logic module
21-
**fifo** - single-clock FIFO buffer (queue) implementation
22-
**NDivide** - primitive integer divider
23-
**lifo** - single-clock LIFO buffer (stack) implementation
24-
**PulseGen** - generates pulses with given width and delay
25-
**ResetSet** - SR trigger variant w/o metastable state, set dominates here
26-
**SetReset** - SR trigger variant w/o metastable state, reset dominates here
27-
**StaticDelay** - static delay for arbitrary input signal made on Xilinx`s SRL16E primitives. Also serves as input synchronizer, a standard way to get rid of metastability issues
28-
29-
**UartRx** - straightforward yet simple UART receiver implementation for FPGA written in Verilog
30-
**UartTx** - straightforward yet simple UART transmitter implementation for FPGA written in Verilog
31-
**UartRxExtreme** - extreme minimal UART receiver implementation for FPGA written in Verilog
32-
**UartTxExtreme** - extreme minimal UART transmitter implementation for FPGA written in Verilog
8+
**/Advanced Synthesis Cookbook/** - useful code from Altera's cookbook
9+
**/KCPSM6_Release9_30Sept14/** - Xilinx's Picoblaze soft processor
10+
**/pacoblaze-2.2/** - version of Picoblaze adapted for Altera devices
11+
12+
**Main_tb.v** - basic testbench template
13+
14+
**ActionBurst** - multichannel one-shot triggering module
15+
**ActionBurst2** - multichannel one-shot triggering with variable steps module
16+
**ClkDivider** - wide reference clock divider
17+
**DeBounce** - two-cycle debounce for input buttons
18+
**DynDelay** - dynamic delay for arbitrary input signal made on general-purpose trigger elements
19+
**EdgeDetect** - edge detector, gives one-tick pulses on every signal edge
20+
**Encoder** - digital encoder input logic module
21+
**fifo** - single-clock FIFO buffer (queue) implementation
22+
**NDivide** - primitive integer divider
23+
**lifo** - single-clock LIFO buffer (stack) implementation
24+
**PulseGen** - generates pulses with given width and delay
25+
**ResetSet** - SR trigger variant w/o metastable state, set dominates here
26+
**ReverseVector** - reverses signal order within multi-bit bus
27+
**SetReset** - SR trigger variant w/o metastable state, reset dominates here
28+
**StaticDelay** - static delay for arbitrary input signal made on Xilinx`s SRL16E primitives. Also serves as input synchronizer, a standard way to get rid of metastability issues
29+
**UartRx** - straightforward yet simple UART receiver implementation for FPGA written in Verilog
30+
**UartTx** - straightforward yet simple UART transmitter implementation for FPGA written in Verilog
31+
**UartRxExtreme** - extreme minimal UART receiver implementation for FPGA written in Verilog
32+
**UartTxExtreme** - extreme minimal UART transmitter implementation for FPGA written in Verilog
3333

3434
Also added some simple testbenches for selected modules
3535

ReverseVector.sv

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//------------------------------------------------------------------------------
2+
// ReverseVector.sv
3+
// Konstantin Pavlov, pavlovconst@gmail.com
4+
//------------------------------------------------------------------------------
5+
6+
// INFO ------------------------------------------------------------------------
7+
// "Physically" reverses signal order within multi-bit bus
8+
// Thus in[7] signal becomes out[0], in[6] becomes out[1] and vise-versa
9+
// Module is being synthesized into combinational logic only
10+
11+
12+
/* --- INSTANTIATION TEMPLATE BEGIN ---
13+
14+
ReverseVector #(
15+
.WIDTH( 8 ) // WIDTH must be >=2
16+
) RV1 (
17+
.in( smth[7:0] ),
18+
.out( htms[7:0] ) // reversed bit order
19+
);
20+
21+
--- INSTANTIATION TEMPLATE END ---*/
22+
23+
24+
module ReverseVector #(
25+
WIDTH = 8 // WIDTH must be >=2
26+
)(
27+
input [(WIDTH-1):0] in,
28+
output logic [(WIDTH-1):0] out
29+
);
30+
31+
32+
genvar i;
33+
34+
generate
35+
for (i = 0; i < (WIDTH/2) ; i++) begin
36+
always_comb begin
37+
out[i] = in[WIDTH-1-i];
38+
out[WIDTH-1-i] = in[i];
39+
end // always_comb
40+
end // for
41+
endgenerate
42+
43+
// additional assign needed when WIDTH is odd
44+
generate
45+
if ( WIDTH%2 ) begin
46+
always_comb begin
47+
out[WIDTH/2] = in[WIDTH/2];
48+
end // always_comb
49+
end // for
50+
endgenerate
51+
52+
53+
endmodule

ReverseVector_tb.sv

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
//------------------------------------------------------------------------------
2+
// ReverseVector_tb.sv
3+
// Konstantin Pavlov, pavlovconst@gmail.com
4+
//------------------------------------------------------------------------------
5+
6+
// INFO ------------------------------------------------------------------------
7+
// testbench for ReverseVector module
8+
9+
10+
`timescale 1ns / 1ps
11+
12+
module main_tb();
13+
14+
logic clk200;
15+
initial begin
16+
#0 clk200 = 1;
17+
forever
18+
#2.5 clk200 = ~clk200;
19+
end
20+
21+
logic rst;
22+
initial begin
23+
#10.2 rst = 1;
24+
#5 rst = 0;
25+
//#10000;
26+
forever begin
27+
#9985 rst = ~rst;
28+
#5 rst = ~rst;
29+
end
30+
end
31+
32+
logic nrst;
33+
assign nrst = ~rst;
34+
35+
logic rst_once;
36+
initial begin // initializing non-X data before PLL starts
37+
#10.2 rst_once = 1;
38+
#5 rst_once = 0;
39+
end
40+
initial begin
41+
#510.2 rst_once = 1; // PLL starts at 500ns, clock appears, so doing the reset for modules
42+
#5 rst_once = 0;
43+
end
44+
45+
logic nrst_once;
46+
assign nrst_once = ~rst_once;
47+
48+
logic [31:0] DerivedClocks;
49+
ClkDivider #(
50+
.WIDTH( 32 )
51+
) CD1 (
52+
.clk( clk200 ),
53+
.nrst( nrst_once ),
54+
.out( DerivedClocks[31:0] )
55+
);
56+
57+
logic [31:0] E_DerivedClocks;
58+
EdgeDetect #(
59+
.WIDTH( 32 )
60+
) ED1 (
61+
.clk( clk200 ),
62+
.nrst( nrst_once ),
63+
.in( DerivedClocks[31:0] ),
64+
.rising( E_DerivedClocks[31:0] ),
65+
.falling( ),
66+
.both( )
67+
);
68+
69+
logic [15:0] RandomNumber1;
70+
c_rand RNG1 (
71+
.clk( clk200 ),
72+
.rst( rst_once ),
73+
.reseed( 1'b0 ),
74+
.seed_val( DerivedClocks[31:0] ),
75+
.out( RandomNumber1[15:0] )
76+
);
77+
78+
logic start;
79+
initial begin
80+
#0 start = 1'b0;
81+
#100.2 start = 1'b1;
82+
#5 start = 1'b0;
83+
end
84+
85+
// Module under test ==========================================================
86+
87+
// odd width
88+
logic [14:0] reversed1;
89+
ReverseVector #(
90+
.WIDTH( 15 ) // WIDTH must be >=2
91+
) RV1 (
92+
.in( RandomNumber1[14:0] ),
93+
.out( reversed1[14:0] ) // reversed bit order
94+
);
95+
96+
// even width
97+
logic [13:0] reversed2;
98+
ReverseVector #(
99+
.WIDTH( 14 ) // WIDTH must be >=2
100+
) RV2 (
101+
.in( reversed1[13:0] ),
102+
.out( reversed2[13:0] ) // reversed bit order
103+
);
104+
105+
endmodule

0 commit comments

Comments
 (0)