|
@@ -94,7 +94,7 @@ module sdcard (
|
|
|
|
|
|
// Output pins - tristate if card not present
|
|
// Output pins - tristate if card not present
|
|
assign sd_di = ~sd_cd_n ? sd_data_out : 1'bz;
|
|
assign sd_di = ~sd_cd_n ? sd_data_out : 1'bz;
|
|
- assign sd_sclk = ~sd_cd_n ? sd_clk_out : 1'bz;
|
|
|
|
|
|
+ assign sd_sclk = ~sd_cd_n ? sd_clk_out : 1'bz;
|
|
assign sd_cs_n = ~sd_cd_n ? ~sd_cs_reg : 1'bz;
|
|
assign sd_cs_n = ~sd_cd_n ? ~sd_cs_reg : 1'bz;
|
|
|
|
|
|
// If we try an action while a bus transaction is in progress,
|
|
// If we try an action while a bus transaction is in progress,
|
|
@@ -215,11 +215,28 @@ module sdcard (
|
|
endcase
|
|
endcase
|
|
|
|
|
|
// Begin transaction
|
|
// Begin transaction
|
|
- if (addr[3] & (|addr[1:0]))
|
|
|
|
- begin
|
|
|
|
- sd_active <= 1'b1;
|
|
|
|
- sd_out_ctr <= { ~addr[0], ~addr[1], 3'b000 };
|
|
|
|
- end
|
|
|
|
|
|
+ // Note: sd_out_ctr *increments*
|
|
|
|
+ if (addr[3])
|
|
|
|
+ case (addr[1:0])
|
|
|
|
+ 2'b01: begin
|
|
|
|
+ /* Start 8-bit transaction */
|
|
|
|
+ sd_active <= 1'b1;
|
|
|
|
+ sd_out_ctr <= 5'b11_000;
|
|
|
|
+ end
|
|
|
|
+ 2'b10: begin
|
|
|
|
+ /* Start 16-bit transaction */
|
|
|
|
+ sd_active <= 1'b1;
|
|
|
|
+ sd_out_ctr <= 5'b10_000;
|
|
|
|
+ end
|
|
|
|
+ 2'b11: begin
|
|
|
|
+ /* Start 32-bit transaction */
|
|
|
|
+ sd_active <= 1'b1;
|
|
|
|
+ sd_out_ctr <= 5'b00_000;
|
|
|
|
+ end
|
|
|
|
+ default: begin
|
|
|
|
+ // do nothing
|
|
|
|
+ end
|
|
|
|
+ endcase // case (addr[1:0])
|
|
end // if (sd_cmd)
|
|
end // if (sd_cmd)
|
|
end // else: !if(~rst_n)
|
|
end // else: !if(~rst_n)
|
|
|
|
|
|
@@ -248,9 +265,11 @@ module sdcard (
|
|
else if (sd_crcstb)
|
|
else if (sd_crcstb)
|
|
begin
|
|
begin
|
|
sd_crc7[i] <= { sd_crc7[i][5:0], 1'b0 }
|
|
sd_crc7[i] <= { sd_crc7[i][5:0], 1'b0 }
|
|
- ^ ({7{sd_crcbit[i]}} & crc7_poly);
|
|
|
|
|
|
+ ^ ({7{sd_crcbit[i] ^ sd_crc7[i][6]}}
|
|
|
|
+ & crc7_poly);
|
|
sd_crc16[i] <= { sd_crc16[i][14:0], 1'b0 }
|
|
sd_crc16[i] <= { sd_crc16[i][14:0], 1'b0 }
|
|
- ^ ({16{sd_crcbit[i]}} & crc16_poly);
|
|
|
|
|
|
+ ^ ({16{sd_crcbit[i] ^ sd_crc16[i][15]}}
|
|
|
|
+ & crc16_poly);
|
|
end // else: !if(clear_crc[i])
|
|
end // else: !if(clear_crc[i])
|
|
end // for (int i = 0; i < 2; i = i+1)
|
|
end // for (int i = 0; i < 2; i = i+1)
|
|
|
|
|
|
@@ -261,7 +280,7 @@ module sdcard (
|
|
5'b0_0000: rdata = { 24'b0, sd_cs_reg, sd_clk_div };
|
|
5'b0_0000: rdata = { 24'b0, sd_cs_reg, sd_clk_div };
|
|
5'b0_0010: rdata = { sd_crc16[0], 8'b0, sd_crc7[0], 1'b1 };
|
|
5'b0_0010: rdata = { sd_crc16[0], 8'b0, sd_crc7[0], 1'b1 };
|
|
5'b0_0011: rdata = { sd_crc16[1], 8'b0, sd_crc7[1], 1'b1 };
|
|
5'b0_0011: rdata = { sd_crc16[1], 8'b0, sd_crc7[1], 1'b1 };
|
|
- 5'b?_01??: rdata = { sd_shr_in_q[7:0], sd_shr_in_q[15:8],
|
|
|
|
|
|
+ 5'b?_10??: rdata = { sd_shr_in_q[7:0], sd_shr_in_q[15:8],
|
|
sd_shr_in_q[23:16], sd_shr_in_q[31:24] };
|
|
sd_shr_in_q[23:16], sd_shr_in_q[31:24] };
|
|
5'b?_11??: rdata = sd_shr_in_q;
|
|
5'b?_11??: rdata = sd_shr_in_q;
|
|
default: rdata = 32'hxxxx_xxxx;
|
|
default: rdata = 32'hxxxx_xxxx;
|