EmbDev.net

Forum: FPGA, VHDL & Verilog need help to modify my code


von shreyas p. (Company: student) (shr_patel1990)


Attached files:

Rate this post
useful
not useful
//////////////////////RAM  MODULE///////////////////////////

module input_ram (en, addr, data);
//        input       clk;
        input       en;
        input [6:0] addr;
        output reg [7:0] data;

     always @(*)
         begin
           if (en)
        begin
          case(addr)
      7'b000: data = 8'b00110001;
      7'b001: data = 8'b00010000;
      7'b010: data = 8'b00100000;
      7'b011: data = 8'b11101101;
      7'b100: data = 8'b11100011;
      7'b101: data = 8'b00110011;
      7'b110: data = 8'b11110111;
      7'b111: data = 8'b00111011;

      7'b1000: data = 8'b00110001;
      7'b1001: data = 8'b00010000;
      7'b1010: data = 8'b00100000;
      7'b1011: data = 8'b11101101;
      7'b1100: data = 8'b11100011;
      7'b1101: data = 8'b00110011;
      7'b1110: data = 8'b11110111;
      7'b1111: data = 8'b00111011;

      7'b10000: data = 8'b00110001;
      7'b10001: data = 8'b00010000;
      7'b10010: data = 8'b00100000;
      7'b10011: data = 8'b11101101;
      7'b10100: data = 8'b11100011;
      7'b10101: data = 8'b00110011;
      7'b10110: data = 8'b11110111;
      7'b10111: data = 8'b00111011;

      7'b11000: data = 8'b00110001;
      7'b11001: data = 8'b00010000;
      7'b11010: data = 8'b00100000;
      7'b11011: data = 8'b11101101;
      7'b11100: data = 8'b11100011;
      7'b11101: data = 8'b00110011;
      7'b11110: data = 8'b11110111;
        7'b11111: data = 8'b00111011;

      7'b100000: data = 8'b00110001;
      7'b100001: data = 8'b00010000;
      7'b100010: data = 8'b00100000;
      7'b100011: data = 8'b11101101;
      7'b100100: data = 8'b11100011;
      7'b100101: data = 8'b00110011;
      7'b100110: data = 8'b11110111;
        7'b100111: data = 8'b00111011;

      7'b101000: data = 8'b00110001;
      7'b101001: data = 8'b00010000;
      7'b101010: data = 8'b00100000;
      7'b101011: data = 8'b11101101;
      7'b101100: data = 8'b11100011;
      7'b101101: data = 8'b00110011;
      7'b101110: data = 8'b11110111;
        7'b101111: data = 8'b00111011;


      7'b110000: data = 8'b00110001;
      7'b110001: data = 8'b00010000;
      7'b110010: data = 8'b00100000;
      7'b110011: data = 8'b11101101;
      7'b110100: data = 8'b11100011;
      7'b110101: data = 8'b00110011;
      7'b110110: data = 8'b11110111;
        7'b110111: data = 8'b00111011;

        7'b111000: data = 8'b00110001;
      7'b111001: data = 8'b00010000;
      7'b111010: data = 8'b00100000;
      7'b111011: data = 8'b11101101;
      7'b111100: data = 8'b11100011;
      7'b111101: data = 8'b00110011;
      7'b111110: data = 8'b11110111;
        7'b111111: data = 8'b00111011;
       7'b1000000: data = 8'b00110001;

      default: data = 8'b0000_XXXX;
      endcase
      end
    end
    endmodule


//////////////another rom module in which weight is stored/////////////
module weight_ram (en, addr, weight);
//        input       clk;
        input       en;
        input [6:0] addr;
        output reg [7:0] weight;

     always @(* )
         begin
           if (en)
        begin
        case(addr)
      7'b000: weight = 8'b11111011;
      7'b001: weight = 8'b00001110;
      7'b010: weight = 8'b11100000;
      7'b011: weight = 8'b11110011;
      7'b100: weight = 8'b11110011;
      7'b101: weight = 8'b11100110;
      7'b110: weight = 8'b11101100;
      7'b111: weight = 8'b11110110;

      7'b1000: weight = 8'b11111001;
      7'b1001: weight = 8'b00000010;
      7'b1010: weight = 8'b11111011;
      7'b1011: weight = 8'b00001100;
      7'b1100: weight = 8'b11101101;
      7'b1101: weight = 8'b00011000;
      7'b1110: weight = 8'b11100010;
      7'b1111: weight = 8'b00001011;

      7'b10000: weight = 8'b11111011;
      7'b10001: weight = 8'b00000100;
      7'b10010: weight = 8'b11101001;
      7'b10011: weight = 8'b11101101;
      7'b10100: weight = 8'b00010011;
      7'b10101: weight = 8'b00011110;
      7'b10110: weight = 8'b11110100;
      7'b10111: weight = 8'b00001100;

      7'b11000: weight = 8'b00011000;
      7'b11001: weight = 8'b00011001;
      7'b11010: weight = 8'b11100101;
      7'b11011: weight = 8'b11100010;
      7'b11100: weight = 8'b11101011;
      7'b11101: weight = 8'b00011000;
      7'b11110: weight = 8'b11100110;
        7'b11111: weight = 8'b11111011;

      7'b100000: weight = 8'b00011101;
      7'b100001: weight = 8'b00000010;
      7'b100010: weight = 8'b00001100;
      7'b100011: weight = 8'b11110100;
      7'b100100: weight = 8'b00001100;
      7'b100101: weight = 8'b00010101;
      7'b100110: weight = 8'b11100001;
        7'b100111: weight = 8'b00010000;

      7'b101000: weight = 8'b00011111;
      7'b101001: weight = 8'b00010000;
      7'b101010: weight = 8'b11110010;
      7'b101011: weight = 8'b00010011;
      7'b101100: weight = 8'b11100111;
      7'b101101: weight = 8'b11111101;
      7'b101110: weight = 8'b00011010;
        7'b101111: weight = 8'b11110011;


      7'b110000: weight = 8'b11110010;
      7'b110001: weight = 8'b11101000;
      7'b110010: weight = 8'b11100001;
      7'b110011: weight = 8'b00001011;
      7'b110100: weight = 8'b11101110;
      7'b110101: weight = 8'b11110001;
      7'b110110: weight = 8'b11111111;
        7'b110111: weight = 8'b11100011;

        7'b111000: weight = 8'b00000101;
      7'b111001: weight = 8'b11101001;
      7'b111010: weight = 8'b00000110;
      7'b111011: weight = 8'b00001101;
      7'b111100: weight = 8'b11100111;
      7'b111101: weight = 8'b11111010;
      7'b111110: weight = 8'b00001100;
        7'b111111: weight = 8'b11111011;

       7'b1000000: weight = 8'b11100011;
      7'b1000001: weight = 8'b00000010;
      7'b1000010: weight = 8'b00001010;
      7'b1000011: weight = 8'b00000001;
      7'b1000100: weight = 8'b00011100;
      7'b1000101: weight = 8'b00000110;
      7'b1000110: weight = 8'b00011010;
        7'b1000111: weight = 8'b11101001;
     default: weight = 8'b0000_XXXX;

      endcase
      end
    end
    endmodule

/////////////////Booth multiplier Multiplier to multiply data and weight 
////////////////

module multiplier(prod, busy, mc, mp, clk, start);
output [15:0] prod;
output busy;
input [7:0] mc, mp;
input clk, start;
reg [7:0] A, Q, M;
reg Q_1;
reg [3:0] count;
wire [7:0] sum, difference;
always @(posedge clk)
begin

if (start) begin
A <= 8'b0;
M <= mc;
Q <= mp;
Q_1 <= 1'b0;
count <= 4'b0;
end
else
begin
case ({Q[0], Q_1})
2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q};
2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q};
default: {A, Q, Q_1} <= {A[7], A, Q};
endcase
count <= count + 1'b1;
end

end
alu adder (sum, A, M, 1'b0);
alu subtracter (difference, A, ~M, 1'b1);
assign prod = {A, Q};
assign busy = (count < 8);

//assign temp = ((busy==0 && clk ==1) ? prod : 16'bx);

initial
begin
$monitor($time,"prod=%b, busy==%b, mc=%b, mp=%b, clk=%b, start=%b",prod, 
busy, mc, mp, clk, start);
end



endmodule
//The following is an alu.
//It is an adder, but capable of subtraction:
//Recall that subtraction means adding the two's complement--
//a - b = a + (-b) = a + (inverted b + 1)
//The 1 will be coming in as cin (carry-in)
module alu(out, a, b, cin);
output [7:0] out;
input [7:0] a;
input [7:0] b;
input cin;
assign out = a + b + cin;
endmodule

////////////////////////////////////Testbench///////////////////////
module top_tst;

  // Inputs
  reg clk;
  reg en;
  reg start;
  reg [6:0] address;
//   reg [15:0] temp;
  // Outputs
  wire [15:0] mux_out,multiplied;
  wire [7:0] data;
  wire [7:0] weight;
   wire busy;
  // Instantiate the Unit Under Test (UUT)
  top_module uut (
//    .multiplied(multiplied),
    .mux_out(mux_out),
    .data(data),
    .weight(weight),
    .clk(clk),
    .en(en),
    .start(start),
    .address(address),
    .busy(busy)
  );

  initial
  begin
    clk = 0;
    en = 0;
    address = 7'b0;
    en=1;
    $monitor 
($time,"clk=%b,en=%b,start=%b,address=%b,data=%b,weight=%b",clk,en,start 
,address,data,weight);
  end
always #2 clk=~clk;

always @ (data or weight)
begin
start=1;
#4 start=0;
end
always @ (busy==0)
begin
address=address+7'b1;
end
endmodule





Sir i am new to verilog and and i am getting problem while simulation 
help me to come out from this situation
i will explain the scenario of my code
data and weight are two input which is stored in rom at different 
address
and i used booth multiplier because some of my input are signed and what 
i am doing that at adress=0000000 my data and weight load on dataline 
and after multiplying when my answer of multipier is available i want to 
increase my adress=0000001 so that next data and weight must be 
available and process repeate but dont know where i am doing mistake in 
test bench sir please help me to come out this problem

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.