Skip to content

Commit 700bb97

Browse files
committedJun 15, 2017
Fixed addressing in XC2C model. Now supports programming and readback. No support for USERCODE/read lock yet. No support for OTF or SRAM program modes. No actual fabric logic.
1 parent b4df70a commit 700bb97

File tree

2 files changed

+53
-31
lines changed

2 files changed

+53
-31
lines changed
 

Diff for: ‎hdl/xc2c-model/XC2CDevice.v

+7-1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ module XC2CDevice(
136136
// JTAG stuff
137137

138138
wire config_erase;
139+
140+
wire config_read_en;
139141
wire[ADDR_BITS-1:0] config_read_addr;
140142
reg[SHREG_WIDTH-1:0] config_read_data = 0;
141143

@@ -146,7 +148,9 @@ module XC2CDevice(
146148
//Read/write the EEPROM
147149
//TODO: add read enable?
148150
always @(posedge jtag_tck) begin
149-
config_read_data <= ram_bitstream[config_read_addr];
151+
152+
if(config_read_en)
153+
config_read_data <= ram_bitstream[config_read_addr];
150154

151155
if(config_write_en)
152156
ram_bitstream[config_write_addr] <= config_write_data;
@@ -173,6 +177,8 @@ module XC2CDevice(
173177
.tck(jtag_tck),
174178

175179
.config_erase(config_erase),
180+
181+
.config_read_en(config_read_en),
176182
.config_read_addr(config_read_addr),
177183
.config_read_data(config_read_data),
178184

Diff for: ‎hdl/xc2c-model/XC2CJTAG.v

+46-30
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
module XC2CJTAG(
2424
tdi, tms, tck, tdo,
2525
config_erase,
26-
config_read_addr, config_read_data,
26+
config_read_en, config_read_addr, config_read_data,
2727
config_write_en, config_write_addr, config_write_data,
2828

2929
debug_led, debug_gpio);
@@ -51,6 +51,7 @@ module XC2CJTAG(
5151
output reg config_erase = 0; //Erases all config memory
5252
//This takes 100 ms IRL but for now we'll model it instantly
5353

54+
output reg config_read_en = 0;
5455
output reg[ADDR_BITS-1:0] config_read_addr = 0; //Address for reading the bitstream (real, not gray code)
5556
input wire[SHREG_WIDTH-1:0] config_read_data;
5657

@@ -456,6 +457,17 @@ module XC2CJTAG(
456457

457458
end
458459

460+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
461+
// Gray code decode ROM
462+
463+
reg[7:0] gray_to_bin[255:0];
464+
465+
integer i;
466+
initial begin
467+
for(i=0; i<256; i=i+1)
468+
gray_to_bin[i ^ (i >> 1)] <= i;
469+
end
470+
459471
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
460472
// Config memory read
461473

@@ -465,54 +477,58 @@ module XC2CJTAG(
465477
wire[SHREG_WIDTH-1:0] isc_read_shreg_adv = {tdi, isc_read_shreg[SHREG_WIDTH-1:1]};
466478

467479
//Gray coded read address: left N bits of the shift register
468-
wire[ADDR_BITS-1:0] isc_read_addr_gray = isc_read_shreg_adv[SHREG_WIDTH-1 : SHREG_WIDTH-ADDR_BITS];
480+
wire[ADDR_BITS-1:0] isc_read_addr_gray = isc_read_shreg[SHREG_WIDTH-1 : SHREG_WIDTH-ADDR_BITS];
469481

470-
//Convert Gray code to normal
471-
reg[ADDR_BITS-1:0] isc_read_addr_normal;
472-
integer i;
482+
//Invert the bit ordering of the address since the protocol is weird and has MSB at right
483+
reg[ADDR_BITS-1:0] isc_read_addr_gray_flipped;
473484
always @(*) begin
474-
isc_read_addr_normal[ADDR_BITS-1] <= isc_read_addr_gray[ADDR_BITS-1];
475-
for(i=ADDR_BITS-2; i>=0; i=i-1)
476-
isc_read_addr_normal[i] <= isc_read_addr_gray[i] ^ isc_read_addr_normal[i+1];
485+
for(i=0; i<ADDR_BITS; i=i+1)
486+
isc_read_addr_gray_flipped[i] <= isc_read_addr_gray[ADDR_BITS - 1 - i];
477487
end
478488

489+
reg config_read_real = 0;
479490
always @(posedge tck) begin
480491

481-
case(state)
492+
config_read_en <= 0;
482493

483-
//Load the data that we read
484-
STATE_CAPTURE_DR: begin
485-
isc_read_shreg <= config_read_data;
486-
end //end STATE_CAPTURE_DR
494+
if(ir == INST_ISC_READ) begin
495+
case(state)
487496

488-
//Actual readout happens here
489-
STATE_SHIFT_DR: begin
490-
isc_read_shreg <= isc_read_shreg_adv;
491-
end //end STATE_SHIFT_DR
497+
//Load the data that we read
498+
STATE_CAPTURE_DR: begin
499+
isc_read_shreg <= config_read_data;
500+
end //end STATE_CAPTURE_DR
492501

493-
//Update: save the de-Gray-ified read address
494-
STATE_UPDATE_DR: begin
495-
config_read_addr <= isc_read_addr_normal;
496-
end //end STATE_UPDATE_DR
502+
//Actual readout happens here
503+
STATE_SHIFT_DR: begin
504+
isc_read_shreg <= isc_read_shreg_adv;
505+
end //end STATE_SHIFT_DR
497506

498-
endcase
507+
//Update: save the de-Gray-ified read address
508+
STATE_UPDATE_DR: begin
509+
config_read_en <= 1;
510+
config_read_addr <= gray_to_bin[isc_read_addr_gray_flipped];
511+
end //end STATE_UPDATE_DR
512+
513+
endcase
514+
end
499515

500516
end
501517

502518
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
503519
// Config memory writes
504520

505-
reg[SHREG_WIDTH + ADDR_BITS - 1 : 0] isc_write_shreg = 0;
521+
localparam WRITE_WIDTH = SHREG_WIDTH + ADDR_BITS;
522+
reg[WRITE_WIDTH - 1 : 0] isc_write_shreg = 0;
506523

507524
//Gray coded write address: left N bits of the shift register
508525
wire[ADDR_BITS-1:0] isc_write_addr_gray = isc_write_shreg[SHREG_WIDTH +: ADDR_BITS];
509526

510-
//Convert Gray code to normal
511-
reg[ADDR_BITS-1:0] isc_write_addr_normal;
527+
//Invert the bit ordering of the address since the protocol is weird and has MSB at right
528+
reg[ADDR_BITS-1:0] isc_write_addr_gray_flipped;
512529
always @(*) begin
513-
isc_write_addr_normal[ADDR_BITS-1] <= isc_write_addr_gray[ADDR_BITS-1];
514-
for(i=ADDR_BITS-2; i>=0; i=i-1)
515-
isc_write_addr_normal[i] <= isc_write_addr_gray[i] ^ isc_write_addr_normal[i+1];
530+
for(i=0; i<ADDR_BITS; i=i+1)
531+
isc_write_addr_gray_flipped[i] <= isc_write_addr_gray[ADDR_BITS - 1 - i];
516532
end
517533

518534
always @(posedge tck) begin
@@ -529,13 +545,13 @@ module XC2CJTAG(
529545

530546
//Read the new bitstream
531547
STATE_SHIFT_DR: begin
532-
isc_write_shreg <= {tdi, isc_write_shreg[SHREG_WIDTH + ADDR_BITS -1 : 1]};
548+
isc_write_shreg <= {tdi, isc_write_shreg[WRITE_WIDTH - 1 : 1]};
533549
end //end STATE_SHIFT_DR
534550

535551
//Update: commit the write to bitstream
536552
STATE_UPDATE_DR: begin
537553
config_write_en <= 1;
538-
config_write_addr <= isc_write_addr_normal;
554+
config_write_addr <= gray_to_bin[isc_write_addr_gray_flipped];
539555
config_write_data <= isc_write_shreg[SHREG_WIDTH-1 : 0];
540556
end //end STATE_UPDATE_DR
541557

0 commit comments

Comments
 (0)
Please sign in to comment.