// behavioural model of running 5-word median filter module median_beh (outWord, clk, reset, inWord); output [3:0] outWord; input clk, reset; input [3:0] inWord; reg [3:0] outWord; integer count, i, j; reg [3:0] mem [0:4]; reg [3:0] workSpace [0:4]; reg [3:0] tmp; initial begin count = 0; end always @(posedge clk) begin if (reset == 1) for (i = 0; i < 5; i = i + 1) mem [i] = 0; else begin // update array of lst 5 words mem [count] = inWord; count = (count == 4) ? 0 : count + 1; // copy array into work space for (i = 0; i < 5; i = i + 1) workSpace [i] = mem [i]; // sort workSpace - using bubble sort for (i = 0; i < 4; i = i + 1) for (j = 4; j > i; j = j - 1) if (workSpace [j] < workSpace [j-1]) begin tmp = workSpace [j-1]; workSpace [j-1] = workSpace [j]; workSpace [j] = tmp; end // output result outWord = workSpace[2]; end // else: !if(reset == 1) // test output #3 for (i = 0; i < 5; i = i + 1) $display (" %d %d %d", i, mem[i], workSpace[i]); end endmodule module testStimulus; reg [3:0] inWord; reg clk, reset; wire [3:0] outWord; // instantiate behavioural model median_beh beh (outWord, clk, reset, inWord); initial begin clk = 0; reset = 1; #100 reset = 0; #5003 $finish; end always #50 clk = ~clk; always @(negedge clk) // tricky way to update values inWord = {$random} / 4 % 16; always @(posedge clk) #2 $display("input word %d - ", inWord, "output word %d", outWord); endmodule // testStimulus