diff --git a/hdl/axi_lite.md b/hdl/axi_lite.md new file mode 100644 index 0000000..9117fde --- /dev/null +++ b/hdl/axi_lite.md @@ -0,0 +1,91 @@ +```wavedrom +{ + signal: [ + {name: 'ACLK', wave: 'P..|..'}, + ['Write Address', + {name: 'AWVALID', wave: '010|..', data: []}, + {name: 'AWADDR', wave: 'x3x|..', data: [1,2,3,4]}, + {name: 'AWPROT', wave: 'x3x|..', data: [1,2,3,4]}, + {name: 'AWREADY', wave: '1..|..', data: []}, + ], + ['Write Data', + {name: 'WVALID', wave: '010|..', data: []}, + {name: 'WDATA', wave: 'x3x|..', data: [1,2,3,4]}, + {name: 'WSTRB', wave: 'x3x|..', data: [1,2,3,4]}, + {name: 'WREADY', wave: '1..|..', data: []}, + ], + ['Write Resp', + {name: 'BVALID', wave: '0..|10', data: []}, + {name: 'BREADY', wave: '01.|.0', data: []}, + {name: 'BRESP', wave: 'x..|3x', data: [1,2,3,4]}, + ], + ], + head:{ + text:'AXI-Lite Write Example', + tick:0, + }, + foot:{ + text:'Slave may take arbitrarily long to respond', + } +} + +``` +```wavedrom +{ + signal: [ + {name: 'ACLK', wave: 'P.......'}, + ['Write Address', + {name: 'AWVALID', wave: '01...0..', data: []}, + {name: 'AWADDR', wave: 'x345.x..', data: [1,2,3,4]}, + {name: 'AWPROT', wave: 'x345.x..', data: [1,2,3,4]}, + {name: 'AWREADY', wave: '1..01...', data: []}, + ], + ['Write Data', + {name: 'WVALID', wave: '010.1.0.', data: []}, + {name: 'WDATA', wave: 'x3x.45x.', data: [1,2,3,4]}, + {name: 'WSTRB', wave: 'x3x.45x.', data: [1,2,3,4]}, + {name: 'WREADY', wave: '1.......', data: []}, + ], + ['Write Resp', + {name: 'BVALID', wave: '0.10.1.0', data: []}, + {name: 'BREADY', wave: '01.....0', data: []}, + {name: 'BRESP', wave: 'x.3x.45x', data: [1,2,3,4]}, + ], + ], + head:{ + text:'AXI-Lite Write Example', + tick:0, + } +} + +``` + +```wavedrom +{ + signal: [ + {name: 'ACLK', wave: 'P.....'}, + ['Write Address', + {name: 'AWVALID', wave: '01..0.', data: []}, + {name: 'AWADDR', wave: 'x345x.', data: [1,2,3,4]}, + {name: 'AWPROT', wave: 'x345x.', data: [1,2,3,4]}, + {name: 'AWREADY', wave: '1...0.', data: []}, + ], + ['Write Data', + {name: 'WVALID', wave: '01..0.', data: []}, + {name: 'WDATA', wave: 'x345x.', data: [1,2,3,4]}, + {name: 'WSTRB', wave: 'x345x.', data: [1,2,3,4]}, + {name: 'WREADY', wave: '1.....', data: []}, + ], + ['Write Resp', + {name: 'BVALID', wave: '0.1..0', data: []}, + {name: 'BREADY', wave: '01...0', data: []}, + {name: 'BRESP', wave: 'x.345x', data: [1,2,3,4]}, + ], + ], + head:{ + text:'AXI-Lite Write Example', + tick:0, + } +} + +``` \ No newline at end of file diff --git a/hdl/axi_lite_if.sv b/hdl/axi_lite_if.sv new file mode 100644 index 0000000..f8a93a0 --- /dev/null +++ b/hdl/axi_lite_if.sv @@ -0,0 +1,36 @@ +interface axi_lite(); + parameter DATA_WIDTH = 32; + parameter ADDR_WIDTH = 12; + // Global + logic ACLK; + logic ARESETn; + + // Write address + logic AWVALID; + logic [ADDR_WIDTH-1:0] AWADDR; + logic [2:0] AWPROT; + logic AWREADY; + + // Write data + logic WVALID; + logic [DATA_WIDTH-1:0] WDATA; + logic [(DATA_WIDTH/8)-1:0] WSTRB; + logic WREADY; + + // Write response + logic BVALID; + logic BREADY; + logic [1:0] BRESP; + + // Read address + logic ARVALID; + logic [ADDR_WIDTH-1:0] ARADDR; + logic [2:0] ARPROT; + logic ARREADY; + + // Read data + logic RVALID; + logic [DATA_WIDTH-1:0] RDATA; + logic [1:0] RRESP; + logic RREADY; +endinterface diff --git a/hdl/correlator.v b/hdl/correlator.v new file mode 100644 index 0000000..8426f81 --- /dev/null +++ b/hdl/correlator.v @@ -0,0 +1,56 @@ +module correlator #( + parameter LENGTH = 8, + parameter BITS_IN = 8, + parameter BITS_INTERNAL = BITS_IN + $clog2(LENGTH), + parameter BITS_OUT = 8, +)( + input wire clk, + input wire reset, + + input wire [BITS_IN-1:0] a, + input wire [BITS_IN-1:0] b, + output reg [BITS_OUT-1:0] y +); + +// verify parameters are valid +if (BITS_OUT > BITS_INTERNAL) begin + $error("BITS_OUT (%d) must be <= BITS_INTERNAL (%d)", BITS_OUT, BITS_INTERNAL); +end + +// signals +reg [BITS_IN-1] aa [0:LENGTH-1]; +reg [BITS_IN-1] bb [0:LENGTH-1]; +reg [BITS_INTERNAL-1:0] sum; + +// combinatorial calculation +always @(*) begin : continuous + integer i; + + aa[0] = a; + bb[0] = b; + + sum = 0; + for (i=0; i