On 2006-05-30, Timothy Miller wrote:
> You don't want to do this for a few reasons. First, it's generally
> frowned-upon to use clocks in logic. Secondly, we want to guarantee
> the timing of all of the I/O's which means we want all I/O to be
> registered, including the clock. Using logic like what you're doing
> can work when you carefully constrain the path, but when you register
> things, you don't have to worry about it.
I see the point.
> >Or is it better not to "upset" the PROM by putting out "weird" clocking
> >and instead sample SO on 'negedge clock' in the FPGA?
>
> I'm betting duty cycle matters because of the fact that the prom uses
> both edges of the clock. We also want to run it at the fastest rate.
Ok.
> >Another thing, will the bitmask of this code itself be on a protected
> >part of the PROM on delivery?
>
> I'm not sure what you're asking about.
Never mind. This goes right on the small FPGA, of course.
I see that this is a bit more tricky than software, and maybe I should
leave it to EEs. But I attach a new implementation, which incorporates
many of the hints and fragments you posted in this thread. Only
read/write ATM. Also, a dump to show timing.
module spi_controller(
clock,
reset_, // async negative reset
// Read/write interface
busy, // Is the machine busy working on a read request?
addr, // Read or write address of 32-bit word
write_data, // Data to be written
write_bytes, // Byte enables of write data
read_data, // Data to be read
read_out_valid, // Does data in holding buffer correspond with read addr?
do_read, // Start a read
do_write, // Start a write
// SPI interface
SI,
SO,
CE_,
SCK,
// config
read_cmd, // 8-bit command code for read
read_dummy_byte, // Do I throw away 8 bits when reading?
write_cmd // 8-bit command code to write byte
);
input clock, reset_;
output busy;
input [23:2] addr;
input [31:0] write_data;
input [3:0] write_bytes;
output [31:0] read_data;
output read_out_valid;
input do_read, do_write;
input SO;
output SI, CE_, SCK;
input [7:0] read_cmd, write_cmd;
input read_dummy_byte;
reg CE_, SI;
reg SCK;
reg [39:0] ck_out_data;
reg [31:0] ck_in_data;
reg [6:0] bit_counter;
reg enable_read;
reg busy;
always @(posedge clock) SCK <= 0;
always @(negedge clock) SCK <= !CE_;
wire [1:0] low_addr;
assign low_addr[1] = !(write_bytes[3] || write_bytes[2]);
assign low_addr[0] = !(write_bytes[3] || write_bytes[1]);
assign read_data = ck_in_data;
always @(negedge clock) begin
if (enable_read)
ck_in_data <= {ck_in_data[30:0], SO};
end
always @(posedge clock or negedge reset_) begin
// $display("cyc%d %x %x", bit_counter, ck_out_data, ck_in_data);
if (reset_ == 0) begin
CE_ <= 1;
enable_read <= 0;
bit_counter <= 0;
end else begin
if (bit_counter == 0) begin
if (do_write) begin
{SI, ck_out_data}
<= {write_cmd, addr, low_addr, write_data[7:0], 1'b0};
bit_counter <= 40;
CE_ <= 0;
busy <= 1;
end
else if (do_read) begin
{SI, ck_out_data} <= {read_cmd, addr, 11'b0};
bit_counter <= 63; // It might be 32+31
CE_ <= 0; // right time or one cycle later??
enable_read <= 1;
busy <= 1;
end else begin
CE_ <= 1;
enable_read <= 0;
busy <= 0;
end
end else begin
{SI, ck_out_data} <= {ck_out_data, 1'b0};
bit_counter <= bit_counter - 1;
busy <= 1;
end
end
end
endmodule
iverilog spi_controller.v spi_prom_sim.v spi_test.v && ./a.out
VCD info: dumpfile test.vcd opened for output.
time addr EB read E write I O E C
0 xxxxxx x1 xxxxxxxx x xxxxxxxx xxxx x z x 0
3 xxxxxx 01 xxxxxxxx 0 xxxxxxxx xxxx x z 1 0
120 xxxxxx 00 xxxxxxxx 0 xxxxxxxx xxxx x z 1 0
123 000008 00 xxxxxxxx 1 cafebabe 0001 x z 1 0
140 000008 01 xxxxxxxx 1 cafebabe 0001 0 z 0 0
143 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
150 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
160 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
170 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
180 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
190 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
200 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
210 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
220 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
230 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
240 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
250 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
260 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
270 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
280 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
290 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
300 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
310 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
320 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
330 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
340 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
350 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
360 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
370 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
380 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
390 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
400 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
410 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
420 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
430 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
440 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
450 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
460 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
470 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
480 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
490 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
500 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
510 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
520 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
530 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
540 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
550 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
560 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
570 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
580 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
590 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
600 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
610 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
620 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
630 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
640 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
650 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
660 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
670 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
680 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
690 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
700 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
710 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
720 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
730 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
740 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
750 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
760 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
770 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
780 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
790 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
800 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
810 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
820 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
830 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
840 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
850 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
860 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
870 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
880 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
890 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
900 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 0
910 000008 01 xxxxxxxx 0 cafebabe 0001 1 z 0 1
920 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
930 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
940 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
950 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 1
960 000008 00 xxxxxxxx 0 cafebabe 0001 0 z 1 0
1143 000008 10 xxxxxxxx 0 cafebabe 0001 0 z 1 0
1160 000008 11 xxxxxxxx 0 cafebabe 0001 0 z 0 0
1163 000008 01 xxxxxxxx 0 cafebabe 0001 0 z 0 0
1170 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 1
1180 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 0
1190 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 1
1200 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 0
1210 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 1
1220 000008 01 xxxxxxxX 0 cafebabe 0001 0 z 0 0
1230 000008 01 xxxxxxxz 0 cafebabe 0001 0 z 0 1
1240 000008 01 xxxxxxxz 0 cafebabe 0001 0 z 0 0
1250 000008 01 xxxxxxXz 0 cafebabe 0001 0 z 0 1
1260 000008 01 xxxxxxXz 0 cafebabe 0001 0 z 0 0
1270 000008 01 xxxxxxXz 0 cafebabe 0001 0 z 0 1
1280 000008 01 xxxxxxXz 0 cafebabe 0001 1 z 0 0
1290 000008 01 xxxxxxXz 0 cafebabe 0001 1 z 0 1
1300 000008 01 xxxxxxXz 0 cafebabe 0001 1 z 0 0
1310 000008 01 xxxxxxzz 0 cafebabe 0001 1 z 0 1
1320 000008 01 xxxxxxzz 0 cafebabe 0001 0 z 0 0
1330 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 1
1340 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 0
1350 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 1
1360 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 0
1370 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 1
1380 000008 01 xxxxxXzz 0 cafebabe 0001 0 z 0 0
1390 000008 01 xxxxxzzz 0 cafebabe 0001 0 z 0 1
1400 000008 01 xxxxxzzz 0 cafebabe 0001 0 z 0 0
1410 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 1
1420 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 0
1430 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 1
1440 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 0
1450 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 1
1460 000008 01 xxxxXzzz 0 cafebabe 0001 0 z 0 0
1470 000008 01 xxxxzzzz 0 cafebabe 0001 0 z 0 1
1480 000008 01 xxxxzzzz 0 cafebabe 0001 0 z 0 0
1490 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 1
1500 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 0
1510 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 1
1520 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 0
1530 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 1
1540 000008 01 xxxXzzzz 0 cafebabe 0001 0 z 0 0
1550 000008 01 xxxzzzzz 0 cafebabe 0001 0 z 0 1
1560 000008 01 xxxzzzzz 0 cafebabe 0001 0 z 0 0
1570 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 1
1580 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 0
1590 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 1
1600 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 0
1610 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 1
1620 000008 01 xxXzzzzz 0 cafebabe 0001 0 z 0 0
1630 000008 01 xxzzzzzz 0 cafebabe 0001 0 z 0 1
1640 000008 01 xxzzzzzz 0 cafebabe 0001 0 z 0 0
1650 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 1
1660 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 0
1670 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 1
1680 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 0
1690 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 1
1700 000008 01 xXzzzzzz 0 cafebabe 0001 0 z 0 0
1710 000008 01 xzzzzzzz 0 cafebabe 0001 0 z 0 1
1720 000008 01 xzzzzzzz 0 cafebabe 0001 1 z 0 0
1730 000008 01 Xzzzzzzz 0 cafebabe 0001 1 z 0 1
1740 000008 01 Xzzzzzzz 0 cafebabe 0001 0 z 0 0
1750 000008 01 Xzzzzzzz 0 cafebabe 0001 0 z 0 1
1760 000008 01 Xzzzzzzz 0 cafebabe 0001 0 z 0 0
1770 000008 01 Xzzzzzzz 0 cafebabe 0001 0 z 0 1
1780 000008 01 Xzzzzzzz 0 cafebabe 0001 0 z 0 0
1790 000008 01 zzzzzzzz 0 cafebabe 0001 0 z 0 1
1800 000008 01 zzzzzzzz 0 cafebabe 0001 0 x 0 0
1810 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 1
1820 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 0
1830 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 1
1840 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 0
1850 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 1
1860 000008 01 zzzzzzzX 0 cafebabe 0001 0 x 0 0
1870 000008 01 zzzzzzzx 0 cafebabe 0001 0 x 0 1
1880 000008 01 zzzzzzzx 0 cafebabe 0001 0 x 0 0
1890 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 1
1900 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 0
1910 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 1
1920 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 0
1930 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 1
1940 000008 01 zzzzzzXx 0 cafebabe 0001 0 x 0 0
1950 000008 01 zzzzzzxx 0 cafebabe 0001 0 x 0 1
1960 000008 01 zzzzzzxx 0 cafebabe 0001 0 x 0 0
1970 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 1
1980 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 0
1990 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 1
2000 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 0
2010 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 1
2020 000008 01 zzzzzXxx 0 cafebabe 0001 0 x 0 0
2030 000008 01 zzzzzxxx 0 cafebabe 0001 0 x 0 1
2040 000008 01 zzzzzxxx 0 cafebabe 0001 0 x 0 0
2050 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 1
2060 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 0
2070 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 1
2080 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 0
2090 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 1
2100 000008 01 zzzzXxxx 0 cafebabe 0001 0 x 0 0
2110 000008 01 zzzzxxxx 0 cafebabe 0001 0 x 0 1
2120 000008 01 zzzzxxxx 0 cafebabe 0001 0 x 0 0
2130 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 1
2140 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 0
2150 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 1
2160 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 0
2170 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 1
2180 000008 01 zzzXxxxx 0 cafebabe 0001 0 x 0 0
2190 000008 01 zzzxxxxx 0 cafebabe 0001 0 x 0 1
2200 000008 01 zzzxxxxx 0 cafebabe 0001 0 x 0 0
2210 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 1
2220 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 0
2230 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 1
2240 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 0
2250 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 1
2260 000008 01 zzXxxxxx 0 cafebabe 0001 0 x 0 0
2270 000008 01 zzxxxxxx 0 cafebabe 0001 0 x 0 1
2280 000008 01 zzxxxxxx 0 cafebabe 0001 0 x 0 0
2283 000008 01 zzxxxxxx 0 cafebabe 0001 0 1 0 0
2290 000008 01 zXxxxxxX 0 cafebabe 0001 0 1 0 1
2300 000008 01 zXxxxxxX 0 cafebabe 0001 0 x 0 0
2303 000008 01 zXxxxxxX 0 cafebabe 0001 0 0 0 0
2310 000008 01 zXxxxxxX 0 cafebabe 0001 0 0 0 1
2320 000008 01 zXxxxxxX 0 cafebabe 0001 0 x 0 0
2323 000008 01 zXxxxxxX 0 cafebabe 0001 0 1 0 0
2330 000008 01 zXxxxxxX 0 cafebabe 0001 0 1 0 1
2340 000008 01 zXxxxxxX 0 cafebabe 0001 0 x 0 0
2343 000008 01 zXxxxxxX 0 cafebabe 0001 0 1 0 0
2350 000008 01 zxxxxxxb 0 cafebabe 0001 0 1 0 1
2360 000008 01 zxxxxxxb 0 cafebabe 0001 0 x 0 0
2363 000008 01 zxxxxxxb 0 cafebabe 0001 0 1 0 0
2370 000008 01 XxxxxxX7 0 cafebabe 0001 0 1 0 1
2380 000008 01 XxxxxxX7 0 cafebabe 0001 0 x 0 0
2383 000008 01 XxxxxxX7 0 cafebabe 0001 0 1 0 0
2390 000008 01 XxxxxxXf 0 cafebabe 0001 0 1 0 1
2400 000008 01 XxxxxxXf 0 cafebabe 0001 0 x 0 0
2403 000008 01 XxxxxxXf 0 cafebabe 0001 0 1 0 0
2410 000008 01 XxxxxxXf 0 cafebabe 0001 0 1 0 1
2420 000008 01 XxxxxxXf 0 cafebabe 0001 0 x 0 0
2423 000008 01 XxxxxxXf 0 cafebabe 0001 0 0 0 0
2430 000008 01 xxxxxxbe 0 cafebabe 0001 0 0 0 1
2440 000008 00 xxxxxxbe 0 cafebabe 0001 0 x 1 0
2445 000008 00 xxxxxxbe 0 cafebabe 0001 0 z 1 0
_______________________________________________
Open-graphics mailing list
[email protected]
http://lists.duskglow.com/mailman/listinfo/open-graphics
List service provided by Duskglow Consulting, LLC (www.duskglow.com)