1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
module cpld_model
(input aux_clk, input start, input mode, input done,
output dout, output reg sclk, output detached);
reg [7:0] rom[0:65535];
reg [15:0] addr;
reg [7:0] data;
assign dout = data[7];
reg [2:0] state, bitcnt;
localparam IDLE = 3'd0;
localparam READ = 3'd1;
localparam BIT1 = 3'd2;
localparam BIT2 = 3'd3;
localparam DONE = 3'd4;
localparam DETACHED = 3'd5;
localparam ERROR = 3'd7;
integer i;
reg [1023:0] ROMFile;
initial begin
for (i=0;i<65536;i=i+1) begin
rom[i] <= 32'h0;
end
if ( !$value$plusargs( "rom=%s", ROMFile ) )
begin
$display( "Using default ROM file, 'flash.rom'" );
ROMFile = "flash.rom";
end
else
$display( "Using %s as ROM file.", ROMFile);
#1 $readmemh( ROMFile,rom );
end
initial addr = 16'd0;
initial data = 8'd0;
initial state = IDLE;
initial bitcnt = 3'd0;
initial sclk = 1'b0;
always @(posedge aux_clk)
case(state)
IDLE :
if(start)
if(~mode)
state <= READ;
else
state <= ERROR;
READ :
if(done)
state <= DONE;
else
begin
data <= rom[addr];
addr <= addr + 1;
bitcnt <= 3'd0;
if(addr==16'hFFFF)
state <= ERROR;
else
state <= BIT1;
end // else: !if(start)
BIT1 :
begin
sclk <= 1'b1;
state <= BIT2;
end
BIT2 :
begin
sclk <= 1'b0;
data <= {data[6:0],1'b0};
bitcnt <= bitcnt + 1;
if(bitcnt==7)
state <= READ;
else
state <=BIT1;
end
DONE :
begin
if(start)
state <= ERROR;
else
state <= DETACHED;
end
DETACHED :
if(start)
state <= ERROR;
endcase // case(state)
assign detached = (state == DETACHED) || (state == IDLE);
endmodule // cpld_model
|