//----------------------------------------------------- // Design Name : cam // File Name : cam.v // Function : CAM // Coder : Deepak Kumar Tala //----------------------------------------------------- module cam ( clk , // Cam clock cam_enable , // Cam enable cam_data_in , // Cam data to match cam_hit_out , // Cam match has happened cam_addr_out // Cam output address ); parameter ADDR_WIDTH = 8; parameter DEPTH = 1 << ADDR_WIDTH; //------------Input Ports-------------- input clk; input cam_enable; input [DEPTH-1:0] cam_data_in; //----------Output Ports-------------- output cam_hit_out; output [ADDR_WIDTH-1:0] cam_addr_out; //------------Internal Variables-------- reg [ADDR_WIDTH-1:0] cam_addr_out; reg cam_hit_out; reg [ADDR_WIDTH-1:0] cam_addr_combo; reg cam_hit_combo; reg found_match; integer i; //-------------Code Starts Here------- always @(cam_data_in) begin cam_addr_combo = {ADDR_WIDTH{1'b0}}; found_match = 1'b0; cam_hit_combo = 1'b0; for (i=0; i<DEPTH; i=i+1) begin if (cam_data_in[i] && !found_match) begin found_match = 1'b1; cam_hit_combo = 1'b1; cam_addr_combo = i; end else begin found_match = found_match; cam_hit_combo = cam_hit_combo; cam_addr_combo = cam_addr_combo; end end end // Register the outputs always @(posedge clk) begin if (cam_enable) begin cam_hit_out <= cam_hit_combo; cam_addr_out <= cam_addr_combo; end else begin cam_hit_out <= 1'b0; cam_addr_out <= {ADDR_WIDTH{1'b0}}; end end endmodule