Verilog Program For Dual Rom
Verilog Program For Dual Rom
case(addr2)
// addr1 serves as the address to read C matrix
data.
3'b000 : dout2_next = loc0 ;
3'b001 : dout2_next = loc1 ;
3'b010 : dout2_next = loc2 ;
3'b011 : dout2_next = loc3 ;
3'b100 : dout2_next = loc4 ;
3'b101 : dout2_next = loc5 ;
3'b110 : dout2_next = loc6 ;
3'b111 : dout2_next = loc7 ;
default : dout2_next = loc0 ;
endcase
end
begin // Bytes from each row is accessed in a raster scan order (MSB first, etc).
mem [0] = loc0 ;
mem [1] = loc1 ;
mem [2] = loc2 ;
mem [3] = loc3 ;
mem [4] = loc4 ;
mem [5] = loc5 ;
mem [6] = loc6 ;
mem [7] = loc7 ;
end
always @ (mem_data)
begin
byte_data [0] = mem_data [63:56] ; // MSB is assigned as
byte_data [1] = mem_data [55:48] ; // LSB.
byte_data [2] = mem_data [47:40] ;
byte_data [3] = mem_data [39:32] ;
byte_data [4] = mem_data [31:24] ;
byte_data [5] = mem_data [23:16] ;
byte_data [6] = mem_data [15:8] ;
byte_data [7] = mem_data [7:0] ; // LSB is assigned as MSB.
end
assign mem_data = mem [a[5:3]] ; // Get 64 bits data.
assign d_next = byte_data [a[2:0]] ; // Get byte data.
always @ (posedge clk)
d <= d_next ; // Register byte data.
Endmodule
Verilog code for Ram_rc:
output [63:0] do ;
always @ (addr or loc0 or loc1 or loc2 or loc3 or loc4 or loc5 or loc6 or loc7)
begin
case (addr) // Read the RAM column-wise.
3'b000:
column = {loc0[63:56], loc1[63:56], loc2[63:56], loc3[63:56], loc4[63:56],loc5[63:56],
loc6[63:56],
loc7[63:56]} ;
3'b001:
column = {loc0[55:48], loc1[55:48], loc2[55:48], loc3[55:48], loc4[55:48], loc5[55:48],
loc6[55:48],
loc7[55:48]} ;
3'b010:
column = {loc0[47:40], loc1[47:40], loc2[47:40], loc3[47:40], loc4[47:40], loc5[47:40],
loc6[47:40],
loc7[47:40]} ;
3'b011:
column = {loc0[39:32], loc1[39:32], loc2[39:32], loc3[39:32], loc4[39:32], loc5[39:32],
loc6[39:32],
loc7[39:32]} ;
3'b100:
column = {loc0[31:24], loc1[31:24], loc2[31:24], loc3[31:24], loc4[31:24], loc5[31:24],
loc6[31:24],
loc7[31:24]} ;
3'b101:
column = {loc0[23:16], loc1[23:16], loc2[23:16], loc3[23:16], loc4[23:16], loc5[23:16],
loc6[23:16],
loc7[23:16]} ;
3'b110:
column = {loc0[15:8], loc1[15:8], loc2[15:8], loc3[15:8], loc4[15:8], loc5[15:8], loc6[15:8],
loc7[15:8]} ;
3'b111:
column = {loc0[7:0], loc1[7:0], loc2[7:0], loc3[7:0], loc4[7:0], loc5[7:0], loc6[7:0], loc7[7:0]} ;
default :
column = {loc0[7:0], loc1[7:0], loc2[7:0], loc3[7:0], loc4[7:0], loc5[7:0], loc6[7:0], loc7[7:0]} ;
endcase
end
assign be7 = (!be[7]) & rnw & din_valid ; // Enable write only if be7 = 1, and so on.
assign be6 = (!be[6]) & rnw & din_valid ;
assign be5 = (!be[5]) & rnw & din_valid ;
assign be4 = (!be[4]) & rnw & din_valid ;
assign be3 = (!be[3]) & rnw & din_valid ;
assign be2 = (!be[2]) & rnw & din_valid ;
assign be1 = (!be[1]) & rnw & din_valid ;
assign be0 = (!be[0]) & rnw & din_valid ;
always @ (posedge pci_clk)
begin // Write into RAM only if be7 = 1, and so on.
// Otherwise, don’t disturb the RAM contents.
mem [addr] <= { ( (be7) ? di[63:56] : mem_data[63:56] ),
( (be6) ? di[55:48] : mem_data[55:48] ),
( (be5) ? di[47:40] : mem_data[47:40] ),
( (be4) ? di[39:32] : mem_data[39:32] ),
( (be3) ? di[31:24] : mem_data[31:24] ),
( (be2) ? di[23:16] : mem_data[23:16] ),
( (be1) ? di[15:8] : mem_data[15:8] ),
( (be0) ? di[7:0] : mem_data[7:0] ) } ;
end
assign do_next = (rnw) ? do : column ;
// Read column-wise from RAM only if rnw = 0.
// Otherwise, don’t disturb.
always @ (posedge clk)
do <= do_next ; // Register the output.
Endmodule
ram_rc ram1 ( clk, pci_clk, rnw, be, ra, wa, di, din_valid, do1) ;
ram_rc ram2( clk, pci_clk, switch_bank, be, ra, wa, di, din_valid, do2) ;
*********************************************************************
input clk ;
input [11:0] n0 ;
input [11:0] n1 ;
input [11:0] n2 ;
input [11:0] n3 ;
input [11:0] n4 ;
input [11:0] n5 ;
input [11:0] n6 ;
input [11:0] n7 ;
reg s20_lsbreg5cy ;
******************************************************************
reg s20_lsbreg5cy ;
reg [9:0] s20_lsbreg5 ;
*******************************************************************
module dctreg28(din, cnt, qr0, qr1, qr2, qr3, qr4, qr5, qr6, qr7,en,clk);
input [10:0] din;
input [2:0] cnt;
input en;
input clk;
output [10:0] qr0;
output [10:0] qr1;
output [10:0] qr2;
output [10:0] qr3;
output [10:0] qr4;
output [10:0] qr5;
output [10:0] qr6;
output [10:0] qr7;
reg [10:0] qr0;
reg [10:0] qr1;
reg [10:0] qr2;
reg [10:0] qr3;
reg [10:0] qr4;
reg [10:0] qr5;
reg [10:0] qr6;
reg [10:0] qr7;
3'b000: q0=din;
3'b001: q1=din;
3'b010: q2=din;
3'b011: q3=din;
3'b100: q4=din;
3'b101: q5=din;
3'b110: q6=din;
3'b111:
begin
q7=din;
qr0=q0;
qr1=q1;
qr2=q2;
qr3=q3;
qr4=q4;
qr5=q5;
qr6=q6;
qr7=q7;
end
endcase
end
end
endmodule
*************************************************************
module mul11x8(a, b, clk, pro,sum21temp,sum21);
input [10:0] a;
input [7:0] b;
input clk;
output [18:0]sum21temp;
output [18:0] pro;
output [18:0]sum21;
reg [10:0]p0;
reg [10:0]p1;
reg [10:0]p2;
reg [10:0]p3;
reg [10:0]p4;
reg [10:0]p5;
reg [10:0]p6;
reg [10:0]p7;
reg [12:0]sum1;
reg [12:0]sum2;
reg [12:0]sum3;
reg [12:0]sum4;
reg [15:0]sum11;
reg [15:0]sum12;
reg [18:0]sum21;
reg [18:0]sum21temp;
reg [11:0]a_mag;
reg [7:0]b_mag;
assign p1shift[11:0]=p1<<1;
assign p3shift[11:0]=p3<<1;
always @(a)
begin
if(a[10] == 1'b0)
a_mag = a[10:0] ;
else
a_mag = ~a[10:0] + 1 ;
end
always@(b)
begin
if(b[7]==1'b0)
b_mag=b[7:0];
else
b_mag=~b[7:0]+1;
end
always@(posedge clk)
begin
always@(posedge clk)
begin
//sum1[14:0]={0,p0[10:0]}+{p1[10:0],0};
//sum2[14:0]={0,p2[10:0]}+{p3[10:0],0};
sum1[12:0]=p0[10:0]+p1shift[11:0];
sum2[12:0]=p2[10:0]+p3shift[11:0];
sum3[12:0]=p4[10:0]+{p5[10:0],1'b0};
sum4[12:0]=p6[10:0]+{p7[10:0],1'b0};
end
always@(posedge clk)
begin
sum11[15:0]=sum1[12:0]+{sum2[12:0],1'b0,1'b0};
sum12[15:0]=sum3[12:0]+{sum4[12:0],1'b0,1'b0};
end
always@(posedge clk)
begin
sum21[18:0]=sum11[15:0]+
{sum12[15:0],1'b0,1'b0,1'b0,1'b0};
end
always@(posedge clk)
begin
if(a[10]==1'b1 && b[7]==1'b0)
begin
sum21temp=~sum21[18:0]+1'b1;
end
else if(a[10]==1'b0 && b[7]==1'b1)
begin
sum21temp=~sum21[18:0]+1'b1;
end
else sum21temp=sum21;
end
assign pro=sum21temp;
endmodule
********************************************************************
input [11:0] a;
input [7:0] b;
input clk;
reg [11:0]p0;
reg [11:0]p1;
reg [11:0]p2;
reg [11:0]p3;
reg [11:0]p4;
reg [11:0]p5;
reg [11:0]p6;
reg [11:0]p7;
reg [13:0]sum1;
reg [13:0]sum2;
reg [13:0]sum3;
reg [13:0]sum4;
reg [16:0]sum11;
reg [16:0]sum12;
reg [19:0]sum21;
reg [19:0]sum21temp;
reg [12:0]a_mag;
reg [7:0]b_mag;
assign p1shift[12:0]=p1<<1;
assign p3shift[12:0]=p3<<1;
always @(a)
begin
if(a[11] == 1'b0)
a_mag = a[11:0] ;
else
a_mag = ~a[11:0] + 1 ;
end
always@(posedge clk)
begin
always@(posedge clk)
begin
sum1[13:0]=p0[11:0]+{p1[11:0],1'b0};
sum2[13:0]=p2[11:0]+{p3[11:0],1'b0};
sum3[13:0]=p4[11:0]+{p5[11:0],1'b0};
sum4[13:0]=p6[11:0]+{p7[11:0],1'b0};
end
always@(posedge clk)
begin
sum11[16:0]=sum1[13:0]+{sum2[13:0],1'b0,1'b0};
sum12[16:0]=sum3[13:0]+{sum4[13:0],1'b0,1'b0};
end
always@(posedge clk)
begin
sum21[19:0]=sum11[16:0]+
{sum12[16:0],1'b0,1'b0,1'b0,1'b0};
end
always@(posedge clk)
begin
if(a[10]==1'b1 && (b[7]==1'b0||b[7]==1'b1))
begin
sum21temp=~sum21[19:0]+1'b1;
end
else sum21temp=sum21;
end
assign pro=sum21temp;
endmodule
*********************************************************************
input [7:0] a;
input clk;
input [7:0] b;
reg[7:0] p0;
reg[7:0] p1;
reg[7:0] p2;
reg[7:0] p3;
reg[7:0] p4;
reg[7:0] p5;
reg[7:0] p6;
reg[7:0] p7;
always @(b)
begin
if(b[7] == 1'b0)
b_mag = b[7:0] ;
else
b_mag = ~b[7:0] + 1 ;
end
always@(posedge clk)
begin
end
always@(posedge clk)
begin
always@(posedge clk)
begin
sum11[12:0]=sum01[9:0] + {sum02[9:0],2'b0};
sum12[12:0]=sum03[9:0] + {sum04[9:0],2'b0};
end
always@(posedge clk)
begin
sum21[15:0]=sum11[12:0] + {sum12[12:0],4'b0};
end
always@(posedge clk)
begin
if ((a[7]==1'b0||a[7]==1'b1) &&( b[7]==1'b1))
begin
sum21temp=~sum21[15:0]+1'b1;
end
else
sum21temp=sum21;
end
assign pr[15:0]=sum21temp[15:0];
endmodule
************************************************************