| //----------------------------------------------------- | |
| // 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 |