Hardware Design: SIE
Sign in or create your account | Project List | Help
Hardware Design: SIE Git Source Tree
Root/
| 1 | |
| 2 | // REG OFFSET 1000h |
| 3 | //reg0(32bit)W 0h |
| 4 | //reg1(32bit)W 4h |
| 5 | //reg2(32bit)W 8h |
| 6 | //reg3(32bit)W Ch |
| 7 | //reg4(32bit)W 10h |
| 8 | //error(16bit)R 14h |
| 9 | //status(16bit)R 16h |
| 10 | //mt_rnd(32bit)R 18h |
| 11 | //max_lev(8bit)W 1Ch |
| 12 | //control(8bit)W 1Dh |
| 13 | //max_com(16bit)W 1Eh |
| 14 | |
| 15 | |
| 16 | `timescale 1ns / 1ps |
| 17 | module ehw(clk, sram_data, addr, nwe, ncs, noe, reset, led, |
| 18 | irq_pin); |
| 19 | |
| 20 | parameter B = (7); |
| 21 | |
| 22 | input clk, addr, nwe, ncs, noe, reset; |
| 23 | inout [B:0] sram_data; |
| 24 | output led; |
| 25 | output irq_pin; |
| 26 | |
| 27 | // synchronize signals |
| 28 | reg sncs, snwe; |
| 29 | reg [12:0] buffer_addr; |
| 30 | reg [B:0] buffer_data; |
| 31 | wire led; |
| 32 | |
| 33 | // bram-cpu interfaz |
| 34 | reg we; |
| 35 | reg w_st=0; |
| 36 | reg [B:0] wdBus; |
| 37 | reg [B:0] rdBus; |
| 38 | wire [12:0] addr; |
| 39 | reg [7:0] bae; |
| 40 | |
| 41 | |
| 42 | // bram-evalfit interfaz |
| 43 | wire we_eval, en_ev; |
| 44 | wire [63:0] ev_do; |
| 45 | wire [63:0] ev_di; |
| 46 | wire [63:0] ev_do_aux; |
| 47 | wire [63:0] ev_di_aux; |
| 48 | |
| 49 | // Interconnection |
| 50 | wire [31:0] mt_rnd; |
| 51 | wire [31:0] reg0; |
| 52 | wire [31:0] reg1; |
| 53 | wire [31:0] reg2; |
| 54 | wire [31:0] reg3; |
| 55 | wire [31:0] reg4; |
| 56 | wire [15:0] status; |
| 57 | wire [15:0] status_aux; |
| 58 | wire [15:0] error; |
| 59 | wire [8:0] evalfit_addr; |
| 60 | |
| 61 | wire en_fit; |
| 62 | wire [15:0] max_com; |
| 63 | wire [3:0] max_lev; |
| 64 | wire [7:0] control; |
| 65 | |
| 66 | reg [7:0] reg_bank [31:0]; |
| 67 | wire enReg; |
| 68 | wire [4:0] address; |
| 69 | |
| 70 | // Test : LED blinking |
| 71 | reg [25:0] counter; |
| 72 | always @(posedge clk) begin |
| 73 | if (~reset) |
| 74 | counter <= {25{1'b0}}; |
| 75 | else |
| 76 | counter <= counter + 1; |
| 77 | end |
| 78 | assign led = counter[24]; |
| 79 | |
| 80 | // Data Bus direction control |
| 81 | wire T = ~noe | ncs; |
| 82 | assign sram_data = T?8'bZ:rdBus; |
| 83 | |
| 84 | // synchronize assignment |
| 85 | always @(negedge clk) |
| 86 | begin |
| 87 | sncs <= ncs; |
| 88 | snwe <= nwe; |
| 89 | buffer_data <= sram_data; |
| 90 | buffer_addr <= addr; |
| 91 | end |
| 92 | |
| 93 | // write access cpu to bram |
| 94 | always @(posedge clk) |
| 95 | if(~reset) {w_st, we, wdBus} <= 0; |
| 96 | else begin |
| 97 | wdBus <= buffer_data; |
| 98 | case (w_st) |
| 99 | 0: begin |
| 100 | we <= 0; |
| 101 | if(sncs | snwe) w_st <= 1; |
| 102 | end |
| 103 | 1: begin |
| 104 | if(~(sncs | snwe)) begin |
| 105 | we <= 1; |
| 106 | w_st <= 0; |
| 107 | end |
| 108 | else we <= 0; |
| 109 | end |
| 110 | endcase |
| 111 | end |
| 112 | |
| 113 | |
| 114 | // Address Decoder |
| 115 | // We have 2 memory blocks 1: 512 x 64 bits memory 32kb = 4kB 0000 - 0FFF buffer_addr[12] = 0 |
| 116 | // 2: Register Bank 1000 - 101F buffer_addr[12] = 1 |
| 117 | |
| 118 | // SIE has an eight bits data bus, this module generate the required signals to create a 64 bits word. |
| 119 | always @(buffer_addr) |
| 120 | begin |
| 121 | if(~buffer_addr[12]) begin |
| 122 | case (buffer_addr[2:0]) |
| 123 | 0: bae <= 8'h01; |
| 124 | 1: bae <= 8'h02; |
| 125 | 2: bae <= 8'h04; |
| 126 | 3: bae <= 8'h08; |
| 127 | 4: bae <= 8'h10; |
| 128 | 5: bae <= 8'h20; |
| 129 | 6: bae <= 8'h40; |
| 130 | 7: bae <= 8'h80; |
| 131 | endcase |
| 132 | end |
| 133 | else |
| 134 | bae <= 8'h00; |
| 135 | end |
| 136 | wire en1, en2; // enable memory signals |
| 137 | assign en0 = bae[0] | bae[1] | bae[2] | bae[3]; |
| 138 | assign en1 = bae[4] | bae[5] | bae[6] | bae[7]; |
| 139 | |
| 140 | reg[31:0] DIA_Aux; |
| 141 | always @ (posedge clk) begin |
| 142 | if (bae[0]) DIA_Aux[7:0] = wdBus[7:0]; |
| 143 | if (bae[1]) DIA_Aux[15:8] = wdBus[7:0]; |
| 144 | if (bae[2]) DIA_Aux[23:16] = wdBus[7:0]; |
| 145 | if (bae[3]) DIA_Aux[31:24] = wdBus[7:0]; |
| 146 | if (bae[4]) DIA_Aux[7:0] = wdBus[7:0]; |
| 147 | if (bae[5]) DIA_Aux[15:8] = wdBus[7:0]; |
| 148 | if (bae[6]) DIA_Aux[23:16] = wdBus[7:0]; |
| 149 | if (bae[7]) DIA_Aux[31:24] = wdBus[7:0]; |
| 150 | end |
| 151 | |
| 152 | reg [2:0] state, nextstate; //FSM for write in 32bit mode to memory |
| 153 | wire we0, we1; |
| 154 | wire nreset; |
| 155 | assign nreset = ~reset; |
| 156 | parameter S0 = 3'b000; |
| 157 | parameter S1 = 3'b001; |
| 158 | parameter S2 = 3'b010; |
| 159 | |
| 160 | always @ (posedge clk, posedge nreset) |
| 161 | if (nreset) state <= S0; |
| 162 | else state <= nextstate; |
| 163 | // next state logic |
| 164 | always@(*) |
| 165 | case (state) |
| 166 | S0:if (bae[3]&we) nextstate = S1; |
| 167 | else |
| 168 | if (bae[7]&we) nextstate = S2; |
| 169 | else nextstate = S0; |
| 170 | S1: nextstate = S0; |
| 171 | S2: nextstate = S0; |
| 172 | default: nextstate = S0; |
| 173 | endcase |
| 174 | // output logic |
| 175 | assign we0 = (state == S1); |
| 176 | assign we1 = (state == S2); |
| 177 | |
| 178 | // Read control |
| 179 | reg [7:0] MemDOA; |
| 180 | wire [63:0] DOA_Aux; |
| 181 | |
| 182 | always @(posedge clk) |
| 183 | if(~reset)begin |
| 184 | rdBus = 8'h00; |
| 185 | end |
| 186 | else begin |
| 187 | if(enReg) |
| 188 | rdBus = reg_bank[address]; |
| 189 | else |
| 190 | rdBus = MemDOA[7:0]; |
| 191 | end |
| 192 | // memory output mux |
| 193 | always @(buffer_addr[2:0]) |
| 194 | case (buffer_addr[2:0]) |
| 195 | 0 : MemDOA = DOA_Aux[7:0]; |
| 196 | 1 : MemDOA = DOA_Aux[15:8]; |
| 197 | 2 : MemDOA = DOA_Aux[23:16]; |
| 198 | 3 : MemDOA = DOA_Aux[31:24]; |
| 199 | 4 : MemDOA = DOA_Aux[39:32]; |
| 200 | 5 : MemDOA = DOA_Aux[47:40]; |
| 201 | 6 : MemDOA = DOA_Aux[55:48]; |
| 202 | 7 : MemDOA = DOA_Aux[63:56]; |
| 203 | default: MemDOA = 8'h00; |
| 204 | endcase |
| 205 | |
| 206 | // Store Inputs |
| 207 | always @(posedge clk) |
| 208 | begin |
| 209 | if(enReg) begin |
| 210 | reg_bank[0] = reg0[7:0]; |
| 211 | reg_bank[1] = reg0[15:8]; |
| 212 | reg_bank[2] = reg0[23:16]; |
| 213 | reg_bank[3] = reg0[31:24]; |
| 214 | reg_bank[4] = reg1[7:0]; |
| 215 | reg_bank[5] = reg1[15:8]; |
| 216 | reg_bank[6] = reg1[23:16]; |
| 217 | reg_bank[7] = reg1[31:24]; |
| 218 | reg_bank[8] = reg2[7:0]; |
| 219 | reg_bank[9] = reg2[15:8]; |
| 220 | reg_bank[10] = reg2[23:16]; |
| 221 | reg_bank[11] = reg2[31:24]; |
| 222 | reg_bank[12] = reg3[7:0]; |
| 223 | reg_bank[13] = reg3[15:8]; |
| 224 | reg_bank[14] = reg3[23:16]; |
| 225 | reg_bank[15] = reg3[31:24]; |
| 226 | reg_bank[16] = reg4[7:0]; |
| 227 | reg_bank[17] = reg4[15:8]; |
| 228 | reg_bank[18] = reg4[23:16]; |
| 229 | reg_bank[19] = reg4[31:24]; |
| 230 | reg_bank[20] = error[7:0]; |
| 231 | reg_bank[21] = error[15:8]; |
| 232 | reg_bank[22] = status[7:0]; |
| 233 | reg_bank[23] = status[15:8]; |
| 234 | reg_bank[24] = mt_rnd[7:0]; |
| 235 | reg_bank[25] = mt_rnd[15:8]; |
| 236 | reg_bank[26] = mt_rnd[23:16]; |
| 237 | reg_bank[27] = mt_rnd[31:24]; |
| 238 | end |
| 239 | end |
| 240 | |
| 241 | assign address[4:0] = buffer_addr[4:0]; |
| 242 | assign enReg = buffer_addr[12]; |
| 243 | // assign reg0[7:0] = reg_bank[0]; |
| 244 | // assign reg0[15:8] = reg_bank[1]; |
| 245 | // assign reg0[23:16] = reg_bank[2]; |
| 246 | // assign reg0[31:24] = reg_bank[3]; |
| 247 | // assign reg1[7:0] = reg_bank[4]; |
| 248 | // assign reg1[15:8] = reg_bank[5]; |
| 249 | // assign reg1[23:16] = reg_bank[6]; |
| 250 | // assign reg1[31:24] = reg_bank[7]; |
| 251 | // assign reg2[7:0] = reg_bank[8]; |
| 252 | // assign reg2[15:8] = reg_bank[9]; |
| 253 | // assign reg2[23:16] = reg_bank[10]; |
| 254 | // assign reg2[31:24] = reg_bank[11]; |
| 255 | // assign reg3[7:0] = reg_bank[12]; |
| 256 | // assign reg3[15:8] = reg_bank[13]; |
| 257 | // assign reg3[23:16] = reg_bank[14]; |
| 258 | // assign reg3[31:24] = reg_bank[15]; |
| 259 | // assign reg4[7:0] = reg_bank[16]; |
| 260 | // assign reg4[15:8] = reg_bank[17]; |
| 261 | // assign reg4[23:16] = reg_bank[18]; |
| 262 | // assign reg4[31:24] = reg_bank[19]; |
| 263 | assign max_lev[3:0] = reg_bank[28][3:0]; |
| 264 | assign control[7:0] = reg_bank[29]; |
| 265 | assign max_com[7:0] = reg_bank[30]; |
| 266 | assign max_com[15:8] = reg_bank[31]; |
| 267 | // Write control |
| 268 | always @(negedge clk) |
| 269 | if(we & enReg) begin |
| 270 | case (address) |
| 271 | // 0: reg_bank[0] = wdBus; |
| 272 | // 1: reg_bank[1] = wdBus; |
| 273 | // 2: reg_bank[2] = wdBus; |
| 274 | // 3: reg_bank[3] = wdBus; |
| 275 | // 4: reg_bank[4] = wdBus; |
| 276 | // 5: reg_bank[5] = wdBus; |
| 277 | // 6: reg_bank[6] = wdBus; |
| 278 | // 7: reg_bank[7] = wdBus; |
| 279 | // 8: reg_bank[8] = wdBus; |
| 280 | // 9: reg_bank[9] = wdBus; |
| 281 | // 10: reg_bank[10] = wdBus; |
| 282 | // 11: reg_bank[11] = wdBus; |
| 283 | // 12: reg_bank[12] = wdBus; |
| 284 | // 13: reg_bank[13] = wdBus; |
| 285 | // 14: reg_bank[14] = wdBus; |
| 286 | // 15: reg_bank[15] = wdBus; |
| 287 | // 16: reg_bank[16] = wdBus; |
| 288 | // 17: reg_bank[17] = wdBus; |
| 289 | // 18: reg_bank[18] = wdBus; |
| 290 | // 19: reg_bank[19] = wdBus; |
| 291 | 28: reg_bank[28] = wdBus; |
| 292 | 29: reg_bank[29] = wdBus; |
| 293 | 30: reg_bank[30] = wdBus; |
| 294 | 31: reg_bank[31] = wdBus; |
| 295 | endcase |
| 296 | end |
| 297 | assign irq_pin = 0; |
| 298 | //assign ev_do_aux = {ev_do[7:0], ev_do[15:8], ev_do[23:16], ev_do[31:24], ev_do[39:32], ev_do[47:40], ev_do[55:48], ev_do[63:56]}; |
| 299 | //assign ev_di = {ev_di_aux[7:0], ev_di_aux[15:8], ev_di_aux[23:16], ev_di_aux[31:24], ev_di_aux[39:32], ev_di_aux[47:40], ev_di_aux[55:48], ev_di_aux[63:56]}; |
| 300 | assign ev_do_aux[63:32] = ev_do[31:0]; |
| 301 | assign ev_do_aux[31:16] = ev_do[47:32]; |
| 302 | assign ev_do_aux[15:0] = ev_do[63:48]; |
| 303 | |
| 304 | assign ev_di[63:32] = ev_di_aux[31:0]; //Endianess adjust for 32-bit level data |
| 305 | assign ev_di[31:16] = ev_di_aux[47:32]; //endianess adjust for 16-bit LUT |
| 306 | assign ev_di[7:0] = ev_di_aux[63:56]; //endianess adjust for 8-bit VARS |
| 307 | assign ev_di[15:8] = ev_di_aux[55:48]; //endianess adjust for 8-bit VARS |
| 308 | |
| 309 | |
| 310 | assign status[14:0] = status_aux[14:0]; |
| 311 | |
| 312 | RAMB16_S36_S36 #(.INIT_00(256'hABCDEF00_00000000_00000000_00000000_00000000_00000000_00000000_76543210) ) |
| 313 | mem0 ( .CLKA(clk), .ENA(en0), .SSRA(1'b0), .ADDRA(buffer_addr[11:3]), .WEA(we0), .DIA(DIA_Aux[31:0]), .DIPA(1'b0), .DOA(DOA_Aux[31:0]), |
| 314 | .CLKB(clk), .ENB(en_ev), .SSRB(1'b0), .ADDRB(evalfit_addr), .WEB(we_eval), .DIB(ev_do_aux[31:0]), .DIPB(1'b0), .DOB(ev_di_aux[31:0])); |
| 315 | |
| 316 | RAMB16_S36_S36 #(.INIT_00(256'hCE5A4000_00000000_00000000_00000000_00000000_00000000_00000000_78111300) ) |
| 317 | mem1( .CLKA(clk), .ENA(en1), .SSRA(1'b0), .ADDRA(buffer_addr[11:3]), .WEA(we1), .DIA(DIA_Aux[31:0]), .DIPA(0'b0), .DOA(DOA_Aux[63:32]), |
| 318 | .CLKB(clk), .ENB(en_ev), .SSRB(1'b0), .ADDRB(evalfit_addr), .WEB(we_eval), .DIB(ev_do_aux[63:32]), .DIPB(0'b0), .DOB(ev_di_aux[63:32])); |
| 319 | |
| 320 | // evalfit_peripheral |
| 321 | evalfit_peripheral evalfit( .clk(clk), .reset(control[7]), .habilita(control[6]), .maxcombs(max_com), .nivel_max(max_lev), |
| 322 | .peripheral_mem_in(ev_di), .peripheral_mem_en(en_ev), .peripheral_mem_out(ev_do), .peripheral_mem_we(we_eval), |
| 323 | .peripheral_mem_addr(evalfit_addr), .evalfit3_estado(status_aux[15:0]), .errores(error), |
| 324 | .fin_ack(status[15]), .reg0_s(reg0), .reg1_s(reg1), .reg2_s(reg2), .reg3_s(reg3), .reg4_s(reg4)); |
| 325 | |
| 326 | // MersenneTwister |
| 327 | mt_mem random( .clk(clk), .ena(1'b1), .resetn(reset), .random(mt_rnd)); |
| 328 | |
| 329 | endmodule |
| 330 | |
| 331 |
Branches:
master
