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)

Reply via email to