A configurable hardware for implementing a convolutional neural network, CNN, the configurable hardware comprising: a memory interface configured to receive, from external memory, weights and input data to be used in calculations within the CNN, as well as command information to control operation of the configurable hardware; a coefficient buffer controller configured to receive the weights from the memory interface and pass the weights to a coefficient buffer; the coefficient buffer configured to store the weights received from the coefficient buffer controller; an input buffer controller configured to receive the input data from the memory interface and pass the input data to a plurality of input buffers (235a-235n), wherein the plurality of input buffers (235a-235n) is configured to store the input data received from the input buffer controller; a command decoder configured to decode the command information and subsequently issue control information to the coefficient buffer controller and the input buffer controller to control a manner in which the weights and the input data are stored in the coefficient buffer and the plurality of input buffers (235a-235n) respectively; a plurality of convolution engines (240a-240n) configured to perform one or more convolution operations on the input data in the plurality of input buffers (235a-235n) using the weights in the coefficient buffer; a plurality of accumulators (245a-245n) configured to receive resultant outputs of the plurality of convolution engines (240a-240n) and add the resultant outputs of the plurality of convolution engines (240a-240n) to values stored in an accumulation buffer; the accumulation buffer configured to store accumulated results from the plurality of accumulators (245a-245n); a shared buffer that is internal to the configurable hardware and distinct from the external memory; an activation module configured to perform at least one of a number of different activation functions on data in the accumulation buffer and store the resultant values in the shared buffer; a normalize module that is distinct from the activation module and configured to perform one of a number of different normalizing functions on data in the shared buffer and store the results in the shared buffer; and a pool module configured to perform a pooling operation on data in the shared buffer and store the results in the shared buffer. a memory interface configured to receive, from external memory, weights and input data to be used in calculations within the CNN, as well as command information to control operation of the configurable hardware; a coefficient buffer controller configured to receive the weights from the memory interface and pass the weights to a coefficient buffer; the coefficient buffer configured to store the weights received from the coefficient buffer controller; an input buffer controller configured to receive the input data from the memory interface and pass the input data to a plurality of input buffers (235a-235n), wherein the plurality of input buffers (235a-235n) is configured to store the input data received from the input buffer controller; a command decoder configured to decode the command information and subsequently issue control information to the coefficient buffer controller and the input buffer controller to control a manner in which the weights and the input data are stored in the coefficient buffer and the plurality of input buffers (235a-235n) respectively; a plurality of convolution engines (240a-240n) configured to perform one or more convolution operations on the input data in the plurality of input buffers (235a-235n) using the weights in the coefficient buffer; a plurality of accumulators (245a-245n) configured to receive resultant outputs of the plurality of convolution engines (240a-240n) and add the resultant outputs of the plurality of convolution engines (240a-240n) to values stored in an accumulation buffer; the accumulation buffer configured to store accumulated results from the plurality of accumulators (245a-245n); a shared buffer that is internal to the configurable hardware and distinct from the external memory; an activation module configured to perform at least one of a number of different activation functions on data in the accumulation buffer and store the resultant values in the shared buffer; a normalize module that is distinct from the activation module and configured to perform one of a number of different normalizing functions on data in the shared buffer and store the results in the shared buffer; and a pool module configured to perform a pooling operation on data in the shared buffer and store the results in the shared buffer.