Below code is hardcoded for 8 bits. Fine tuning and optimization can be done. But this does the job.
Hope this helps
RTL :
module dec_bin
#(parameter no_of_bits = 8,
parameter binary = 2)(
output reg [(no_of_bits/2) - 1 : 0] counter,
output reg [no_of_bits - 1 : 0] bin,
input reset, clk,
input [7:0] in
);
reg [no_of_bits - 1 : 0] r0;
reg [no_of_bits - 1 : 0] r1;
reg [no_of_bits - 1 : 0] r2;
reg [no_of_bits - 1 : 0] r3;
reg [no_of_bits - 1 : 0] r4;
reg [no_of_bits - 1 : 0] r5;
reg [no_of_bits - 1 : 0] r6;
reg [no_of_bits - 1 : 0] r7;
reg bin0 = 1'b0;
reg bin1 = 1'b0;
reg bin2 = 1'b0;
reg bin3 = 1'b0;
reg bin4 = 1'b0;
reg bin5 = 1'b0;
reg bin6 = 1'b0;
reg bin7 = 1'b0;
initial
begin
counter = 4'b0000;
bin = 8'b0000_0000;
r0 = 8'b0000_0000;
r1 = 8'b0000_0000;
r2 = 8'b0000_0000;
r3 = 8'b0000_0000;
r4 = 8'b0000_0000;
r5 = 8'b0000_0000;
r6 = 8'b0000_0000;
r7 = 8'b0000_0000;
end
always @ (posedge clk)
begin
if (reset)
begin
counter <= 4'b0000;
bin <= 8'b0000_0000;
end
else
begin
counter <= counter + 4'b0001;
r0 <= in / binary;
r1 <= r0 / binary;
r2 <= r1 / binary;
r3 <= r2 / binary;
r4 <= r3 / binary;
r5 <= r4 / binary;
r6 <= r5 / binary;
r7 <= r6 / binary;
bin0 = ((r0 * binary) == in) ? 1'b0 : 1'b1;
bin1 = ((r1 * binary) == r0) ? 1'b0 : 1'b1;
bin2 = ((r2 * binary) == r1) ? 1'b0 : 1'b1;
bin3 = ((r3 * binary) == r2) ? 1'b0 : 1'b1;
bin4 = ((r4 * binary) == r3) ? 1'b0 : 1'b1;
bin5 = ((r5 * binary) == r4) ? 1'b0 : 1'b1;
bin6 = ((r6 * binary) == r5) ? 1'b0 : 1'b1;
bin7 = ((r7 * binary) == r6) ? 1'b0 : 1'b1;
bin = {bin7, bin6, bin5, bin4, bin3, bin2, bin1, bin0};
$display($time," The value of counter is %b%b%b%b%b%b%b%b %d", bin7, bin6, bin5, bin4, bin3, bin2, bin1, bin0, counter);
end
end
endmodule
Testbench :
module dec_bin_tb
#(parameter no_of_bits = 8,
parameter time_period = 20)(
);
wire [(no_of_bits/2) - 1 :0] COUNTER;
wire [(no_of_bits) - 1 : 0] BIN;
reg CLK, RESET;
reg [7:0] IN;
dec_bin db1 (.counter(COUNTER), .bin(BIN), .clk(CLK), .reset(RESET), .in(IN));
initial
begin
CLK = 1'b0;
RESET = 1'b0;
#time_period RESET = 1'b1;
IN = 50;
#time_period RESET = 1'b0;
#580 RESET = 1'b1;
#time_period RESET = 1'b0;
end
always
#time_period CLK = ~CLK;
endmodule