9 Commits

Author SHA1 Message Date
uelen 39894196dd Add verification section to design.pdf
ci/woodpecker/push/test-workflow Pipeline was successful
2025-06-12 20:20:06 -07:00
uelen d4d890f0ea Update design doc
ci/woodpecker/push/test-workflow Pipeline was successful
2025-06-12 20:07:05 -07:00
uelen 180857bb39 Add design document
ci/woodpecker/push/test-workflow Pipeline was successful
2025-06-11 22:50:03 -07:00
uelen 43573f5d8f Added a few more demos and one last attempt
ci/woodpecker/push/test-workflow Pipeline was successful
at audio fixup. It did nothing of course lol

Reverted back to 16-bit pcm because it sounds marginally better than
8-bit
2025-06-10 14:27:39 -07:00
uelen 89131404a3 Merge pull request 'comment_clean_up' (#4) from comment_clean_up into master
ci/woodpecker/push/test-workflow Pipeline was successful
Reviewed-on: #4
2025-06-10 20:40:39 +00:00
uelen ce217dbbdf Merge branch 'master' into comment_clean_up 2025-06-10 13:32:14 -07:00
uelen f840d27b8e Demo commit
ci/woodpecker/push/test-workflow Pipeline was successful
The audio output is still messed up, but this commit gets everything as
ready as it can get. Fixed up all the testbenches and added state
machines for everything
2025-06-10 13:26:35 -07:00
Dilanthi 9af830daa0 comment clean up 2025-06-10 02:51:18 -07:00
Dilanthi 53b48c0bce comment clean up for segment_display folder 2025-06-10 01:38:52 -07:00
37 changed files with 1421 additions and 357 deletions
+22 -77
View File
@@ -217,29 +217,6 @@ set_property -dict {PACKAGE_PIN D12 IOSTANDARD LVCMOS33} [get_ports AUD_SD]
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn #set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
connect_debug_port u_ila_0/probe2 [get_nets [list {realSdPlayer/address[0]} {realSdPlayer/address[1]} {realSdPlayer/address[2]} {realSdPlayer/address[3]} {realSdPlayer/address[4]} {realSdPlayer/address[5]} {realSdPlayer/address[6]} {realSdPlayer/address[7]} {realSdPlayer/address[8]} {realSdPlayer/address[9]} {realSdPlayer/address[10]} {realSdPlayer/address[11]} {realSdPlayer/address[12]} {realSdPlayer/address[13]} {realSdPlayer/address[14]} {realSdPlayer/address[15]} {realSdPlayer/address[16]} {realSdPlayer/address[17]} {realSdPlayer/address[18]} {realSdPlayer/address[19]} {realSdPlayer/address[20]} {realSdPlayer/address[21]} {realSdPlayer/address[22]} {realSdPlayer/address[23]} {realSdPlayer/address[24]} {realSdPlayer/address[25]} {realSdPlayer/address[26]} {realSdPlayer/address[27]} {realSdPlayer/address[28]} {realSdPlayer/address[29]} {realSdPlayer/address[30]} {realSdPlayer/address[31]}]]
set_property MARK_DEBUG true [get_nets reset]
connect_debug_port u_ila_0/probe4 [get_nets [list {realSdPlayer/reader/next_state[0]} {realSdPlayer/reader/next_state[1]} {realSdPlayer/reader/next_state[2]}]]
connect_debug_port u_ila_0/probe7 [get_nets [list {realSdPlayer/reader/state[0]} {realSdPlayer/reader/state[1]} {realSdPlayer/reader/state[2]}]]
connect_debug_port u_ila_0/probe6 [get_nets [list {realSdPlayer/sender/to_send[0]} {realSdPlayer/sender/to_send[1]} {realSdPlayer/sender/to_send[2]} {realSdPlayer/sender/to_send[3]} {realSdPlayer/sender/to_send[4]} {realSdPlayer/sender/to_send[5]} {realSdPlayer/sender/to_send[6]} {realSdPlayer/sender/to_send[7]} {realSdPlayer/sender/to_send[8]} {realSdPlayer/sender/to_send[9]} {realSdPlayer/sender/to_send[10]} {realSdPlayer/sender/to_send[11]} {realSdPlayer/sender/to_send[12]} {realSdPlayer/sender/to_send[13]} {realSdPlayer/sender/to_send[14]} {realSdPlayer/sender/to_send[15]} {realSdPlayer/sender/to_send[16]} {realSdPlayer/sender/to_send[17]} {realSdPlayer/sender/to_send[18]} {realSdPlayer/sender/to_send[19]} {realSdPlayer/sender/to_send[20]} {realSdPlayer/sender/to_send[21]} {realSdPlayer/sender/to_send[22]} {realSdPlayer/sender/to_send[23]} {realSdPlayer/sender/to_send[24]} {realSdPlayer/sender/to_send[25]} {realSdPlayer/sender/to_send[26]} {realSdPlayer/sender/to_send[27]} {realSdPlayer/sender/to_send[28]} {realSdPlayer/sender/to_send[29]} {realSdPlayer/sender/to_send[30]} {realSdPlayer/sender/to_send[31]} {realSdPlayer/sender/to_send[32]} {realSdPlayer/sender/to_send[33]} {realSdPlayer/sender/to_send[34]} {realSdPlayer/sender/to_send[35]} {realSdPlayer/sender/to_send[36]} {realSdPlayer/sender/to_send[37]} {realSdPlayer/sender/to_send[38]} {realSdPlayer/sender/to_send[39]} {realSdPlayer/sender/to_send[40]} {realSdPlayer/sender/to_send[41]} {realSdPlayer/sender/to_send[42]} {realSdPlayer/sender/to_send[43]} {realSdPlayer/sender/to_send[44]} {realSdPlayer/sender/to_send[45]} {realSdPlayer/sender/to_send[46]} {realSdPlayer/sender/to_send[47]}]]
set_property MARK_DEBUG true [get_nets realSdPlayer/fast_clk]
connect_debug_port u_ila_0/probe8 [get_nets [list {realSdPlayer/fastSender/to_send[0]} {realSdPlayer/fastSender/to_send[1]} {realSdPlayer/fastSender/to_send[2]} {realSdPlayer/fastSender/to_send[3]} {realSdPlayer/fastSender/to_send[4]} {realSdPlayer/fastSender/to_send[5]} {realSdPlayer/fastSender/to_send[6]} {realSdPlayer/fastSender/to_send[7]} {realSdPlayer/fastSender/to_send[8]} {realSdPlayer/fastSender/to_send[9]} {realSdPlayer/fastSender/to_send[10]} {realSdPlayer/fastSender/to_send[11]} {realSdPlayer/fastSender/to_send[12]} {realSdPlayer/fastSender/to_send[13]} {realSdPlayer/fastSender/to_send[14]} {realSdPlayer/fastSender/to_send[15]} {realSdPlayer/fastSender/to_send[16]} {realSdPlayer/fastSender/to_send[17]} {realSdPlayer/fastSender/to_send[18]} {realSdPlayer/fastSender/to_send[19]} {realSdPlayer/fastSender/to_send[20]} {realSdPlayer/fastSender/to_send[21]} {realSdPlayer/fastSender/to_send[22]} {realSdPlayer/fastSender/to_send[23]} {realSdPlayer/fastSender/to_send[24]} {realSdPlayer/fastSender/to_send[25]} {realSdPlayer/fastSender/to_send[26]} {realSdPlayer/fastSender/to_send[27]} {realSdPlayer/fastSender/to_send[28]} {realSdPlayer/fastSender/to_send[29]} {realSdPlayer/fastSender/to_send[30]} {realSdPlayer/fastSender/to_send[31]} {realSdPlayer/fastSender/to_send[32]} {realSdPlayer/fastSender/to_send[33]} {realSdPlayer/fastSender/to_send[34]} {realSdPlayer/fastSender/to_send[35]} {realSdPlayer/fastSender/to_send[36]} {realSdPlayer/fastSender/to_send[37]} {realSdPlayer/fastSender/to_send[38]} {realSdPlayer/fastSender/to_send[39]} {realSdPlayer/fastSender/to_send[40]} {realSdPlayer/fastSender/to_send[41]} {realSdPlayer/fastSender/to_send[42]} {realSdPlayer/fastSender/to_send[43]} {realSdPlayer/fastSender/to_send[44]} {realSdPlayer/fastSender/to_send[45]} {realSdPlayer/fastSender/to_send[46]} {realSdPlayer/fastSender/to_send[47]}]]
connect_debug_port u_ila_0/probe19 [get_nets [list realSdPlayer/send_command_ready_fast]]
connect_debug_port u_ila_0/probe21 [get_nets [list realSdPlayer/send_command_start_fast]]
set_property MARK_DEBUG true [get_nets realSdPlayer/sd_cmd_OBUF]
create_debug_core u_ila_0 ila create_debug_core u_ila_0 ila
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0] set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
set_property ALL_PROBE_SAME_MU_CNT 2 [get_debug_cores u_ila_0] set_property ALL_PROBE_SAME_MU_CNT 2 [get_debug_cores u_ila_0]
@@ -252,92 +229,60 @@ set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
set_property port_width 1 [get_debug_ports u_ila_0/clk] set_property port_width 1 [get_debug_ports u_ila_0/clk]
connect_debug_port u_ila_0/clk [get_nets [list CLK100MHZ_IBUF_BUFG]] connect_debug_port u_ila_0/clk [get_nets [list CLK100MHZ_IBUF_BUFG]]
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
set_property port_width 6 [get_debug_ports u_ila_0/probe0] set_property port_width 48 [get_debug_ports u_ila_0/probe0]
connect_debug_port u_ila_0/probe0 [get_nets [list {realSdPlayer/next_state[0]} {realSdPlayer/next_state[1]} {realSdPlayer/next_state[2]} {realSdPlayer/next_state[3]} {realSdPlayer/next_state[4]} {realSdPlayer/next_state[5]}]] connect_debug_port u_ila_0/probe0 [get_nets [list {realSdPlayer/slowSender/to_send[0]} {realSdPlayer/slowSender/to_send[1]} {realSdPlayer/slowSender/to_send[2]} {realSdPlayer/slowSender/to_send[3]} {realSdPlayer/slowSender/to_send[4]} {realSdPlayer/slowSender/to_send[5]} {realSdPlayer/slowSender/to_send[6]} {realSdPlayer/slowSender/to_send[7]} {realSdPlayer/slowSender/to_send[8]} {realSdPlayer/slowSender/to_send[9]} {realSdPlayer/slowSender/to_send[10]} {realSdPlayer/slowSender/to_send[11]} {realSdPlayer/slowSender/to_send[12]} {realSdPlayer/slowSender/to_send[13]} {realSdPlayer/slowSender/to_send[14]} {realSdPlayer/slowSender/to_send[15]} {realSdPlayer/slowSender/to_send[16]} {realSdPlayer/slowSender/to_send[17]} {realSdPlayer/slowSender/to_send[18]} {realSdPlayer/slowSender/to_send[19]} {realSdPlayer/slowSender/to_send[20]} {realSdPlayer/slowSender/to_send[21]} {realSdPlayer/slowSender/to_send[22]} {realSdPlayer/slowSender/to_send[23]} {realSdPlayer/slowSender/to_send[24]} {realSdPlayer/slowSender/to_send[25]} {realSdPlayer/slowSender/to_send[26]} {realSdPlayer/slowSender/to_send[27]} {realSdPlayer/slowSender/to_send[28]} {realSdPlayer/slowSender/to_send[29]} {realSdPlayer/slowSender/to_send[30]} {realSdPlayer/slowSender/to_send[31]} {realSdPlayer/slowSender/to_send[32]} {realSdPlayer/slowSender/to_send[33]} {realSdPlayer/slowSender/to_send[34]} {realSdPlayer/slowSender/to_send[35]} {realSdPlayer/slowSender/to_send[36]} {realSdPlayer/slowSender/to_send[37]} {realSdPlayer/slowSender/to_send[38]} {realSdPlayer/slowSender/to_send[39]} {realSdPlayer/slowSender/to_send[40]} {realSdPlayer/slowSender/to_send[41]} {realSdPlayer/slowSender/to_send[42]} {realSdPlayer/slowSender/to_send[43]} {realSdPlayer/slowSender/to_send[44]} {realSdPlayer/slowSender/to_send[45]} {realSdPlayer/slowSender/to_send[46]} {realSdPlayer/slowSender/to_send[47]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
set_property port_width 6 [get_debug_ports u_ila_0/probe1] set_property port_width 48 [get_debug_ports u_ila_0/probe1]
connect_debug_port u_ila_0/probe1 [get_nets [list {realSdPlayer/state[0]} {realSdPlayer/state[1]} {realSdPlayer/state[2]} {realSdPlayer/state[3]} {realSdPlayer/state[4]} {realSdPlayer/state[5]}]] connect_debug_port u_ila_0/probe1 [get_nets [list {realSdPlayer/received_data[0]} {realSdPlayer/received_data[1]} {realSdPlayer/received_data[2]} {realSdPlayer/received_data[3]} {realSdPlayer/received_data[4]} {realSdPlayer/received_data[5]} {realSdPlayer/received_data[6]} {realSdPlayer/received_data[7]} {realSdPlayer/received_data[8]} {realSdPlayer/received_data[9]} {realSdPlayer/received_data[10]} {realSdPlayer/received_data[11]} {realSdPlayer/received_data[12]} {realSdPlayer/received_data[13]} {realSdPlayer/received_data[14]} {realSdPlayer/received_data[15]} {realSdPlayer/received_data[16]} {realSdPlayer/received_data[17]} {realSdPlayer/received_data[18]} {realSdPlayer/received_data[19]} {realSdPlayer/received_data[20]} {realSdPlayer/received_data[21]} {realSdPlayer/received_data[22]} {realSdPlayer/received_data[23]} {realSdPlayer/received_data[24]} {realSdPlayer/received_data[25]} {realSdPlayer/received_data[26]} {realSdPlayer/received_data[27]} {realSdPlayer/received_data[28]} {realSdPlayer/received_data[29]} {realSdPlayer/received_data[30]} {realSdPlayer/received_data[31]} {realSdPlayer/received_data[32]} {realSdPlayer/received_data[33]} {realSdPlayer/received_data[34]} {realSdPlayer/received_data[35]} {realSdPlayer/received_data[36]} {realSdPlayer/received_data[37]} {realSdPlayer/received_data[38]} {realSdPlayer/received_data[39]} {realSdPlayer/received_data[40]} {realSdPlayer/received_data[41]} {realSdPlayer/received_data[42]} {realSdPlayer/received_data[43]} {realSdPlayer/received_data[44]} {realSdPlayer/received_data[45]} {realSdPlayer/received_data[46]} {realSdPlayer/received_data[47]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
set_property port_width 11 [get_debug_ports u_ila_0/probe2] set_property port_width 4 [get_debug_ports u_ila_0/probe2]
connect_debug_port u_ila_0/probe2 [get_nets [list {realSdPlayer/dataHandler/buffer\\.addra[0]} {realSdPlayer/dataHandler/buffer\\.addra[1]} {realSdPlayer/dataHandler/buffer\\.addra[2]} {realSdPlayer/dataHandler/buffer\\.addra[3]} {realSdPlayer/dataHandler/buffer\\.addra[4]} {realSdPlayer/dataHandler/buffer\\.addra[5]} {realSdPlayer/dataHandler/buffer\\.addra[6]} {realSdPlayer/dataHandler/buffer\\.addra[7]} {realSdPlayer/dataHandler/buffer\\.addra[8]} {realSdPlayer/dataHandler/buffer\\.addra[9]} {realSdPlayer/dataHandler/buffer\\.addra[10]}]] connect_debug_port u_ila_0/probe2 [get_nets [list {realSdPlayer/sd_data[0]} {realSdPlayer/sd_data[1]} {realSdPlayer/sd_data[2]} {realSdPlayer/sd_data[3]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
set_property port_width 32 [get_debug_ports u_ila_0/probe3] set_property port_width 6 [get_debug_ports u_ila_0/probe3]
connect_debug_port u_ila_0/probe3 [get_nets [list {realSdPlayer/arg[0]} {realSdPlayer/arg[1]} {realSdPlayer/arg[2]} {realSdPlayer/arg[3]} {realSdPlayer/arg[4]} {realSdPlayer/arg[5]} {realSdPlayer/arg[6]} {realSdPlayer/arg[7]} {realSdPlayer/arg[8]} {realSdPlayer/arg[9]} {realSdPlayer/arg[10]} {realSdPlayer/arg[11]} {realSdPlayer/arg[12]} {realSdPlayer/arg[13]} {realSdPlayer/arg[14]} {realSdPlayer/arg[15]} {realSdPlayer/arg[16]} {realSdPlayer/arg[17]} {realSdPlayer/arg[18]} {realSdPlayer/arg[19]} {realSdPlayer/arg[20]} {realSdPlayer/arg[21]} {realSdPlayer/arg[22]} {realSdPlayer/arg[23]} {realSdPlayer/arg[24]} {realSdPlayer/arg[25]} {realSdPlayer/arg[26]} {realSdPlayer/arg[27]} {realSdPlayer/arg[28]} {realSdPlayer/arg[29]} {realSdPlayer/arg[30]} {realSdPlayer/arg[31]}]] connect_debug_port u_ila_0/probe3 [get_nets [list {realSdPlayer/cmd[0]} {realSdPlayer/cmd[1]} {realSdPlayer/cmd[2]} {realSdPlayer/cmd[3]} {realSdPlayer/cmd[4]} {realSdPlayer/cmd[5]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
set_property port_width 48 [get_debug_ports u_ila_0/probe4] set_property port_width 16 [get_debug_ports u_ila_0/probe4]
connect_debug_port u_ila_0/probe4 [get_nets [list {realSdPlayer/received_data[0]} {realSdPlayer/received_data[1]} {realSdPlayer/received_data[2]} {realSdPlayer/received_data[3]} {realSdPlayer/received_data[4]} {realSdPlayer/received_data[5]} {realSdPlayer/received_data[6]} {realSdPlayer/received_data[7]} {realSdPlayer/received_data[8]} {realSdPlayer/received_data[9]} {realSdPlayer/received_data[10]} {realSdPlayer/received_data[11]} {realSdPlayer/received_data[12]} {realSdPlayer/received_data[13]} {realSdPlayer/received_data[14]} {realSdPlayer/received_data[15]} {realSdPlayer/received_data[16]} {realSdPlayer/received_data[17]} {realSdPlayer/received_data[18]} {realSdPlayer/received_data[19]} {realSdPlayer/received_data[20]} {realSdPlayer/received_data[21]} {realSdPlayer/received_data[22]} {realSdPlayer/received_data[23]} {realSdPlayer/received_data[24]} {realSdPlayer/received_data[25]} {realSdPlayer/received_data[26]} {realSdPlayer/received_data[27]} {realSdPlayer/received_data[28]} {realSdPlayer/received_data[29]} {realSdPlayer/received_data[30]} {realSdPlayer/received_data[31]} {realSdPlayer/received_data[32]} {realSdPlayer/received_data[33]} {realSdPlayer/received_data[34]} {realSdPlayer/received_data[35]} {realSdPlayer/received_data[36]} {realSdPlayer/received_data[37]} {realSdPlayer/received_data[38]} {realSdPlayer/received_data[39]} {realSdPlayer/received_data[40]} {realSdPlayer/received_data[41]} {realSdPlayer/received_data[42]} {realSdPlayer/received_data[43]} {realSdPlayer/received_data[44]} {realSdPlayer/received_data[45]} {realSdPlayer/received_data[46]} {realSdPlayer/received_data[47]}]] connect_debug_port u_ila_0/probe4 [get_nets [list {audioOutput/sample_buffer[0]} {audioOutput/sample_buffer[1]} {audioOutput/sample_buffer[2]} {audioOutput/sample_buffer[3]} {audioOutput/sample_buffer[4]} {audioOutput/sample_buffer[5]} {audioOutput/sample_buffer[6]} {audioOutput/sample_buffer[7]} {audioOutput/sample_buffer[8]} {audioOutput/sample_buffer[9]} {audioOutput/sample_buffer[10]} {audioOutput/sample_buffer[11]} {audioOutput/sample_buffer[12]} {audioOutput/sample_buffer[13]} {audioOutput/sample_buffer[14]} {audioOutput/sample_buffer[15]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
set_property port_width 48 [get_debug_ports u_ila_0/probe5] set_property port_width 10 [get_debug_ports u_ila_0/probe5]
connect_debug_port u_ila_0/probe5 [get_nets [list {realSdPlayer/slowSender/to_send[0]} {realSdPlayer/slowSender/to_send[1]} {realSdPlayer/slowSender/to_send[2]} {realSdPlayer/slowSender/to_send[3]} {realSdPlayer/slowSender/to_send[4]} {realSdPlayer/slowSender/to_send[5]} {realSdPlayer/slowSender/to_send[6]} {realSdPlayer/slowSender/to_send[7]} {realSdPlayer/slowSender/to_send[8]} {realSdPlayer/slowSender/to_send[9]} {realSdPlayer/slowSender/to_send[10]} {realSdPlayer/slowSender/to_send[11]} {realSdPlayer/slowSender/to_send[12]} {realSdPlayer/slowSender/to_send[13]} {realSdPlayer/slowSender/to_send[14]} {realSdPlayer/slowSender/to_send[15]} {realSdPlayer/slowSender/to_send[16]} {realSdPlayer/slowSender/to_send[17]} {realSdPlayer/slowSender/to_send[18]} {realSdPlayer/slowSender/to_send[19]} {realSdPlayer/slowSender/to_send[20]} {realSdPlayer/slowSender/to_send[21]} {realSdPlayer/slowSender/to_send[22]} {realSdPlayer/slowSender/to_send[23]} {realSdPlayer/slowSender/to_send[24]} {realSdPlayer/slowSender/to_send[25]} {realSdPlayer/slowSender/to_send[26]} {realSdPlayer/slowSender/to_send[27]} {realSdPlayer/slowSender/to_send[28]} {realSdPlayer/slowSender/to_send[29]} {realSdPlayer/slowSender/to_send[30]} {realSdPlayer/slowSender/to_send[31]} {realSdPlayer/slowSender/to_send[32]} {realSdPlayer/slowSender/to_send[33]} {realSdPlayer/slowSender/to_send[34]} {realSdPlayer/slowSender/to_send[35]} {realSdPlayer/slowSender/to_send[36]} {realSdPlayer/slowSender/to_send[37]} {realSdPlayer/slowSender/to_send[38]} {realSdPlayer/slowSender/to_send[39]} {realSdPlayer/slowSender/to_send[40]} {realSdPlayer/slowSender/to_send[41]} {realSdPlayer/slowSender/to_send[42]} {realSdPlayer/slowSender/to_send[43]} {realSdPlayer/slowSender/to_send[44]} {realSdPlayer/slowSender/to_send[45]} {realSdPlayer/slowSender/to_send[46]} {realSdPlayer/slowSender/to_send[47]}]] connect_debug_port u_ila_0/probe5 [get_nets [list {audioBuffer/address[0]} {audioBuffer/address[1]} {audioBuffer/address[2]} {audioBuffer/address[3]} {audioBuffer/address[4]} {audioBuffer/address[5]} {audioBuffer/address[6]} {audioBuffer/address[7]} {audioBuffer/address[8]} {audioBuffer/address[9]}]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
set_property port_width 8 [get_debug_ports u_ila_0/probe6] set_property port_width 1 [get_debug_ports u_ila_0/probe6]
connect_debug_port u_ila_0/probe6 [get_nets [list {realSdPlayer/dataHandler/buffer\\.dina[0]} {realSdPlayer/dataHandler/buffer\\.dina[1]} {realSdPlayer/dataHandler/buffer\\.dina[2]} {realSdPlayer/dataHandler/buffer\\.dina[3]} {realSdPlayer/dataHandler/buffer\\.dina[4]} {realSdPlayer/dataHandler/buffer\\.dina[5]} {realSdPlayer/dataHandler/buffer\\.dina[6]} {realSdPlayer/dataHandler/buffer\\.dina[7]}]] connect_debug_port u_ila_0/probe6 [get_nets [list realSdPlayer/fast_clk]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
set_property port_width 6 [get_debug_ports u_ila_0/probe7] set_property port_width 1 [get_debug_ports u_ila_0/probe7]
connect_debug_port u_ila_0/probe7 [get_nets [list {realSdPlayer/cmd[0]} {realSdPlayer/cmd[1]} {realSdPlayer/cmd[2]} {realSdPlayer/cmd[3]} {realSdPlayer/cmd[4]} {realSdPlayer/cmd[5]}]] connect_debug_port u_ila_0/probe7 [get_nets [list realSdPlayer/read_command_listen]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
set_property port_width 1 [get_debug_ports u_ila_0/probe8] set_property port_width 1 [get_debug_ports u_ila_0/probe8]
connect_debug_port u_ila_0/probe8 [get_nets [list {realSdPlayer/dataHandler/buffer\\.address_half}]] connect_debug_port u_ila_0/probe8 [get_nets [list realSdPlayer/read_command_received]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
set_property port_width 1 [get_debug_ports u_ila_0/probe9] set_property port_width 1 [get_debug_ports u_ila_0/probe9]
connect_debug_port u_ila_0/probe9 [get_nets [list {realSdPlayer/dataHandler/buffer\\.clka}]] connect_debug_port u_ila_0/probe9 [get_nets [list realSdPlayer/send_command_ready]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
set_property port_width 1 [get_debug_ports u_ila_0/probe10] set_property port_width 1 [get_debug_ports u_ila_0/probe10]
connect_debug_port u_ila_0/probe10 [get_nets [list {realSdPlayer/dataHandler/buffer\\.ena}]] connect_debug_port u_ila_0/probe10 [get_nets [list realSdPlayer/send_command_start]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
set_property port_width 1 [get_debug_ports u_ila_0/probe11] set_property port_width 1 [get_debug_ports u_ila_0/probe11]
connect_debug_port u_ila_0/probe11 [get_nets [list realSdPlayer/fast_clk]] connect_debug_port u_ila_0/probe11 [get_nets [list realSdPlayer/slowSender/send_sd_cmd]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
set_property port_width 1 [get_debug_ports u_ila_0/probe12] set_property port_width 1 [get_debug_ports u_ila_0/probe12]
connect_debug_port u_ila_0/probe12 [get_nets [list realSdPlayer/fast_clk_enable]] connect_debug_port u_ila_0/probe12 [get_nets [list realSdPlayer/slow_clk]]
create_debug_port u_ila_0 probe create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
set_property port_width 1 [get_debug_ports u_ila_0/probe13] set_property port_width 1 [get_debug_ports u_ila_0/probe13]
connect_debug_port u_ila_0/probe13 [get_nets [list realSdPlayer/read_command_listen]] connect_debug_port u_ila_0/probe13 [get_nets [list realSdPlayer/stored_sd_cmd]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
set_property port_width 1 [get_debug_ports u_ila_0/probe14]
connect_debug_port u_ila_0/probe14 [get_nets [list realSdPlayer/read_command_received]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
set_property port_width 1 [get_debug_ports u_ila_0/probe15]
connect_debug_port u_ila_0/probe15 [get_nets [list reset]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
set_property port_width 1 [get_debug_ports u_ila_0/probe16]
connect_debug_port u_ila_0/probe16 [get_nets [list realSdPlayer/sd_data]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
set_property port_width 1 [get_debug_ports u_ila_0/probe17]
connect_debug_port u_ila_0/probe17 [get_nets [list realSdPlayer/send_command_ready]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
set_property port_width 1 [get_debug_ports u_ila_0/probe18]
connect_debug_port u_ila_0/probe18 [get_nets [list realSdPlayer/send_command_start]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
set_property port_width 1 [get_debug_ports u_ila_0/probe19]
connect_debug_port u_ila_0/probe19 [get_nets [list realSdPlayer/slowSender/send_sd_cmd]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
set_property port_width 1 [get_debug_ports u_ila_0/probe20]
connect_debug_port u_ila_0/probe20 [get_nets [list realSdPlayer/slow_clk]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
set_property port_width 1 [get_debug_ports u_ila_0/probe21]
connect_debug_port u_ila_0/probe21 [get_nets [list realSdPlayer/stored_sd_cmd]]
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub] set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
+76 -75
View File
@@ -45,7 +45,7 @@
<Option Name="SimulatorGccVersionActiveHdl" Val="9.3.0"/> <Option Name="SimulatorGccVersionActiveHdl" Val="9.3.0"/>
<Option Name="BoardPart" Val=""/> <Option Name="BoardPart" Val=""/>
<Option Name="SourceMgmtMode" Val="DisplayOnly"/> <Option Name="SourceMgmtMode" Val="DisplayOnly"/>
<Option Name="ActiveSimSet" Val="sd_controller_tb"/> <Option Name="ActiveSimSet" Val="read_data_tb"/>
<Option Name="DefaultLib" Val="xil_defaultlib"/> <Option Name="DefaultLib" Val="xil_defaultlib"/>
<Option Name="ProjectType" Val="Default"/> <Option Name="ProjectType" Val="Default"/>
<Option Name="IPRepoPath" Val="$PPRDIR/../../../fpga/vivado-library"/> <Option Name="IPRepoPath" Val="$PPRDIR/../../../fpga/vivado-library"/>
@@ -61,7 +61,7 @@
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/> <Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
<Option Name="EnableBDX" Val="FALSE"/> <Option Name="EnableBDX" Val="FALSE"/>
<Option Name="DSABoardId" Val="nexys-a7-100t"/> <Option Name="DSABoardId" Val="nexys-a7-100t"/>
<Option Name="WTXSimLaunchSim" Val="211"/> <Option Name="WTXSimLaunchSim" Val="237"/>
<Option Name="WTModelSimLaunchSim" Val="0"/> <Option Name="WTModelSimLaunchSim" Val="0"/>
<Option Name="WTQuestaLaunchSim" Val="0"/> <Option Name="WTQuestaLaunchSim" Val="0"/>
<Option Name="WTIesLaunchSim" Val="0"/> <Option Name="WTIesLaunchSim" Val="0"/>
@@ -169,13 +169,6 @@
<Attr Name="UsedIn" Val="simulation"/> <Attr Name="UsedIn" Val="simulation"/>
</FileInfo> </FileInfo>
</File> </File>
<File Path="$PPRDIR/design/segment_display/seconds_display.sv">
<FileInfo>
<Attr Name="UsedIn" Val="synthesis"/>
<Attr Name="UsedIn" Val="implementation"/>
<Attr Name="UsedIn" Val="simulation"/>
</FileInfo>
</File>
<File Path="$PPRDIR/design/nexys_a7_top.sv"> <File Path="$PPRDIR/design/nexys_a7_top.sv">
<FileInfo> <FileInfo>
<Attr Name="UsedIn" Val="synthesis"/> <Attr Name="UsedIn" Val="synthesis"/>
@@ -237,6 +230,13 @@
<Attr Name="UsedIn" Val="simulation"/> <Attr Name="UsedIn" Val="simulation"/>
</FileInfo> </FileInfo>
</File> </File>
<File Path="$PPRDIR/design/segment_display/sixty_display.sv">
<FileInfo>
<Attr Name="UsedIn" Val="synthesis"/>
<Attr Name="UsedIn" Val="implementation"/>
<Attr Name="UsedIn" Val="simulation"/>
</FileInfo>
</File>
<Config> <Config>
<Option Name="DesignMode" Val="RTL"/> <Option Name="DesignMode" Val="RTL"/>
<Option Name="TopModule" Val="nexys_a7_top"/> <Option Name="TopModule" Val="nexys_a7_top"/>
@@ -599,6 +599,7 @@
</Config> </Config>
</FileSet> </FileSet>
<FileSet Name="sd_controller_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/sd_controller_tb" RelGenDir="$PGENDIR/sd_controller_tb"> <FileSet Name="sd_controller_tb" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/sd_controller_tb" RelGenDir="$PGENDIR/sd_controller_tb">
<Filter Type="Srcs"/>
<File Path="$PPRDIR/verification/sd/sd_controller_tb.sv"> <File Path="$PPRDIR/verification/sd/sd_controller_tb.sv">
<FileInfo> <FileInfo>
<Attr Name="UsedIn" Val="synthesis"/> <Attr Name="UsedIn" Val="synthesis"/>
@@ -695,58 +696,58 @@
<Step Id="write_bitstream"/> <Step Id="write_bitstream"/>
</Strategy> </Strategy>
<ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true"> <ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true">
<ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_1_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_1_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_1_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_1_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_1_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_1_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_1_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_1_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_1_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_1_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_1_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_1_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_1_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_1_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="verbose" Type="" Value="true"/> <ReportConfigOption Name="verbose" Type="" Value="true"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_1_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_1_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_1_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_1_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_1_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_1_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_1_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_1_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_1_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_1_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
@@ -755,50 +756,50 @@
<ReportConfig DisplayName="implementation_log" Name="impl_1_copy_1_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi"> <ReportConfig DisplayName="implementation_log" Name="impl_1_copy_1_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_1_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_1_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_1_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_1_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_1_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_1_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_1_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_1_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_1_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_1_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_1_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_1_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_1_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_1_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_1_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_1_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed_1.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_1_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_1_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_1_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_1_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted_1.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
@@ -824,58 +825,58 @@
<Step Id="write_bitstream"/> <Step Id="write_bitstream"/>
</Strategy> </Strategy>
<ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true"> <ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true">
<ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_2_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_2_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_2_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_2_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_2_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_2_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_2_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_2_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_2_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_2_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_2_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_2_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_2_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_2_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="verbose" Type="" Value="true"/> <ReportConfigOption Name="verbose" Type="" Value="true"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_2_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_2_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_2_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_2_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_2_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_2_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_2_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_2_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_2_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_2_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted_1.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
@@ -884,50 +885,50 @@
<ReportConfig DisplayName="implementation_log" Name="impl_1_copy_2_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi"> <ReportConfig DisplayName="implementation_log" Name="impl_1_copy_2_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_2_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_2_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_2_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_2_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_2_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_2_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_2_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_2_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_2_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_2_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_2_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_2_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_2_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_2_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_2_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_2_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed_1.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_2_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_2_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted_1.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_2_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_2_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted_1.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
@@ -953,58 +954,58 @@
<Step Id="write_bitstream"/> <Step Id="write_bitstream"/>
</Strategy> </Strategy>
<ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true"> <ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2024" CtrlBit="true">
<ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_3_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Design Initialization" Name="impl_1_copy_3_init_report_timing_summary_0" Spec="report_timing_summary" RunStep="init_design" ReportFile="nexys_a7_top_timing_summary_init.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_3_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Opt Design" Name="impl_1_copy_3_opt_report_drc_0" Spec="report_drc" RunStep="opt_design" ReportFile="nexys_a7_top_drc_opted.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_3_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Opt Design" Name="impl_1_copy_3_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="opt_design" ReportFile="nexys_a7_top_timing_summary_opted.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_3_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Power Opt Design" Name="impl_1_copy_3_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="power_opt_design" ReportFile="nexys_a7_top_timing_summary_pwropted.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_3_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="IO - Place Design" Name="impl_1_copy_3_place_report_io_0" Spec="report_io" RunStep="place_design" ReportFile="nexys_a7_top_io_placed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_3_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Utilization - Place Design" Name="impl_1_copy_3_place_report_utilization_0" Spec="report_utilization" RunStep="place_design" ReportFile="nexys_a7_top_utilization_placed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_3_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Control Sets - Place Design" Name="impl_1_copy_3_place_report_control_sets_0" Spec="report_control_sets" RunStep="place_design" ReportFile="nexys_a7_top_control_sets_placed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="verbose" Type="" Value="true"/> <ReportConfigOption Name="verbose" Type="" Value="true"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_pre_placed.rpt.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Incremental Reuse - Place Design" Name="impl_1_copy_3_place_report_incremental_reuse_1" Spec="report_incremental_reuse" RunStep="place_design" ReportFile="nexys_a7_top_incremental_reuse_placed.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_3_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Place Design" Name="impl_1_copy_3_place_report_timing_summary_0" Spec="report_timing_summary" RunStep="place_design" ReportFile="nexys_a7_top_timing_summary_placed.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_3_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Power Opt Design" Name="impl_1_copy_3_post_place_power_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_place_power_opt_design" ReportFile="nexys_a7_top_timing_summary_postplace_pwropted.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_3_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted_1.rpt" Version="1" Minor="0" IsDisabled="true"> <ReportConfig DisplayName="Timing Summary - Post-Place Phys Opt Design" Name="impl_1_copy_3_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="phys_opt_design" ReportFile="nexys_a7_top_timing_summary_physopted.rpt" Version="1" Minor="0" IsDisabled="true">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
@@ -1013,50 +1014,50 @@
<ReportConfig DisplayName="implementation_log" Name="impl_1_copy_3_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi"> <ReportConfig DisplayName="implementation_log" Name="impl_1_copy_3_route_implementation_log_0" Spec="" RunStep="route_design" ReportFile="nexys_a7_top.vdi">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_3_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="DRC - Route Design" Name="impl_1_copy_3_route_report_drc_0" Spec="report_drc" RunStep="route_design" ReportFile="nexys_a7_top_drc_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_3_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Methodology - Route Design" Name="impl_1_copy_3_route_report_methodology_0" Spec="report_methodology" RunStep="route_design" ReportFile="nexys_a7_top_methodology_drc_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_3_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Power - Route Design" Name="impl_1_copy_3_route_report_power_0" Spec="report_power" RunStep="route_design" ReportFile="nexys_a7_top_power_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_3_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Route Status - Route Design" Name="impl_1_copy_3_route_report_route_status_0" Spec="report_route_status" RunStep="route_design" ReportFile="nexys_a7_top_route_status.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_3_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Route Design" Name="impl_1_copy_3_route_report_timing_summary_0" Spec="report_timing_summary" RunStep="route_design" ReportFile="nexys_a7_top_timing_summary_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_3_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Incremental Reuse - Route Design" Name="impl_1_copy_3_route_report_incremental_reuse_0" Spec="report_incremental_reuse" RunStep="route_design" ReportFile="nexys_a7_top_incremental_reuse_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_3_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Clock Utilization - Route Design" Name="impl_1_copy_3_route_report_clock_utilization_0" Spec="report_clock_utilization" RunStep="route_design" ReportFile="nexys_a7_top_clock_utilization_routed.rpt" Version="1" Minor="0">
<ReportConfigOption Name="dummy_option" Type="string"/> <ReportConfigOption Name="dummy_option" Type="string"/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_3_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed_1.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Route Design" Name="impl_1_copy_3_route_report_bus_skew_0" Spec="report_bus_skew" RunStep="route_design" ReportFile="nexys_a7_top_bus_skew_routed.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted_1.rpt" Version="1" Minor="0"> <ReportConfig DisplayName="Timing Summary - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_timing_summary_0" Spec="report_timing_summary" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_timing_summary_postroute_physopted.rpt" Version="1" Minor="0">
<ReportConfigOption Name="max_paths" Type="" Value="10"/> <ReportConfigOption Name="max_paths" Type="" Value="10"/>
<ReportConfigOption Name="report_unconstrained" Type="" Value="true"/> <ReportConfigOption Name="report_unconstrained" Type="" Value="true"/>
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
</ReportConfig> </ReportConfig>
<ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted_1.rpt" Version="1" Minor="1"> <ReportConfig DisplayName="Bus Skew - Post-Route Phys Opt Design" Name="impl_1_copy_3_post_route_phys_opt_report_bus_skew_0" Spec="report_bus_skew" RunStep="post_route_phys_opt_design" ReportFile="nexys_a7_top_bus_skew_postroute_physopted.rpt" Version="1" Minor="1">
<ReportConfigOption Name="warn_on_violation" Type="" Value="true"/> <ReportConfigOption Name="warn_on_violation" Type="" Value="true"/>
<ReportConfigOutputOption Name="pb" Type="string" Value=""/> <ReportConfigOutputOption Name="pb" Type="string" Value=""/>
<ReportConfigOutputOption Name="rpx" Type="string" Value=""/> <ReportConfigOutputOption Name="rpx" Type="string" Value=""/>
BIN
View File
Binary file not shown.
+16 -16
View File
@@ -6,6 +6,9 @@
* @date: 6/12/2025 * @date: 6/12/2025
* *
* */ * */
//define used here because verilator needs it but vivado is smart enough
//not to.
`ifdef VERILATOR `ifdef VERILATOR
`include "sdvd_defs.sv" `include "sdvd_defs.sv"
`endif `endif
@@ -31,11 +34,14 @@ module audio_buffer(
// Inputs for the memory buffer // Inputs for the memory buffer
audio_buffer_interface.receiver driver audio_buffer_interface.receiver driver
); );
logic [9:0] address; // Size of samples, 8bit or 16bit supported
parameter SIZE=16;
(* MARK_DEBUG = "TRUE" *)
logic [11-(SIZE/8):0] address;
// State register // State register
logic enb; logic enb;
logic [15:0] doutb; logic [(SIZE-1):0] doutb;
// A single bit counter, to avoid feeding samples given the 1 cycle read delay // A single bit counter, to avoid feeding samples given the 1 cycle read delay
logic delay; logic delay;
@@ -44,7 +50,7 @@ logic delay;
// half of the 2KiB buffer // half of the 2KiB buffer
// //
// The MSB of the address == higher/lower half address // The MSB of the address == higher/lower half address
assign driver.address_half = address[9]; assign driver.address_half = address[11-(SIZE/8)];
always_ff @(posedge clk) begin always_ff @(posedge clk) begin
enb <= 0; enb <= 0;
@@ -72,10 +78,8 @@ always_ff @(posedge clk) begin
// This will overflow to the correct value always // This will overflow to the correct value always
address <= address + speed; address <= address + speed;
enb <= 1; enb <= 1;
// NOTE: I really don't know a good way to generate the load
// signal. It maybe could be an inverted 48khz clock?
if (delay == 0) begin if (delay == 0) begin
sample <= doutb; sample[15-:SIZE] <= doutb;
end end
else begin else begin
sample <= '0; sample <= '0;
@@ -86,12 +90,10 @@ always_ff @(posedge clk) begin
end end
end end
//xpm_memory_sdpram #( //vivado block ram xpm macro
// .WRITE_DATA_WIDTH_A(16)
//) buffer ();
xpm_memory_sdpram #( xpm_memory_sdpram #(
.ADDR_WIDTH_A(11), // DECIMAL .ADDR_WIDTH_A(11), // DECIMAL
.ADDR_WIDTH_B(10), // DECIMAL .ADDR_WIDTH_B(12-(SIZE/8)), // DECIMAL
.AUTO_SLEEP_TIME(0), // DECIMAL .AUTO_SLEEP_TIME(0), // DECIMAL
.BYTE_WRITE_WIDTH_A(8), // DECIMAL .BYTE_WRITE_WIDTH_A(8), // DECIMAL
.CASCADE_HEIGHT(0), // DECIMAL .CASCADE_HEIGHT(0), // DECIMAL
@@ -107,7 +109,7 @@ xpm_memory_sdpram #(
.MEMORY_SIZE(16*1024), // DECIMAL .MEMORY_SIZE(16*1024), // DECIMAL
.MESSAGE_CONTROL(0), // DECIMAL .MESSAGE_CONTROL(0), // DECIMAL
.RAM_DECOMP("auto"), // String .RAM_DECOMP("auto"), // String
.READ_DATA_WIDTH_B(16), // DECIMAL .READ_DATA_WIDTH_B(SIZE), // DECIMAL
.READ_LATENCY_B(1), // DECIMAL .READ_LATENCY_B(1), // DECIMAL
.READ_RESET_VALUE_B("0"), // String .READ_RESET_VALUE_B("0"), // String
.RST_MODE_A("SYNC"), // String .RST_MODE_A("SYNC"), // String
@@ -137,7 +139,6 @@ buffer (
.enb(enb), // 1-bit input: Memory enable signal for port B. Must be high on clock .enb(enb), // 1-bit input: Memory enable signal for port B. Must be high on clock
// cycles when read operations are initiated. Pipelined internally. // cycles when read operations are initiated. Pipelined internally.
//active high reset
.rstb(reset), // 1-bit input: Reset signal for the final port B output register stage. .rstb(reset), // 1-bit input: Reset signal for the final port B output register stage.
// Synchronously resets output port doutb to the value specified by // Synchronously resets output port doutb to the value specified by
// parameter READ_RESET_VALUE_B. // parameter READ_RESET_VALUE_B.
@@ -147,11 +148,10 @@ buffer (
// writing one byte of dina to address addra. For example, to // writing one byte of dina to address addra. For example, to
// synchronously write only bits [15-8] of dina when WRITE_DATA_WIDTH_A // synchronously write only bits [15-8] of dina when WRITE_DATA_WIDTH_A
// is 32, wea would be 4'b0010. // is 32, wea would be 4'b0010.
// Extra inputs that I guess I need
.sleep(0), .sleep(0), // The XPM macros say these can be removed, but when I did this the
.injectsbiterra(0), .injectsbiterra(0), // entire block memory got optimized out. These were readded in later
.injectdbiterra(0), .injectdbiterra(0),
// With a latency of 1 this surely does not matter
.regceb(enb) .regceb(enb)
); );
+1
View File
@@ -21,6 +21,7 @@ module pwm(
parameter DEPTH=11; parameter DEPTH=11;
logic [DEPTH-1:0] pulse_counter; logic [DEPTH-1:0] pulse_counter;
(* MARK_DEBUG = "TRUE" *)
logic [15:0] sample_buffer; logic [15:0] sample_buffer;
logic should_output; logic should_output;
+2 -2
View File
@@ -6,7 +6,7 @@
* @author: Waylon Cude, Dilanthi Prentice * @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025 * @date: 6/12/2025
* */ * */
//Define used because verilator needs it but vivado is samrt enough not to
`ifdef VERILATOR `ifdef VERILATOR
`include "sdvd_defs.sv" `include "sdvd_defs.sv"
`endif `endif
@@ -19,7 +19,7 @@ module low_freq_clock_gen(
output logic clk1k, clk10h, seconds_pulse output logic clk1k, clk10h, seconds_pulse
); );
// Hardcoded to be 1,000,000/4,000 // Hardcoded to be 1,000,000/4,000 (25,000)
// Relying on constant maths makes it the wrong size // Relying on constant maths makes it the wrong size
localparam num_cycles = 25_000; localparam num_cycles = 25_000;
+8 -5
View File
@@ -1,18 +1,21 @@
/****
* modular_clock_gen.sv - parameterizable clock divider.
*
* @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025
*
* */
module modular_clock_gen( module modular_clock_gen(
input clk, reset, input clk, reset,
output logic oclk output logic oclk
); );
//parameter has no default because the user should always set it
parameter DIVISOR; parameter DIVISOR;
logic [$clog2(DIVISOR)-1:0] counter; logic [$clog2(DIVISOR)-1:0] counter;
logic set; logic set;
// clock will be high for about half of the cycle, depending on integer
// rounding
// OOPS this makes it combinational
//assign oclk = counter < (DIVISOR/2);
always_ff @(posedge clk) begin always_ff @(posedge clk) begin
// modular clock has to keep ticking through reset // modular clock has to keep ticking through reset
// so everything with a synchronous reset actually works // so everything with a synchronous reset actually works
+32 -17
View File
@@ -88,16 +88,19 @@ end
display_anode_driver anodeDriver(clk_1khz,reset,AN,segment_mux_select); display_anode_driver anodeDriver(clk_1khz,reset,AN,segment_mux_select);
seconds_display secondsSegment (seconds, segments[1], segments[0]); sixty_display secondsSegment (seconds, segments[1], segments[0]);
seconds_display minutesSegment (minutes, segments[3], segments[2]); sixty_display minutesSegment (minutes, segments[3], segments[2]);
seconds_display hoursSegment (hours, segments[5], segments[4]); sixty_display hoursSegment (hours, segments[5], segments[4]);
// Run the playback speed state machine at a lower rate // Run the playback speed state machine at a lower rate
// Gets rid of button bouncing // Gets rid of button bouncing
playback_controller playbackController (clk_10hz,reset,BTNC, BTNR, speed); playback_controller playbackController (clk_10hz,reset,BTNC, BTNR, speed);
pwm audioOutput(CLK100MHZ, reset, clk_48khz, audio_sample, AUD_PWM);
audio_buffer audioBuffer( `ifdef ROM
rom_sd #("even_flow_16.mem") romSdPlayer(clk_1mhz,reset,sd_ready,audio_interface.driver);
assign {SD_RESET,SD_DAT,SD_CMD,SD_SCK} = 'z;
audio_buffer audioBuffer(
clk_48khz, clk_48khz,
reset, reset,
sd_ready, sd_ready,
@@ -106,36 +109,48 @@ audio_buffer audioBuffer(
playing, playing,
audio_sample, audio_sample,
audio_interface.receiver audio_interface.receiver
); );
pwm audioOutput(CLK100MHZ, reset, clk_48khz, audio_sample, AUD_PWM);
`ifdef ROM
rom_sd #("even_flow_16.mem") romSdPlayer(clk_1mhz,reset,sd_ready,audio_interface.driver);
assign {SD_RESET,SD_DAT,SD_CMD,SD_SCK} = 'z;
`else `else
// Power the sd slot // Power the sd slot
assign SD_RESET = 0; assign SD_RESET = 0;
// We don't use more than one dat line // We don't use more than one dat line
assign SD_DAT[3:1] = 'z;
logic clk_100khz; logic clk_100khz;
logic clk_25mhz; logic clk_25mhz;
// Actually 200khz now // We can clock this at around 200khz before things start breaking
// 200khz is slightly unstable?????? // Even at 200khz sometimes things break
modular_clock_gen #(1000) slowSdClock(CLK100MHZ, reset, clk_100khz); modular_clock_gen #(500) slowSdClock(CLK100MHZ, reset, clk_100khz);
// Try clocking this slower than max speed // Try clocking this slower than max speed
// To see if that makes it actually work ... // To see if that makes it actually work
modular_clock_gen #(1000) fastSdClock(CLK100MHZ, reset, clk_25mhz); //
// NOTE: It did not make it work
modular_clock_gen #(400) fastSdClock(CLK100MHZ, reset, clk_25mhz);
sd_controller realSdPlayer( sd_controller realSdPlayer(
clk_100khz, clk_100khz,
clk_25mhz, clk_25mhz,
CLK100MHZ, CLK100MHZ,
clk_1mhz,
reset, reset,
SD_DAT[0], SD_DAT,
SD_CMD, SD_CMD,
sd_ready, sd_ready,
SD_SCK, SD_SCK,
audio_interface.driver audio_interface.driver
); );
audio_buffer #(.SIZE(16)) audioBuffer(
clk_48khz,
reset,
sd_ready,
'0, // stop signal not used right now
speed,
playing,
audio_sample,
audio_interface.receiver
);
pwm #(11) audioOutput(CLK100MHZ, reset, clk_48khz, audio_sample, AUD_PWM);
`endif `endif
+8 -2
View File
@@ -1,5 +1,11 @@
// parameterizable sequential crc generator /***
// This probably could be combinational logic too, though it would be way slow * crc_gen.sv - paramerizable sequential crc generator. This could probably be
* combinational logic too (but it would be way slower)
*
* @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025
*
* */
module crc_gen #( module crc_gen #(
parameter CRCBITS=7, parameter CRCBITS=7,
parameter COMMANDLEN=40, parameter COMMANDLEN=40,
+10 -2
View File
@@ -1,3 +1,11 @@
/****
* read_command.sv - reads the sd command line and listens for sd command
* responses.
*
* @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025
*
* **/
module read_command( module read_command(
input logic clk, input logic clk,
input logic reset, input logic reset,
@@ -19,8 +27,8 @@ logic received_reg;
logic [2:0] response_type_reg; logic [2:0] response_type_reg;
// oops this was set a cycle before the data was actually ready // recevied was set a cycle before the data was actually ready
// and if it's just a reg it holds for too long // and if it's just a register it holds for too long
// use both for maximum reactivity // use both for maximum reactivity
assign received = received_reg && !listen; assign received = received_reg && !listen;
+29 -18
View File
@@ -1,11 +1,17 @@
// Whenever we receive a data block, start spitting bytes out into the audio /***
// buffer bram. This could always be clocked at the 25MHz default speed clock, * read_data.sv - whenever we receive a data block, start spitting bytes out
// or it could switch over like the writer has to * into the audio buffer block ram. This could be clocked at
* 25MHz default speed clock, or it could swtich over like the
* writer has to.
* @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025
*
***/
module read_data( module read_data(
input clk, input clk,
input mem_clk,
input reset, input reset,
input sd_data, input [3:0] sd_data,
(* MARK_DEBUG = "TRUE" *)
audio_buffer_interface.driver buffer audio_buffer_interface.driver buffer
); );
// Block data is a start bit, 512 bytes sent msb first, then a CRC16 and end // Block data is a start bit, 512 bytes sent msb first, then a CRC16 and end
@@ -16,7 +22,7 @@ module read_data(
// played. However, as long as the sd card controller doesn't request extra // played. However, as long as the sd card controller doesn't request extra
// blocks this shouldn't be an issue // blocks this shouldn't be an issue
localparam BLOCK_SIZE=512*8+16+2; localparam BLOCK_SIZE=512*2+16*4+2;
logic [$clog2(BLOCK_SIZE):0] counter; logic [$clog2(BLOCK_SIZE):0] counter;
logic [7:0] byte_shift; logic [7:0] byte_shift;
@@ -28,36 +34,41 @@ assign buffer.clka = clk;
always_ff @(posedge clk) begin always_ff @(posedge clk) begin
if (reset) begin if (reset) begin
buffer.ena <= 0; buffer.ena <= 0;
buffer.addra <= '1; // Start negative so adding bytes will get us to the right address
buffer.addra <= 0 - 512;
buffer.dina <= 0; buffer.dina <= 0;
end end
else begin else begin
// We ignore the lower 17 bits of the block // We ignore the lower 16*4+1 bits of the block
if (counter > 16) begin // CRC is apparently sent on each line, back to back
if (counter > 16*4) begin
counter <= counter - 1; counter <= counter - 1;
byte_shift <= {byte_shift[6:0],sd_data}; byte_shift <= {byte_shift[3:0],sd_data};
byte_counter <= byte_counter - 1; byte_counter <= byte_counter - 1;
// Store received byte in audio buffer and reset counter // Store received byte in audio buffer and reset counter
if (byte_counter == 0) begin if (byte_counter == 0) begin
byte_counter <= 7; byte_counter <= 1;
buffer.dina <= byte_shift;//{byte_shift[6:0],sd_data}; buffer.dina <= {byte_shift[3:0],sd_data};
buffer.ena <= 1; buffer.ena <= 1;
end end
// Turn the enable signal off so we don't accidentally write // Turn the enable signal off so we don't accidentally write
// anything weird // anything weird
if (byte_counter == 4) begin if (byte_counter == 1) begin
buffer.ena <= 0; buffer.addra <= buffer.addra - 1;
buffer.addra <= buffer.addra + 1;
end end
end end
else if (counter != 0) else if (counter != 0) begin
counter<=counter-1; counter<=counter-1;
buffer.ena <= 0;
end
else if (sd_data == 0) begin else if (sd_data == 0) begin
counter <= BLOCK_SIZE-1; // In wide bus mode we read bytes in a descending order
byte_counter <= 8; buffer.addra <= buffer.addra + 1024;
counter <= BLOCK_SIZE;
byte_counter <= 3;
end end
end end
end end
+66 -12
View File
@@ -12,9 +12,10 @@ module sd_controller(
(* MARK_DEBUG = "TRUE" *) (* MARK_DEBUG = "TRUE" *)
input logic fast_clk, input logic fast_clk,
input logic crc_clk, input logic crc_clk,
input logic mem_clk,
input logic reset, input logic reset,
(* MARK_DEBUG = "TRUE" *) (* MARK_DEBUG = "TRUE" *)
input logic sd_data, input logic [3:0] sd_data,
inout logic sd_cmd, inout logic sd_cmd,
output logic ready, output logic ready,
output wire clk, output wire clk,
@@ -22,7 +23,6 @@ module sd_controller(
audio_buffer_interface.driver buffer audio_buffer_interface.driver buffer
); );
// NOTE: this gets encoded as one-hot, even if in here I set it as a logic[5:0] // NOTE: this gets encoded as one-hot, even if in here I set it as a logic[5:0]
(* MARK_DEBUG = "TRUE" *)
enum logic [5:0] { enum logic [5:0] {
INIT,WAIT,SEND_CMD0,WAIT_CMD0,DELAY_CMD0, // last 4 INIT,WAIT,SEND_CMD0,WAIT_CMD0,DELAY_CMD0, // last 4
SEND_CMD8,WAIT_CMD8,LISTEN_RESPONSE_CMD8,WAIT_RESPONSE_CMD8, // last 8 SEND_CMD8,WAIT_CMD8,LISTEN_RESPONSE_CMD8,WAIT_RESPONSE_CMD8, // last 8
@@ -31,13 +31,15 @@ enum logic [5:0] {
SEND_CMD2,WAIT_CMD2,LISTEN_RESPONSE_CMD2,WAIT_RESPONSE_CMD2, //21 SEND_CMD2,WAIT_CMD2,LISTEN_RESPONSE_CMD2,WAIT_RESPONSE_CMD2, //21
SEND_CMD3,WAIT_CMD3,LISTEN_RESPONSE_CMD3,WAIT_RESPONSE_CMD3, //25 SEND_CMD3,WAIT_CMD3,LISTEN_RESPONSE_CMD3,WAIT_RESPONSE_CMD3, //25
SEND_CMD7,WAIT_CMD7,LISTEN_RESPONSE_CMD7,WAIT_RESPONSE_CMD7, //29 SEND_CMD7,WAIT_CMD7,LISTEN_RESPONSE_CMD7,WAIT_RESPONSE_CMD7, //29
SEND2_CMD55,WAIT2_CMD55,LISTEN_RESPONSE2_CMD55,WAIT_RESPONSE2_CMD55,
SEND_ACMD6,WAIT_ACMD6,LISTEN_RESPONSE_ACMD6,WAIT_RESPONSE_ACMD6,
READY_TO_TRANSMIT, READY_TO_TRANSMIT,
DELAY_CLOCK_SWITCH,
TRANSMIT,WAIT_TRANSMIT,WAIT_END,FINISH_TRANSMIT, TRANSMIT,WAIT_TRANSMIT,WAIT_END,FINISH_TRANSMIT,
TRANSMIT2,WAIT_TRANSMIT2,WAIT_END2,FINISH_TRANSMIT2, TRANSMIT2,WAIT_TRANSMIT2,WAIT_END2,FINISH_TRANSMIT2,
WAIT_FOR_BUFFER WAIT_FOR_BUFFER
} state, next_state; } state, next_state;
(* MARK_DEBUG = "TRUE" *)
logic fast_clk_enable; logic fast_clk_enable;
assign clk = fast_clk_enable ? fast_clk : slow_clk; assign clk = fast_clk_enable ? fast_clk : slow_clk;
@@ -49,7 +51,6 @@ logic [31:0] address;
logic send_command_start;//, send_command_start_fast; logic send_command_start;//, send_command_start_fast;
(* MARK_DEBUG = "TRUE" *) (* MARK_DEBUG = "TRUE" *)
logic [5:0] cmd; logic [5:0] cmd;
(* MARK_DEBUG = "TRUE" *)
logic [31:0] arg; logic [31:0] arg;
(* MARK_DEBUG = "TRUE" *) (* MARK_DEBUG = "TRUE" *)
wire send_command_ready;//, send_command_ready_fast; wire send_command_ready;//, send_command_ready_fast;
@@ -104,6 +105,7 @@ read_command slowReader(
// The data line is only ever used at fast_clk speeds // The data line is only ever used at fast_clk speeds
read_data dataHandler( read_data dataHandler(
fast_clk, fast_clk,
mem_clk,
reset, reset,
sd_data, sd_data,
buffer buffer
@@ -189,7 +191,7 @@ always_comb begin
next_state=WAIT_RESPONSE_CMD7; next_state=WAIT_RESPONSE_CMD7;
WAIT_RESPONSE_CMD7: WAIT_RESPONSE_CMD7:
if (read_command_received) if (read_command_received)
next_state=READY_TO_TRANSMIT; next_state=SEND2_CMD55;
else else
next_state=WAIT_RESPONSE_CMD7; next_state=WAIT_RESPONSE_CMD7;
@@ -230,8 +232,42 @@ always_comb begin
else else
next_state=ACMD41_DELAY; next_state=ACMD41_DELAY;
SEND2_CMD55:
next_state=WAIT2_CMD55;
WAIT2_CMD55:
if (send_command_ready)
next_state=LISTEN_RESPONSE2_CMD55;
else
next_state=WAIT2_CMD55;
LISTEN_RESPONSE2_CMD55:
next_state=WAIT_RESPONSE2_CMD55;
WAIT_RESPONSE2_CMD55:
if (read_command_received)
next_state=SEND_ACMD6;
else
next_state=WAIT_RESPONSE2_CMD55;
SEND_ACMD6:
next_state=WAIT_ACMD6;
WAIT_ACMD6:
if (send_command_ready)
next_state=LISTEN_RESPONSE_ACMD6;
else
next_state=WAIT_ACMD6;
LISTEN_RESPONSE_ACMD6:
next_state=WAIT_RESPONSE_ACMD6;
WAIT_RESPONSE_ACMD6:
if (read_command_received)
next_state=READY_TO_TRANSMIT;
else
next_state=WAIT_RESPONSE_ACMD6;
READY_TO_TRANSMIT: READY_TO_TRANSMIT:
next_state=TRANSMIT; next_state=DELAY_CLOCK_SWITCH;
DELAY_CLOCK_SWITCH:
if (counter == 0)
next_state = TRANSMIT;
else
next_state = DELAY_CLOCK_SWITCH;
TRANSMIT: TRANSMIT:
next_state=WAIT_TRANSMIT; next_state=WAIT_TRANSMIT;
WAIT_TRANSMIT: WAIT_TRANSMIT:
@@ -310,7 +346,14 @@ always_ff @(posedge clk) begin
arg <= 0; arg <= 0;
send_command_start <=1; send_command_start <=1;
end end
LISTEN_RESPONSE_CMD55: begin SEND2_CMD55: begin
cmd <= 55;
// the arg should be the same as the preceding command
// and otherwise we'll lose the RCA bits
//arg <= 0;
send_command_start <=1;
end
LISTEN_RESPONSE_CMD55,LISTEN_RESPONSE2_CMD55: begin
response_type <= 1; response_type <= 1;
read_command_listen <= 1; read_command_listen <= 1;
end end
@@ -327,6 +370,15 @@ always_ff @(posedge clk) begin
read_command_listen<=0; read_command_listen<=0;
counter<=100; counter<=100;
end end
SEND_ACMD6: begin
cmd <= 6;
arg <= 'b10;
send_command_start <=1;
end
LISTEN_RESPONSE_ACMD6: begin
response_type <= 1;
read_command_listen <= 1;
end
SEND_CMD2: begin SEND_CMD2: begin
cmd <= 2; cmd <= 2;
arg <= 0; arg <= 0;
@@ -358,6 +410,8 @@ always_ff @(posedge clk) begin
fast_clk_enable <= 1; fast_clk_enable <= 1;
address <= 0; address <= 0;
sd_buffer_half <= 0; sd_buffer_half <= 0;
// Wait to actually transmit until clock is running and stable
counter <= 100;
end end
TRANSMIT, TRANSMIT2: begin TRANSMIT, TRANSMIT2: begin
cmd <= 17; cmd <= 17;
@@ -366,7 +420,7 @@ always_ff @(posedge clk) begin
end end
WAIT_TRANSMIT, WAIT_TRANSMIT2: begin WAIT_TRANSMIT, WAIT_TRANSMIT2: begin
send_command_start <= 0; send_command_start <= 0;
counter <= 411; counter <= 512*2+16+1;
end end
FINISH_TRANSMIT: FINISH_TRANSMIT:
address <= address +1; address <= address +1;
@@ -377,12 +431,12 @@ always_ff @(posedge clk) begin
WAIT_FOR_BUFFER: WAIT_FOR_BUFFER:
ready <= 1; ready <= 1;
// The logic is simple enough in these to group them // The logic is simple enough in these to group them
WAIT, DELAY_CMD0, ACMD41_DELAY, WAIT_END, WAIT_END2: WAIT, DELAY_CMD0, ACMD41_DELAY, WAIT_END, WAIT_END2, DELAY_CLOCK_SWITCH:
counter <= counter - 1; counter <= counter - 1;
WAIT_CMD8,WAIT_CMD55,WAIT_ACMD41,WAIT_CMD2,WAIT_CMD3,WAIT_CMD7: WAIT_CMD8,WAIT_CMD55,WAIT_ACMD41,WAIT2_CMD55,WAIT_ACMD6,WAIT_CMD2,WAIT_CMD3,WAIT_CMD7:
send_command_start<=0; send_command_start<=0;
WAIT_RESPONSE_CMD8,WAIT_RESPONSE_CMD55,WAIT_RESPONSE_CMD2,WAIT_RESPONSE_CMD3, WAIT_RESPONSE_CMD8,WAIT_RESPONSE_CMD55,WAIT_RESPONSE2_CMD55,WAIT_RESPONSE_ACMD6,
WAIT_RESPONSE_CMD7: WAIT_RESPONSE_CMD2,WAIT_RESPONSE_CMD3,WAIT_RESPONSE_CMD7:
read_command_listen<=0; read_command_listen<=0;
default: ; default: ;
+8
View File
@@ -1,3 +1,11 @@
/***
* send_command.sv - sends sd card commands. It takes in a command and an
* argument and will figure out the necessary crc.
*
* @author: Waylon Cude, Dilanthi Prentice
* @date: 6/12/2025
*
* */
module send_command( module send_command(
input clk, input clk,
// The crc should be clocked way faster than the sender // The crc should be clocked way faster than the sender
-30
View File
@@ -1,30 +0,0 @@
/***
* seconds_display.sv - converts a five bit seconds counter to its seven segement display equivalent.
*
* @author: Dilanthi Prentice, Waylon Cude
* @date: 6/12/25
*
*/
module seconds_display
(
input [$clog2(60)-1:0] seconds,
output [6:0] display_tens,
output [6:0] display_ones
);
logic [4:0] ones_digit;
logic [4:0] tens_digit;
always_comb
begin
ones_digit = seconds % 10;
tens_digit = seconds / 10;
end
//instantiate the display_converter to convert the counter
//to a seven segment display number
display_converter ones (ones_digit, display_ones);
display_converter tens (tens_digit, display_tens);
endmodule
+32
View File
@@ -0,0 +1,32 @@
/***
* sixty_display.sv - converts a binary digit from zero to fifty-nine to its
* ones and tens digits and then gets the seven segment
* display equivalents of them.
*
* @author: Dilanthi Prentice, Waylon Cude
* @date: 6/12/25
*
*/
module sixty_display
(
input [$clog2(60)-1:0] number,
output [6:0] display_tens,
output [6:0] display_ones
);
logic [4:0] ones_digit;
logic [4:0] tens_digit;
//convert digit to ones and tens places
always_comb
begin
ones_digit = number % 10;
tens_digit = number / 10;
end
//convert both ones and tens place digits to their seven segement equivalent
display_converter ones (ones_digit, display_ones);
display_converter tens (tens_digit, display_tens);
endmodule
+1 -1
View File
@@ -38,7 +38,7 @@
entirely. Detected in testbench entirely. Detected in testbench
- off-by-one error detected in the counter - off-by-one error detected in the counter
## read_data ### read_data
- audio buffer address to write to was never changing, caught in simulation - audio buffer address to write to was never changing, caught in simulation
- some off-by-one errors in the byte shifting were found and corrected - some off-by-one errors in the byte shifting were found and corrected
+22
View File
@@ -0,0 +1,22 @@
digraph playback_controller {
PAUSE [shape="doublecircle",label="PAUSE\nspeed=0"];
node [shape="ellipse"]
PLAY [label="PLAY\nspeed=1"];
FF2 [label="FF2\nspeed=2"];
FF4 [label="FF4\nspeed=4"];
FF8 [label="FF8\nspeed=8"];
FF16 [label="FF16\nspeed=16"];
PAUSE -> PLAY [label="play_pulse"]
PLAY -> PAUSE [label="play_pulse"]
PLAY -> FF2 [label="ff_pulse"]
FF2 -> FF4 [label="ff_pulse"]
FF4 -> FF8 [label="ff_pulse"]
FF8 -> FF16 [label="ff_pulse"]
FF2 -> PAUSE [label="play_pulse"];
FF4 -> PAUSE [label="play_pulse"];
FF8 -> PAUSE [label="play_pulse"];
FF16 -> PAUSE [label="play_pulse"];
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

+24
View File
@@ -0,0 +1,24 @@
digraph read_command {
IDLE [shape="doublecircle",label="IDLE\nreceived_reg=0\nout_data=0\nresponse_type_reg=response_type"]
node [shape="ellipse"]
START [label="START\nrecevied_reg=0\ncounter=get_bits(response_type_reg) - 2\ndata_reg=0"]
LISTEN [label="LISTEN\ndata_reg[0]=sd_cmd"]
RECEIVING [label="RECEIVING\ncounter--\ndata_reg={data_reg[134:0],sd_cmd}"]
DONE [label="DONE\nout_data=data_reg\nreceived_reg=1\nreponse_type_reg=response_type"]
IDLE -> IDLE [label="!listen"]
IDLE -> START [label="listen"]
START -> RECEIVING [label="sd_cmd==0"]
START -> LISTEN [label="sd_cmd!=0"]
LISTEN -> LISTEN [label="sd_cmd!=0"]
LISTEN -> RECEIVING [label="sd_cmd==0"]
RECEIVING -> DONE [label="counter==0"]
RECEIVING -> RECEIVING [label="counter!=0"]
DONE -> START [label="listen"]
DONE -> DONE [label="!listen"]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

+16 -9
View File
@@ -1,23 +1,30 @@
digraph rom_sd { digraph rom_sd {
Reset [shape = doublecircle, label = "RESET\nbuffer_half = 0\nrom_addr = 0\nrom_enable = 1\nbuffer.addra=0\nready=0"]; Reset [shape = doublecircle, label = "RESET\nbuffer_half = 0\nrom_addr = 0\nrom_enable = 1\nbuffer.addra=0\nready=0"];
node [shape = circle]; node [shape = circle];
Delay [label="DELAY\nrom_addr++"]; Delay1 [label="DELAY1\nrom_addr++"];
Delay2 [label="DELAY2\nrom_addr++"];
Delay3 [label="DELAY3\nrom_addr++\nbuffer.dina=rom_data\nbuffer.ena=1"];
WriteBuf [label="WRITEBUF\nbuffer.ena=1\nbuffer.dina=rom_data\nbuffer.addra++\nrom_addr++"]; WriteBuf [label="WRITEBUF\nbuffer.ena=1\nbuffer.dina=rom_data\nbuffer.addra++\nrom_addr++"];
EndWrite [label="ENDWRITE\nbuffer.ena=1\nbuffer.data=rom_data\nbuffer.addra++\nready=1"]; EndWrite1 [label="ENDWRITE1\nbuffer.ena=1\nbuffer.data=rom_data\nbuffer.addra++"];
Wait [label = "WAIT\nbuffer.ena=0"]; EndWrite2 [label="ENDWRITE2\nbuffer.ena=1\nbuffer.data=rom_data\nbuffer.addra++"];
EndWrite3 [label="ENDWRITE3\nbuffer.ena=0\nbuffer.data=rom_data\nbuffer.addra++\nready=1"];
Wait [label = "WAIT"];
Reset -> Reset [label="reset"]; Reset -> Reset [label="reset"];
Reset -> Delay [label="!reset"]; Reset -> Delay1 [label="!reset"];
Delay -> WriteBuf; Delay1 -> Delay2;
Delay2 -> Delay3;
Delay3 -> WriteBuf;
WriteBuf -> WriteBuf [label="buffer.addra < 1023"] WriteBuf -> WriteBuf [label="buffer.addra < 1023"]
WriteBuf -> EndWrite [label="buffer.addra == 1023"] WriteBuf -> EndWrite1 [label="buffer.addra == 1023"]
EndWrite -> Wait; EndWrite1 -> EndWrite2;
EndWrite2 -> EndWrite3;
EndWrite3 -> Wait;
Wait -> Wait [label = "buffer_half == buffer.address_half"] Wait -> Wait [label = "buffer_half == buffer.address_half"]
Wait -> Delay [label = "buffer_half != buffer.address_half"] Wait -> Delay1 [label = "buffer_half != buffer.address_half"]
} }
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 177 KiB

+28 -3
View File
@@ -98,10 +98,33 @@ digraph sd_controller {
LISTEN_RESPONSE_CMD7 -> WAIT_RESPONSE_CMD7; LISTEN_RESPONSE_CMD7 -> WAIT_RESPONSE_CMD7;
WAIT_RESPONSE_CMD7 -> WAIT_RESPONSE_CMD7 [label="!read_command.ready"] WAIT_RESPONSE_CMD7 -> WAIT_RESPONSE_CMD7 [label="!read_command.ready"]
// Send CMD55+CMD41 with arg 40100000 until card is ready
SEND2_CMD55 [label="SEND2_CMD55\ncmd=55\nstart=1"];
WAIT2_CMD55 [label="WAIT2_CMD55\nstart=0"];
LISTEN_RESPONSE2_CMD55 [label="LISTEN_RESPONSE2_CMD55\nresponse_type=1\nread_command.listen=1"]
WAIT_RESPONSE2_CMD55 [label="WAIT_RESPONSE2_CMD55\nread_command.listen=0"]
SEND_ACMD6[label="SEND_ACMD6\ncmd=6\narg=0x00000002\nstart=1"];
WAIT_ACMD6 [label="WAIT_ACMD6\nstart=0"];
LISTEN_RESPONSE_ACMD6 [label="LISTEN_RESPONSE_ACMD6\nresponse_type=1\nread_command.listen=1"]
WAIT_RESPONSE_ACMD6 [label="WAIT_RESPONSE_ACMD6\nread_command.listen=0\ncounter=100"];
WAIT_RESPONSE_CMD7 -> SEND2_CMD55 [label="read_command.received"]
SEND2_CMD55 -> WAIT2_CMD55;
WAIT2_CMD55 -> WAIT2_CMD55 [label="!send_command.ready"];
WAIT2_CMD55 -> LISTEN_RESPONSE2_CMD55 [label="send_command.ready"];
LISTEN_RESPONSE2_CMD55 -> WAIT_RESPONSE2_CMD55;
WAIT_RESPONSE2_CMD55 -> WAIT_RESPONSE2_CMD55 [label="!read_command.received"]
WAIT_RESPONSE2_CMD55 -> SEND_ACMD6 [label="read_command.received"]
SEND_ACMD6 -> WAIT_ACMD6
WAIT_ACMD6 -> WAIT_ACMD6 [label="!send_command.ready"]
WAIT_ACMD6 -> LISTEN_RESPONSE_ACMD6[label="send_command.ready"]
LISTEN_RESPONSE_ACMD6 -> WAIT_RESPONSE_ACMD6
WAIT_RESPONSE_ACMD6 -> WAIT_RESPONSE_ACMD6 [label="!read_command.received"]
// Now we can finally read blocks with CMD17 // Now we can finally read blocks with CMD17
// Swap over to the fast clock // Swap over to the fast clock
READY_TO_TRANSMIT [label="READY_TO_TRANSMIT\nclk_source=fast\naddress=0\nbuffer_half=0"]; READY_TO_TRANSMIT [label="READY_TO_TRANSMIT\nclk_source=fast\naddress=0\nbuffer_half=0\ncounter=100"];
DELAY_CLOCK_SWITCH [label="DELAY_CLOCK_SWITCH\ncounter--"]
// There are two sets of states because we need to read two blocks at once // There are two sets of states because we need to read two blocks at once
TRANSMIT [label="TRANSMIT\ncmd=17\narg=address\nsend_command.start=1"]; TRANSMIT [label="TRANSMIT\ncmd=17\narg=address\nsend_command.start=1"];
WAIT_TRANSMIT [label="WAIT_TRANSMIT\nsend_command.start=0\ncounter=4114"]; WAIT_TRANSMIT [label="WAIT_TRANSMIT\nsend_command.start=0\ncounter=4114"];
@@ -116,8 +139,10 @@ digraph sd_controller {
// Wait for the buffer to be free, then go back to TRANSMIT // Wait for the buffer to be free, then go back to TRANSMIT
WAIT_FOR_BUFFER [label="WAIT_FOR_BUFFER\nready=1"]; WAIT_FOR_BUFFER [label="WAIT_FOR_BUFFER\nready=1"];
WAIT_RESPONSE_CMD7 -> READY_TO_TRANSMIT [label="read_command.ready"] WAIT_RESPONSE_ACMD6 -> READY_TO_TRANSMIT [label="read_command.ready"]
READY_TO_TRANSMIT -> TRANSMIT; READY_TO_TRANSMIT -> DELAY_CLOCK_SWITCH;
DELAY_CLOCK_SWITCH -> TRANSMIT [label="counter==0"];
DELAY_CLOCK_SWITCH -> DELAY_CLOCK_SWITCH [label="counter!=0"];
TRANSMIT -> WAIT_TRANSMIT; TRANSMIT -> WAIT_TRANSMIT;
WAIT_TRANSMIT -> WAIT_TRANSMIT [label="sd_data==1"] WAIT_TRANSMIT -> WAIT_TRANSMIT [label="sd_data==1"]
WAIT_TRANSMIT -> WAIT_END [label="sd_data==0"] WAIT_TRANSMIT -> WAIT_END [label="sd_data==0"]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 KiB

After

Width:  |  Height:  |  Size: 745 KiB

+905
View File
@@ -0,0 +1,905 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: sd_controller Pages: 1 -->
<svg width="880pt" height="5892pt"
viewBox="0.00 0.00 879.78 5891.99" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 5887.99)">
<title>sd_controller</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-5887.99 875.78,-5887.99 875.78,4 -4,4"/>
<!-- INIT -->
<g id="node1" class="node">
<title>INIT</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5803.45" rx="76.54" ry="76.54"/>
<ellipse fill="none" stroke="black" cx="595" cy="-5803.45" rx="80.54" ry="80.54"/>
<text text-anchor="middle" x="595" y="-5814.9" font-family="Times,serif" font-size="14.00">INIT</text>
<text text-anchor="middle" x="595" y="-5798.4" font-family="Times,serif" font-size="14.00">counter=80</text>
<text text-anchor="middle" x="595" y="-5781.9" font-family="Times,serif" font-size="14.00">clk_source=slow</text>
</g>
<!-- WAIT -->
<g id="node2" class="node">
<title>WAIT</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5656.91" rx="46.32" ry="28.99"/>
<text text-anchor="middle" x="595" y="-5660.11" font-family="Times,serif" font-size="14.00">WAIT</text>
<text text-anchor="middle" x="595" y="-5643.61" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- INIT&#45;&gt;WAIT -->
<g id="edge1" class="edge">
<title>INIT&#45;&gt;WAIT</title>
<path fill="none" stroke="black" d="M595,-5722.57C595,-5713.9 595,-5705.37 595,-5697.51"/>
<polygon fill="black" stroke="black" points="598.5,-5697.65 595,-5687.65 591.5,-5697.65 598.5,-5697.65"/>
</g>
<!-- WAIT&#45;&gt;WAIT -->
<g id="edge2" class="edge">
<title>WAIT&#45;&gt;WAIT</title>
<path fill="none" stroke="black" d="M639.49,-5665.71C650.81,-5665.13 659.32,-5662.2 659.32,-5656.91 659.32,-5653.61 655.99,-5651.22 650.74,-5649.76"/>
<polygon fill="black" stroke="black" points="651.39,-5646.31 640.98,-5648.33 650.37,-5653.24 651.39,-5646.31"/>
<text text-anchor="middle" x="689.32" y="-5651.86" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- SEND_CMD0 -->
<g id="node3" class="node">
<title>SEND_CMD0</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5523.09" rx="68.06" ry="52.33"/>
<text text-anchor="middle" x="595" y="-5542.79" font-family="Times,serif" font-size="14.00">SEND_CMD0</text>
<text text-anchor="middle" x="595" y="-5526.29" font-family="Times,serif" font-size="14.00">cmd=0</text>
<text text-anchor="middle" x="595" y="-5509.79" font-family="Times,serif" font-size="14.00">arg=0</text>
<text text-anchor="middle" x="595" y="-5493.29" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- WAIT&#45;&gt;SEND_CMD0 -->
<g id="edge3" class="edge">
<title>WAIT&#45;&gt;SEND_CMD0</title>
<path fill="none" stroke="black" d="M595,-5627.63C595,-5615.69 595,-5601.28 595,-5587.05"/>
<polygon fill="black" stroke="black" points="598.5,-5587.24 595,-5577.24 591.5,-5587.24 598.5,-5587.24"/>
<text text-anchor="middle" x="626.88" y="-5596.62" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- WAIT_CMD0 -->
<g id="node4" class="node">
<title>WAIT_CMD0</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5393.11" rx="67.53" ry="40.66"/>
<text text-anchor="middle" x="595" y="-5404.56" font-family="Times,serif" font-size="14.00">WAIT_CMD0</text>
<text text-anchor="middle" x="595" y="-5388.06" font-family="Times,serif" font-size="14.00">counter=20</text>
<text text-anchor="middle" x="595" y="-5371.56" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND_CMD0&#45;&gt;WAIT_CMD0 -->
<g id="edge4" class="edge">
<title>SEND_CMD0&#45;&gt;WAIT_CMD0</title>
<path fill="none" stroke="black" d="M595,-5470.41C595,-5462.2 595,-5453.72 595,-5445.52"/>
<polygon fill="black" stroke="black" points="598.5,-5445.69 595,-5435.69 591.5,-5445.69 598.5,-5445.69"/>
</g>
<!-- WAIT_CMD0&#45;&gt;WAIT_CMD0 -->
<g id="edge6" class="edge">
<title>WAIT_CMD0&#45;&gt;WAIT_CMD0</title>
<path fill="none" stroke="black" d="M660.62,-5403.55C672.34,-5402.19 680.53,-5398.71 680.53,-5393.11 680.53,-5389.52 677.17,-5386.8 671.67,-5384.95"/>
<polygon fill="black" stroke="black" points="672.61,-5381.57 662.11,-5382.97 671.19,-5388.43 672.61,-5381.57"/>
<text text-anchor="middle" x="742.78" y="-5388.06" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- DELAY_CMD0 -->
<g id="node5" class="node">
<title>DELAY_CMD0</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5270.96" rx="75.48" ry="28.99"/>
<text text-anchor="middle" x="595" y="-5274.16" font-family="Times,serif" font-size="14.00">DELAY_CMD0</text>
<text text-anchor="middle" x="595" y="-5257.66" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- WAIT_CMD0&#45;&gt;DELAY_CMD0 -->
<g id="edge5" class="edge">
<title>WAIT_CMD0&#45;&gt;DELAY_CMD0</title>
<path fill="none" stroke="black" d="M595,-5352.1C595,-5339.14 595,-5324.77 595,-5311.82"/>
<polygon fill="black" stroke="black" points="598.5,-5311.92 595,-5301.92 591.5,-5311.92 598.5,-5311.92"/>
<text text-anchor="middle" x="655" y="-5321.15" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- DELAY_CMD0&#45;&gt;DELAY_CMD0 -->
<g id="edge7" class="edge">
<title>DELAY_CMD0&#45;&gt;DELAY_CMD0</title>
<path fill="none" stroke="black" d="M666.33,-5280.75C679.35,-5279.51 688.48,-5276.24 688.48,-5270.96 688.48,-5267.32 684.17,-5264.65 677.24,-5262.92"/>
<polygon fill="black" stroke="black" points="678.25,-5259.54 667.82,-5261.41 677.14,-5266.45 678.25,-5259.54"/>
<text text-anchor="middle" x="718.48" y="-5265.91" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- SEND_CMD8 -->
<g id="node6" class="node">
<title>SEND_CMD8</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5137.14" rx="68.06" ry="52.33"/>
<text text-anchor="middle" x="595" y="-5156.84" font-family="Times,serif" font-size="14.00">SEND_CMD8</text>
<text text-anchor="middle" x="595" y="-5140.34" font-family="Times,serif" font-size="14.00">cmd=8</text>
<text text-anchor="middle" x="595" y="-5123.84" font-family="Times,serif" font-size="14.00">arg=0x1AA</text>
<text text-anchor="middle" x="595" y="-5107.34" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- DELAY_CMD0&#45;&gt;SEND_CMD8 -->
<g id="edge8" class="edge">
<title>DELAY_CMD0&#45;&gt;SEND_CMD8</title>
<path fill="none" stroke="black" d="M595,-5241.68C595,-5229.74 595,-5215.33 595,-5201.09"/>
<polygon fill="black" stroke="black" points="598.5,-5201.29 595,-5191.29 591.5,-5201.29 598.5,-5201.29"/>
<text text-anchor="middle" x="626.88" y="-5210.67" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- WAIT_CMD8 -->
<g id="node7" class="node">
<title>WAIT_CMD8</title>
<ellipse fill="none" stroke="black" cx="595" cy="-5018.82" rx="67.53" ry="28.99"/>
<text text-anchor="middle" x="595" y="-5022.02" font-family="Times,serif" font-size="14.00">WAIT_CMD8</text>
<text text-anchor="middle" x="595" y="-5005.52" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND_CMD8&#45;&gt;WAIT_CMD8 -->
<g id="edge9" class="edge">
<title>SEND_CMD8&#45;&gt;WAIT_CMD8</title>
<path fill="none" stroke="black" d="M595,-5084.45C595,-5076.05 595,-5067.47 595,-5059.42"/>
<polygon fill="black" stroke="black" points="598.5,-5059.6 595,-5049.6 591.5,-5059.6 598.5,-5059.6"/>
</g>
<!-- WAIT_CMD8&#45;&gt;WAIT_CMD8 -->
<g id="edge10" class="edge">
<title>WAIT_CMD8&#45;&gt;WAIT_CMD8</title>
<path fill="none" stroke="black" d="M659.89,-5027.27C672,-5026.23 680.53,-5023.42 680.53,-5018.82 680.53,-5015.81 676.86,-5013.56 670.91,-5012.08"/>
<polygon fill="black" stroke="black" points="671.81,-5008.68 661.39,-5010.61 670.74,-5015.59 671.81,-5008.68"/>
<text text-anchor="middle" x="742.78" y="-5013.77" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_CMD8 -->
<g id="node8" class="node">
<title>LISTEN_RESPONSE_CMD8</title>
<ellipse fill="none" stroke="black" cx="595" cy="-4896.67" rx="128.52" ry="40.66"/>
<text text-anchor="middle" x="595" y="-4908.12" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_CMD8</text>
<text text-anchor="middle" x="595" y="-4891.62" font-family="Times,serif" font-size="14.00">response_type=7</text>
<text text-anchor="middle" x="595" y="-4875.12" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_CMD8&#45;&gt;LISTEN_RESPONSE_CMD8 -->
<g id="edge11" class="edge">
<title>WAIT_CMD8&#45;&gt;LISTEN_RESPONSE_CMD8</title>
<path fill="none" stroke="black" d="M595,-4989.35C595,-4977.31 595,-4962.91 595,-4949.13"/>
<polygon fill="black" stroke="black" points="598.5,-4949.28 595,-4939.28 591.5,-4949.28 598.5,-4949.28"/>
<text text-anchor="middle" x="655" y="-4958.53" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_CMD8 -->
<g id="node9" class="node">
<title>WAIT_RESPONSE_CMD8</title>
<ellipse fill="none" stroke="black" cx="595" cy="-4790.02" rx="120.03" ry="28.99"/>
<text text-anchor="middle" x="595" y="-4793.22" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_CMD8</text>
<text text-anchor="middle" x="595" y="-4776.72" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE_CMD8&#45;&gt;WAIT_RESPONSE_CMD8 -->
<g id="edge12" class="edge">
<title>LISTEN_RESPONSE_CMD8&#45;&gt;WAIT_RESPONSE_CMD8</title>
<path fill="none" stroke="black" d="M595,-4855.81C595,-4847.57 595,-4838.88 595,-4830.65"/>
<polygon fill="black" stroke="black" points="598.5,-4830.91 595,-4820.91 591.5,-4830.91 598.5,-4830.91"/>
</g>
<!-- WAIT_RESPONSE_CMD8&#45;&gt;WAIT_RESPONSE_CMD8 -->
<g id="edge13" class="edge">
<title>WAIT_RESPONSE_CMD8&#45;&gt;WAIT_RESPONSE_CMD8</title>
<path fill="none" stroke="black" d="M711.31,-4797.57C724.49,-4796.16 733.03,-4793.64 733.03,-4790.02 733.03,-4787.59 729.18,-4785.66 722.65,-4784.22"/>
<polygon fill="black" stroke="black" points="723.22,-4780.77 712.8,-4782.71 722.15,-4787.69 723.22,-4780.77"/>
<text text-anchor="middle" x="802.41" y="-4784.97" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- SEND_CMD55 -->
<g id="node10" class="node">
<title>SEND_CMD55</title>
<ellipse fill="none" stroke="black" cx="595" cy="-4656.21" rx="72.83" ry="52.33"/>
<text text-anchor="middle" x="595" y="-4675.91" font-family="Times,serif" font-size="14.00">SEND_CMD55</text>
<text text-anchor="middle" x="595" y="-4659.41" font-family="Times,serif" font-size="14.00">cmd=55</text>
<text text-anchor="middle" x="595" y="-4642.91" font-family="Times,serif" font-size="14.00">arg=0</text>
<text text-anchor="middle" x="595" y="-4626.41" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- WAIT_RESPONSE_CMD8&#45;&gt;SEND_CMD55 -->
<g id="edge14" class="edge">
<title>WAIT_RESPONSE_CMD8&#45;&gt;SEND_CMD55</title>
<path fill="none" stroke="black" d="M595,-4760.75C595,-4748.81 595,-4734.39 595,-4720.16"/>
<polygon fill="black" stroke="black" points="598.5,-4720.35 595,-4710.35 591.5,-4720.35 598.5,-4720.35"/>
<text text-anchor="middle" x="662.13" y="-4729.73" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT_CMD55 -->
<g id="node11" class="node">
<title>WAIT_CMD55</title>
<ellipse fill="none" stroke="black" cx="470" cy="-4537.89" rx="72.3" ry="28.99"/>
<text text-anchor="middle" x="470" y="-4541.09" font-family="Times,serif" font-size="14.00">WAIT_CMD55</text>
<text text-anchor="middle" x="470" y="-4524.59" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND_CMD55&#45;&gt;WAIT_CMD55 -->
<g id="edge15" class="edge">
<title>SEND_CMD55&#45;&gt;WAIT_CMD55</title>
<path fill="none" stroke="black" d="M550.93,-4614.2C536.38,-4600.66 520.36,-4585.75 506.44,-4572.8"/>
<polygon fill="black" stroke="black" points="508.9,-4570.3 499.19,-4566.05 504.13,-4575.43 508.9,-4570.3"/>
</g>
<!-- WAIT_CMD55&#45;&gt;WAIT_CMD55 -->
<g id="edge16" class="edge">
<title>WAIT_CMD55&#45;&gt;WAIT_CMD55</title>
<path fill="none" stroke="black" d="M539.67,-4546.24C551.84,-4545.12 560.3,-4542.34 560.3,-4537.89 560.3,-4534.97 556.66,-4532.76 550.71,-4531.28"/>
<polygon fill="black" stroke="black" points="551.58,-4527.88 541.16,-4529.78 550.5,-4534.79 551.58,-4527.88"/>
<text text-anchor="middle" x="622.55" y="-4532.84" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_CMD55 -->
<g id="node12" class="node">
<title>LISTEN_RESPONSE_CMD55</title>
<ellipse fill="none" stroke="black" cx="445" cy="-4415.74" rx="133.29" ry="40.66"/>
<text text-anchor="middle" x="445" y="-4427.19" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_CMD55</text>
<text text-anchor="middle" x="445" y="-4410.69" font-family="Times,serif" font-size="14.00">response_type=1</text>
<text text-anchor="middle" x="445" y="-4394.19" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_CMD55&#45;&gt;LISTEN_RESPONSE_CMD55 -->
<g id="edge17" class="edge">
<title>WAIT_CMD55&#45;&gt;LISTEN_RESPONSE_CMD55</title>
<path fill="none" stroke="black" d="M464.14,-4508.72C461.59,-4496.46 458.52,-4481.7 455.59,-4467.63"/>
<polygon fill="black" stroke="black" points="459.06,-4467.12 453.59,-4458.04 452.2,-4468.54 459.06,-4467.12"/>
<text text-anchor="middle" x="519.74" y="-4477.6" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_CMD55 -->
<g id="node13" class="node">
<title>WAIT_RESPONSE_CMD55</title>
<ellipse fill="none" stroke="black" cx="407" cy="-4309.09" rx="124.8" ry="28.99"/>
<text text-anchor="middle" x="407" y="-4312.29" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_CMD55</text>
<text text-anchor="middle" x="407" y="-4295.79" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE_CMD55&#45;&gt;WAIT_RESPONSE_CMD55 -->
<g id="edge18" class="edge">
<title>LISTEN_RESPONSE_CMD55&#45;&gt;WAIT_RESPONSE_CMD55</title>
<path fill="none" stroke="black" d="M430.53,-4374.88C427.46,-4366.44 424.23,-4357.55 421.18,-4349.15"/>
<polygon fill="black" stroke="black" points="424.52,-4348.09 417.82,-4339.88 417.94,-4350.48 424.52,-4348.09"/>
</g>
<!-- WAIT_RESPONSE_CMD55&#45;&gt;WAIT_RESPONSE_CMD55 -->
<g id="edge19" class="edge">
<title>WAIT_RESPONSE_CMD55&#45;&gt;WAIT_RESPONSE_CMD55</title>
<path fill="none" stroke="black" d="M528.11,-4316.55C541.3,-4315.12 549.8,-4312.64 549.8,-4309.09 549.8,-4306.71 545.97,-4304.8 539.45,-4303.37"/>
<polygon fill="black" stroke="black" points="540.02,-4299.92 529.61,-4301.86 538.96,-4306.84 540.02,-4299.92"/>
<text text-anchor="middle" x="619.18" y="-4304.04" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- SEND_ACMD41 -->
<g id="node14" class="node">
<title>SEND_ACMD41</title>
<ellipse fill="none" stroke="black" cx="407" cy="-4175.27" rx="79.73" ry="52.33"/>
<text text-anchor="middle" x="407" y="-4194.97" font-family="Times,serif" font-size="14.00">SEND_ACMD41</text>
<text text-anchor="middle" x="407" y="-4178.47" font-family="Times,serif" font-size="14.00">cmd=41</text>
<text text-anchor="middle" x="407" y="-4161.97" font-family="Times,serif" font-size="14.00">arg=0x40100000</text>
<text text-anchor="middle" x="407" y="-4145.47" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- WAIT_RESPONSE_CMD55&#45;&gt;SEND_ACMD41 -->
<g id="edge20" class="edge">
<title>WAIT_RESPONSE_CMD55&#45;&gt;SEND_ACMD41</title>
<path fill="none" stroke="black" d="M407,-4279.81C407,-4267.87 407,-4253.46 407,-4239.23"/>
<polygon fill="black" stroke="black" points="410.5,-4239.42 407,-4229.42 403.5,-4239.42 410.5,-4239.42"/>
<text text-anchor="middle" x="474.13" y="-4248.8" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT_ACMD41 -->
<g id="node15" class="node">
<title>WAIT_ACMD41</title>
<ellipse fill="none" stroke="black" cx="407" cy="-4056.95" rx="79.2" ry="28.99"/>
<text text-anchor="middle" x="407" y="-4060.15" font-family="Times,serif" font-size="14.00">WAIT_ACMD41</text>
<text text-anchor="middle" x="407" y="-4043.65" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND_ACMD41&#45;&gt;WAIT_ACMD41 -->
<g id="edge21" class="edge">
<title>SEND_ACMD41&#45;&gt;WAIT_ACMD41</title>
<path fill="none" stroke="black" d="M407,-4122.58C407,-4114.18 407,-4105.6 407,-4097.55"/>
<polygon fill="black" stroke="black" points="410.5,-4097.73 407,-4087.73 403.5,-4097.73 410.5,-4097.73"/>
</g>
<!-- WAIT_ACMD41&#45;&gt;WAIT_ACMD41 -->
<g id="edge22" class="edge">
<title>WAIT_ACMD41&#45;&gt;WAIT_ACMD41</title>
<path fill="none" stroke="black" d="M483.2,-4065.19C495.64,-4064.01 504.2,-4061.27 504.2,-4056.95 504.2,-4054.12 500.51,-4051.97 494.46,-4050.49"/>
<polygon fill="black" stroke="black" points="495.12,-4047.05 484.7,-4048.95 494.03,-4053.96 495.12,-4047.05"/>
<text text-anchor="middle" x="566.45" y="-4051.9" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_ACMD41 -->
<g id="node16" class="node">
<title>LISTEN_RESPONSE_ACMD41</title>
<ellipse fill="none" stroke="black" cx="405" cy="-3934.8" rx="140.18" ry="40.66"/>
<text text-anchor="middle" x="405" y="-3946.25" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_ACMD41</text>
<text text-anchor="middle" x="405" y="-3929.75" font-family="Times,serif" font-size="14.00">response_type=3</text>
<text text-anchor="middle" x="405" y="-3913.25" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_ACMD41&#45;&gt;LISTEN_RESPONSE_ACMD41 -->
<g id="edge23" class="edge">
<title>WAIT_ACMD41&#45;&gt;LISTEN_RESPONSE_ACMD41</title>
<path fill="none" stroke="black" d="M406.53,-4027.48C406.33,-4015.44 406.09,-4001.04 405.86,-3987.26"/>
<polygon fill="black" stroke="black" points="409.36,-3987.35 405.69,-3977.41 402.36,-3987.46 409.36,-3987.35"/>
<text text-anchor="middle" x="466.18" y="-3996.66" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_ACMD41 -->
<g id="node17" class="node">
<title>WAIT_RESPONSE_ACMD41</title>
<ellipse fill="none" stroke="black" cx="401" cy="-3816.49" rx="131.7" ry="40.66"/>
<text text-anchor="middle" x="401" y="-3827.94" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_ACMD41</text>
<text text-anchor="middle" x="401" y="-3811.44" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
<text text-anchor="middle" x="401" y="-3794.94" font-family="Times,serif" font-size="14.00">counter=100</text>
</g>
<!-- LISTEN_RESPONSE_ACMD41&#45;&gt;WAIT_RESPONSE_ACMD41 -->
<g id="edge24" class="edge">
<title>LISTEN_RESPONSE_ACMD41&#45;&gt;WAIT_RESPONSE_ACMD41</title>
<path fill="none" stroke="black" d="M403.62,-3893.77C403.35,-3885.73 403.05,-3877.18 402.77,-3868.81"/>
<polygon fill="black" stroke="black" points="406.27,-3868.98 402.43,-3859.1 399.28,-3869.22 406.27,-3868.98"/>
</g>
<!-- WAIT_RESPONSE_ACMD41&#45;&gt;WAIT_RESPONSE_ACMD41 -->
<g id="edge25" class="edge">
<title>WAIT_RESPONSE_ACMD41&#45;&gt;WAIT_RESPONSE_ACMD41</title>
<path fill="none" stroke="black" d="M529.82,-3825.53C542.58,-3823.72 550.7,-3820.7 550.7,-3816.49 550.7,-3813.65 547.04,-3811.36 540.76,-3809.62"/>
<polygon fill="black" stroke="black" points="541.8,-3806.25 531.31,-3807.74 540.44,-3813.12 541.8,-3806.25"/>
<text text-anchor="middle" x="620.07" y="-3811.44" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- ACMD41_DELAY -->
<g id="node18" class="node">
<title>ACMD41_DELAY</title>
<ellipse fill="none" stroke="black" cx="590" cy="-3671" rx="87.15" ry="28.99"/>
<text text-anchor="middle" x="590" y="-3674.2" font-family="Times,serif" font-size="14.00">ACMD41_DELAY</text>
<text text-anchor="middle" x="590" y="-3657.7" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- WAIT_RESPONSE_ACMD41&#45;&gt;ACMD41_DELAY -->
<g id="edge26" class="edge">
<title>WAIT_RESPONSE_ACMD41&#45;&gt;ACMD41_DELAY</title>
<path fill="none" stroke="black" d="M430.37,-3776.49C440.6,-3764.37 452.69,-3751.53 465.25,-3741.33 484.68,-3725.55 508.19,-3711.43 529.55,-3700.12"/>
<polygon fill="black" stroke="black" points="530.9,-3703.36 538.16,-3695.66 527.68,-3697.15 530.9,-3703.36"/>
<text text-anchor="middle" x="584.13" y="-3744.53" font-family="Times,serif" font-size="14.00">read_command.received &amp;&amp; !out_data[39]</text>
</g>
<!-- SEND_CMD2 -->
<g id="node19" class="node">
<title>SEND_CMD2</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3671" rx="102" ry="52.33"/>
<text text-anchor="middle" x="208" y="-3690.7" font-family="Times,serif" font-size="14.00">SEND_CMD2</text>
<text text-anchor="middle" x="208" y="-3674.2" font-family="Times,serif" font-size="14.00">cmd=2</text>
<text text-anchor="middle" x="208" y="-3657.7" font-family="Times,serif" font-size="14.00">arg=0</text>
<text text-anchor="middle" x="208" y="-3641.2" font-family="Times,serif" font-size="14.00">send_command.start=1</text>
</g>
<!-- WAIT_RESPONSE_ACMD41&#45;&gt;SEND_CMD2 -->
<g id="edge29" class="edge">
<title>WAIT_RESPONSE_ACMD41&#45;&gt;SEND_CMD2</title>
<path fill="none" stroke="black" d="M277.39,-3802.37C251.18,-3793.67 226.42,-3779.79 209.75,-3757.83 204.67,-3751.14 201.74,-3743.23 200.27,-3734.97"/>
<polygon fill="black" stroke="black" points="203.75,-3734.65 199.24,-3725.07 196.79,-3735.37 203.75,-3734.65"/>
<text text-anchor="middle" x="326.38" y="-3744.53" font-family="Times,serif" font-size="14.00">read_command.received &amp;&amp; out_data[39]</text>
</g>
<!-- ACMD41_DELAY&#45;&gt;SEND_CMD55 -->
<g id="edge28" class="edge">
<title>ACMD41_DELAY&#45;&gt;SEND_CMD55</title>
<path fill="none" stroke="black" d="M644.9,-3693.9C666.16,-3705.04 688.76,-3720.67 703,-3741.33 722.04,-3768.94 717,-3781.95 717,-3815.49 717,-4538.89 717,-4538.89 717,-4538.89 717,-4572.94 691.8,-4600.06 664.31,-4619.53"/>
<polygon fill="black" stroke="black" points="662.53,-4616.5 656.18,-4624.99 666.44,-4622.31 662.53,-4616.5"/>
<text text-anchor="middle" x="748.88" y="-4170.22" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- ACMD41_DELAY&#45;&gt;ACMD41_DELAY -->
<g id="edge27" class="edge">
<title>ACMD41_DELAY&#45;&gt;ACMD41_DELAY</title>
<path fill="none" stroke="black" d="M668.87,-3683.69C684.24,-3682.22 695.15,-3677.99 695.15,-3671 695.15,-3665.87 689.27,-3662.23 680.05,-3660.07"/>
<polygon fill="black" stroke="black" points="680.79,-3656.64 670.37,-3658.55 679.7,-3663.56 680.79,-3656.64"/>
<text text-anchor="middle" x="725.15" y="-3665.95" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- WAIT_CMD2 -->
<g id="node20" class="node">
<title>WAIT_CMD2</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3552.69" rx="102" ry="28.99"/>
<text text-anchor="middle" x="208" y="-3555.89" font-family="Times,serif" font-size="14.00">WAIT_CMD2</text>
<text text-anchor="middle" x="208" y="-3539.39" font-family="Times,serif" font-size="14.00">send_command.start=0</text>
</g>
<!-- SEND_CMD2&#45;&gt;WAIT_CMD2 -->
<g id="edge30" class="edge">
<title>SEND_CMD2&#45;&gt;WAIT_CMD2</title>
<path fill="none" stroke="black" d="M208,-3618.31C208,-3609.91 208,-3601.33 208,-3593.28"/>
<polygon fill="black" stroke="black" points="211.5,-3593.46 208,-3583.46 204.5,-3593.46 211.5,-3593.46"/>
</g>
<!-- WAIT_CMD2&#45;&gt;WAIT_CMD2 -->
<g id="edge31" class="edge">
<title>WAIT_CMD2&#45;&gt;WAIT_CMD2</title>
<path fill="none" stroke="black" d="M306.4,-3560.54C319.39,-3559.2 328,-3556.58 328,-3552.69 328,-3550.07 324.11,-3548.03 317.62,-3546.56"/>
<polygon fill="black" stroke="black" points="318.31,-3543.13 307.9,-3545.06 317.25,-3550.05 318.31,-3543.13"/>
<text text-anchor="middle" x="390.25" y="-3547.64" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_CMD2 -->
<g id="node21" class="node">
<title>LISTEN_RESPONSE_CMD2</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3430.54" rx="128.52" ry="40.66"/>
<text text-anchor="middle" x="208" y="-3441.99" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_CMD2</text>
<text text-anchor="middle" x="208" y="-3425.49" font-family="Times,serif" font-size="14.00">response_type=2</text>
<text text-anchor="middle" x="208" y="-3408.99" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_CMD2&#45;&gt;LISTEN_RESPONSE_CMD2 -->
<g id="edge32" class="edge">
<title>WAIT_CMD2&#45;&gt;LISTEN_RESPONSE_CMD2</title>
<path fill="none" stroke="black" d="M208,-3523.21C208,-3511.18 208,-3496.77 208,-3482.99"/>
<polygon fill="black" stroke="black" points="211.5,-3483.14 208,-3473.14 204.5,-3483.14 211.5,-3483.14"/>
<text text-anchor="middle" x="268" y="-3492.39" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_CMD2 -->
<g id="node22" class="node">
<title>WAIT_RESPONSE_CMD2</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3323.89" rx="120.03" ry="28.99"/>
<text text-anchor="middle" x="208" y="-3327.09" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_CMD2</text>
<text text-anchor="middle" x="208" y="-3310.59" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE_CMD2&#45;&gt;WAIT_RESPONSE_CMD2 -->
<g id="edge33" class="edge">
<title>LISTEN_RESPONSE_CMD2&#45;&gt;WAIT_RESPONSE_CMD2</title>
<path fill="none" stroke="black" d="M208,-3389.67C208,-3381.43 208,-3372.75 208,-3364.51"/>
<polygon fill="black" stroke="black" points="211.5,-3364.77 208,-3354.77 204.5,-3364.77 211.5,-3364.77"/>
</g>
<!-- WAIT_RESPONSE_CMD2&#45;&gt;WAIT_RESPONSE_CMD2 -->
<g id="edge34" class="edge">
<title>WAIT_RESPONSE_CMD2&#45;&gt;WAIT_RESPONSE_CMD2</title>
<path fill="none" stroke="black" d="M324.31,-3331.43C337.49,-3330.02 346.03,-3327.5 346.03,-3323.89 346.03,-3321.45 342.18,-3319.52 335.65,-3318.09"/>
<polygon fill="black" stroke="black" points="336.22,-3314.63 325.8,-3316.57 335.15,-3321.55 336.22,-3314.63"/>
<text text-anchor="middle" x="415.41" y="-3318.84" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- SEND_CMD3 -->
<g id="node23" class="node">
<title>SEND_CMD3</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3190.07" rx="102" ry="52.33"/>
<text text-anchor="middle" x="208" y="-3209.77" font-family="Times,serif" font-size="14.00">SEND_CMD3</text>
<text text-anchor="middle" x="208" y="-3193.27" font-family="Times,serif" font-size="14.00">cmd=3</text>
<text text-anchor="middle" x="208" y="-3176.77" font-family="Times,serif" font-size="14.00">arg=0</text>
<text text-anchor="middle" x="208" y="-3160.27" font-family="Times,serif" font-size="14.00">send_command.start=1</text>
</g>
<!-- WAIT_RESPONSE_CMD2&#45;&gt;SEND_CMD3 -->
<g id="edge35" class="edge">
<title>WAIT_RESPONSE_CMD2&#45;&gt;SEND_CMD3</title>
<path fill="none" stroke="black" d="M208,-3294.61C208,-3282.67 208,-3268.25 208,-3254.02"/>
<polygon fill="black" stroke="black" points="211.5,-3254.21 208,-3244.21 204.5,-3254.21 211.5,-3254.21"/>
<text text-anchor="middle" x="275.13" y="-3263.59" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT_CMD3 -->
<g id="node24" class="node">
<title>WAIT_CMD3</title>
<ellipse fill="none" stroke="black" cx="208" cy="-3071.75" rx="102" ry="28.99"/>
<text text-anchor="middle" x="208" y="-3074.95" font-family="Times,serif" font-size="14.00">WAIT_CMD3</text>
<text text-anchor="middle" x="208" y="-3058.45" font-family="Times,serif" font-size="14.00">send_command.start=0</text>
</g>
<!-- SEND_CMD3&#45;&gt;WAIT_CMD3 -->
<g id="edge36" class="edge">
<title>SEND_CMD3&#45;&gt;WAIT_CMD3</title>
<path fill="none" stroke="black" d="M208,-3137.37C208,-3128.97 208,-3120.39 208,-3112.34"/>
<polygon fill="black" stroke="black" points="211.5,-3112.53 208,-3102.53 204.5,-3112.53 211.5,-3112.53"/>
</g>
<!-- WAIT_CMD3&#45;&gt;WAIT_CMD3 -->
<g id="edge37" class="edge">
<title>WAIT_CMD3&#45;&gt;WAIT_CMD3</title>
<path fill="none" stroke="black" d="M306.4,-3079.6C319.39,-3078.26 328,-3075.65 328,-3071.75 328,-3069.13 324.11,-3067.09 317.62,-3065.63"/>
<polygon fill="black" stroke="black" points="318.31,-3062.19 307.9,-3064.13 317.25,-3069.11 318.31,-3062.19"/>
<text text-anchor="middle" x="390.25" y="-3066.7" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_CMD3 -->
<g id="node25" class="node">
<title>LISTEN_RESPONSE_CMD3</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2949.6" rx="128.52" ry="40.66"/>
<text text-anchor="middle" x="208" y="-2961.05" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_CMD3</text>
<text text-anchor="middle" x="208" y="-2944.55" font-family="Times,serif" font-size="14.00">response_type=6</text>
<text text-anchor="middle" x="208" y="-2928.05" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_CMD3&#45;&gt;LISTEN_RESPONSE_CMD3 -->
<g id="edge38" class="edge">
<title>WAIT_CMD3&#45;&gt;LISTEN_RESPONSE_CMD3</title>
<path fill="none" stroke="black" d="M208,-3042.28C208,-3030.24 208,-3015.84 208,-3002.06"/>
<polygon fill="black" stroke="black" points="211.5,-3002.2 208,-2992.2 204.5,-3002.2 211.5,-3002.2"/>
<text text-anchor="middle" x="268" y="-3011.46" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_CMD3 -->
<g id="node26" class="node">
<title>WAIT_RESPONSE_CMD3</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2842.95" rx="120.03" ry="28.99"/>
<text text-anchor="middle" x="208" y="-2846.15" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_CMD3</text>
<text text-anchor="middle" x="208" y="-2829.65" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE_CMD3&#45;&gt;WAIT_RESPONSE_CMD3 -->
<g id="edge39" class="edge">
<title>LISTEN_RESPONSE_CMD3&#45;&gt;WAIT_RESPONSE_CMD3</title>
<path fill="none" stroke="black" d="M208,-2908.74C208,-2900.49 208,-2891.81 208,-2883.57"/>
<polygon fill="black" stroke="black" points="211.5,-2883.83 208,-2873.83 204.5,-2883.83 211.5,-2883.83"/>
</g>
<!-- WAIT_RESPONSE_CMD3&#45;&gt;WAIT_RESPONSE_CMD3 -->
<g id="edge40" class="edge">
<title>WAIT_RESPONSE_CMD3&#45;&gt;WAIT_RESPONSE_CMD3</title>
<path fill="none" stroke="black" d="M324.31,-2850.5C337.49,-2849.08 346.03,-2846.57 346.03,-2842.95 346.03,-2840.52 342.18,-2838.59 335.65,-2837.15"/>
<polygon fill="black" stroke="black" points="336.22,-2833.7 325.8,-2835.64 335.15,-2840.62 336.22,-2833.7"/>
<text text-anchor="middle" x="415.41" y="-2837.9" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- SEND_CMD7 -->
<g id="node27" class="node">
<title>SEND_CMD7</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2709.13" rx="137.53" ry="52.33"/>
<text text-anchor="middle" x="208" y="-2728.83" font-family="Times,serif" font-size="14.00">SEND_CMD7</text>
<text text-anchor="middle" x="208" y="-2712.33" font-family="Times,serif" font-size="14.00">cmd=7</text>
<text text-anchor="middle" x="208" y="-2695.83" font-family="Times,serif" font-size="14.00">arg={out_data[39:24],16&#39;h0000}</text>
<text text-anchor="middle" x="208" y="-2679.33" font-family="Times,serif" font-size="14.00">send_command.start=1</text>
</g>
<!-- WAIT_RESPONSE_CMD3&#45;&gt;SEND_CMD7 -->
<g id="edge41" class="edge">
<title>WAIT_RESPONSE_CMD3&#45;&gt;SEND_CMD7</title>
<path fill="none" stroke="black" d="M208,-2813.67C208,-2801.73 208,-2787.32 208,-2773.09"/>
<polygon fill="black" stroke="black" points="211.5,-2773.28 208,-2763.28 204.5,-2773.28 211.5,-2773.28"/>
<text text-anchor="middle" x="275.13" y="-2782.66" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT_CMD7 -->
<g id="node28" class="node">
<title>WAIT_CMD7</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2590.82" rx="102" ry="28.99"/>
<text text-anchor="middle" x="208" y="-2594.02" font-family="Times,serif" font-size="14.00">WAIT_CMD7</text>
<text text-anchor="middle" x="208" y="-2577.52" font-family="Times,serif" font-size="14.00">send_command.start=0</text>
</g>
<!-- SEND_CMD7&#45;&gt;WAIT_CMD7 -->
<g id="edge42" class="edge">
<title>SEND_CMD7&#45;&gt;WAIT_CMD7</title>
<path fill="none" stroke="black" d="M208,-2656.44C208,-2648.04 208,-2639.46 208,-2631.41"/>
<polygon fill="black" stroke="black" points="211.5,-2631.59 208,-2621.59 204.5,-2631.59 211.5,-2631.59"/>
</g>
<!-- WAIT_CMD7&#45;&gt;WAIT_CMD7 -->
<g id="edge43" class="edge">
<title>WAIT_CMD7&#45;&gt;WAIT_CMD7</title>
<path fill="none" stroke="black" d="M306.4,-2598.67C319.39,-2597.33 328,-2594.71 328,-2590.82 328,-2588.2 324.11,-2586.16 317.62,-2584.69"/>
<polygon fill="black" stroke="black" points="318.31,-2581.26 307.9,-2583.19 317.25,-2588.18 318.31,-2581.26"/>
<text text-anchor="middle" x="390.25" y="-2585.77" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_CMD7 -->
<g id="node29" class="node">
<title>LISTEN_RESPONSE_CMD7</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2468.67" rx="128.52" ry="40.66"/>
<text text-anchor="middle" x="208" y="-2480.12" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_CMD7</text>
<text text-anchor="middle" x="208" y="-2463.62" font-family="Times,serif" font-size="14.00">response_type=1</text>
<text text-anchor="middle" x="208" y="-2447.12" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_CMD7&#45;&gt;LISTEN_RESPONSE_CMD7 -->
<g id="edge44" class="edge">
<title>WAIT_CMD7&#45;&gt;LISTEN_RESPONSE_CMD7</title>
<path fill="none" stroke="black" d="M208,-2561.34C208,-2549.31 208,-2534.91 208,-2521.12"/>
<polygon fill="black" stroke="black" points="211.5,-2521.27 208,-2511.27 204.5,-2521.27 211.5,-2521.27"/>
<text text-anchor="middle" x="268" y="-2530.52" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_CMD7 -->
<g id="node30" class="node">
<title>WAIT_RESPONSE_CMD7</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2362.02" rx="120.03" ry="28.99"/>
<text text-anchor="middle" x="208" y="-2365.22" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_CMD7</text>
<text text-anchor="middle" x="208" y="-2348.72" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE_CMD7&#45;&gt;WAIT_RESPONSE_CMD7 -->
<g id="edge45" class="edge">
<title>LISTEN_RESPONSE_CMD7&#45;&gt;WAIT_RESPONSE_CMD7</title>
<path fill="none" stroke="black" d="M208,-2427.8C208,-2419.56 208,-2410.88 208,-2402.64"/>
<polygon fill="black" stroke="black" points="211.5,-2402.9 208,-2392.9 204.5,-2402.9 211.5,-2402.9"/>
</g>
<!-- WAIT_RESPONSE_CMD7&#45;&gt;WAIT_RESPONSE_CMD7 -->
<g id="edge46" class="edge">
<title>WAIT_RESPONSE_CMD7&#45;&gt;WAIT_RESPONSE_CMD7</title>
<path fill="none" stroke="black" d="M324.31,-2369.56C337.49,-2368.15 346.03,-2365.63 346.03,-2362.02 346.03,-2359.59 342.18,-2357.65 335.65,-2356.22"/>
<polygon fill="black" stroke="black" points="336.22,-2352.76 325.8,-2354.7 335.15,-2359.68 336.22,-2352.76"/>
<text text-anchor="middle" x="407.53" y="-2356.97" font-family="Times,serif" font-size="14.00">!read_command.ready</text>
</g>
<!-- SEND2_CMD55 -->
<g id="node31" class="node">
<title>SEND2_CMD55</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2239.87" rx="77.6" ry="40.66"/>
<text text-anchor="middle" x="208" y="-2251.32" font-family="Times,serif" font-size="14.00">SEND2_CMD55</text>
<text text-anchor="middle" x="208" y="-2234.82" font-family="Times,serif" font-size="14.00">cmd=55</text>
<text text-anchor="middle" x="208" y="-2218.32" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- WAIT_RESPONSE_CMD7&#45;&gt;SEND2_CMD55 -->
<g id="edge47" class="edge">
<title>WAIT_RESPONSE_CMD7&#45;&gt;SEND2_CMD55</title>
<path fill="none" stroke="black" d="M208,-2332.54C208,-2320.51 208,-2306.11 208,-2292.32"/>
<polygon fill="black" stroke="black" points="211.5,-2292.47 208,-2282.47 204.5,-2292.47 211.5,-2292.47"/>
<text text-anchor="middle" x="275.13" y="-2301.72" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT2_CMD55 -->
<g id="node32" class="node">
<title>WAIT2_CMD55</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2133.22" rx="77.07" ry="28.99"/>
<text text-anchor="middle" x="208" y="-2136.42" font-family="Times,serif" font-size="14.00">WAIT2_CMD55</text>
<text text-anchor="middle" x="208" y="-2119.92" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND2_CMD55&#45;&gt;WAIT2_CMD55 -->
<g id="edge48" class="edge">
<title>SEND2_CMD55&#45;&gt;WAIT2_CMD55</title>
<path fill="none" stroke="black" d="M208,-2199C208,-2190.76 208,-2182.08 208,-2173.84"/>
<polygon fill="black" stroke="black" points="211.5,-2174.1 208,-2164.1 204.5,-2174.1 211.5,-2174.1"/>
</g>
<!-- WAIT2_CMD55&#45;&gt;WAIT2_CMD55 -->
<g id="edge49" class="edge">
<title>WAIT2_CMD55&#45;&gt;WAIT2_CMD55</title>
<path fill="none" stroke="black" d="M282.14,-2141.49C294.53,-2140.33 303.07,-2137.58 303.07,-2133.22 303.07,-2130.36 299.39,-2128.18 293.36,-2126.7"/>
<polygon fill="black" stroke="black" points="294.06,-2123.27 283.64,-2125.17 292.98,-2130.18 294.06,-2123.27"/>
<text text-anchor="middle" x="365.32" y="-2128.17" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE2_CMD55 -->
<g id="node33" class="node">
<title>LISTEN_RESPONSE2_CMD55</title>
<ellipse fill="none" stroke="black" cx="208" cy="-2011.07" rx="138.06" ry="40.66"/>
<text text-anchor="middle" x="208" y="-2022.52" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE2_CMD55</text>
<text text-anchor="middle" x="208" y="-2006.02" font-family="Times,serif" font-size="14.00">response_type=1</text>
<text text-anchor="middle" x="208" y="-1989.52" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT2_CMD55&#45;&gt;LISTEN_RESPONSE2_CMD55 -->
<g id="edge50" class="edge">
<title>WAIT2_CMD55&#45;&gt;LISTEN_RESPONSE2_CMD55</title>
<path fill="none" stroke="black" d="M208,-2103.74C208,-2091.71 208,-2077.31 208,-2063.52"/>
<polygon fill="black" stroke="black" points="211.5,-2063.67 208,-2053.67 204.5,-2063.67 211.5,-2063.67"/>
<text text-anchor="middle" x="268" y="-2072.92" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE2_CMD55 -->
<g id="node34" class="node">
<title>WAIT_RESPONSE2_CMD55</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1904.42" rx="129.58" ry="28.99"/>
<text text-anchor="middle" x="208" y="-1907.62" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE2_CMD55</text>
<text text-anchor="middle" x="208" y="-1891.12" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
</g>
<!-- LISTEN_RESPONSE2_CMD55&#45;&gt;WAIT_RESPONSE2_CMD55 -->
<g id="edge51" class="edge">
<title>LISTEN_RESPONSE2_CMD55&#45;&gt;WAIT_RESPONSE2_CMD55</title>
<path fill="none" stroke="black" d="M208,-1970.2C208,-1961.96 208,-1953.28 208,-1945.04"/>
<polygon fill="black" stroke="black" points="211.5,-1945.3 208,-1935.3 204.5,-1945.3 211.5,-1945.3"/>
</g>
<!-- WAIT_RESPONSE2_CMD55&#45;&gt;WAIT_RESPONSE2_CMD55 -->
<g id="edge52" class="edge">
<title>WAIT_RESPONSE2_CMD55&#45;&gt;WAIT_RESPONSE2_CMD55</title>
<path fill="none" stroke="black" d="M333.69,-1911.82C347.02,-1910.39 355.58,-1907.92 355.58,-1904.42 355.58,-1902.01 351.53,-1900.09 344.67,-1898.66"/>
<polygon fill="black" stroke="black" points="345.6,-1895.26 335.19,-1897.23 344.56,-1902.18 345.6,-1895.26"/>
<text text-anchor="middle" x="424.95" y="-1899.37" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- SEND_ACMD6 -->
<g id="node35" class="node">
<title>SEND_ACMD6</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1770.6" rx="77.07" ry="52.33"/>
<text text-anchor="middle" x="208" y="-1790.3" font-family="Times,serif" font-size="14.00">SEND_ACMD6</text>
<text text-anchor="middle" x="208" y="-1773.8" font-family="Times,serif" font-size="14.00">cmd=6</text>
<text text-anchor="middle" x="208" y="-1757.3" font-family="Times,serif" font-size="14.00">arg=0x00000002</text>
<text text-anchor="middle" x="208" y="-1740.8" font-family="Times,serif" font-size="14.00">start=1</text>
</g>
<!-- WAIT_RESPONSE2_CMD55&#45;&gt;SEND_ACMD6 -->
<g id="edge53" class="edge">
<title>WAIT_RESPONSE2_CMD55&#45;&gt;SEND_ACMD6</title>
<path fill="none" stroke="black" d="M208,-1875.14C208,-1863.2 208,-1848.78 208,-1834.55"/>
<polygon fill="black" stroke="black" points="211.5,-1834.74 208,-1824.74 204.5,-1834.74 211.5,-1834.74"/>
<text text-anchor="middle" x="275.13" y="-1844.12" font-family="Times,serif" font-size="14.00">read_command.received</text>
</g>
<!-- WAIT_ACMD6 -->
<g id="node36" class="node">
<title>WAIT_ACMD6</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1652.28" rx="74.42" ry="28.99"/>
<text text-anchor="middle" x="208" y="-1655.48" font-family="Times,serif" font-size="14.00">WAIT_ACMD6</text>
<text text-anchor="middle" x="208" y="-1638.98" font-family="Times,serif" font-size="14.00">start=0</text>
</g>
<!-- SEND_ACMD6&#45;&gt;WAIT_ACMD6 -->
<g id="edge54" class="edge">
<title>SEND_ACMD6&#45;&gt;WAIT_ACMD6</title>
<path fill="none" stroke="black" d="M208,-1717.9C208,-1709.51 208,-1700.93 208,-1692.88"/>
<polygon fill="black" stroke="black" points="211.5,-1693.06 208,-1683.06 204.5,-1693.06 211.5,-1693.06"/>
</g>
<!-- WAIT_ACMD6&#45;&gt;WAIT_ACMD6 -->
<g id="edge55" class="edge">
<title>WAIT_ACMD6&#45;&gt;WAIT_ACMD6</title>
<path fill="none" stroke="black" d="M279.69,-1660.59C291.94,-1659.46 300.42,-1656.69 300.42,-1652.28 300.42,-1649.39 296.77,-1647.2 290.8,-1645.72"/>
<polygon fill="black" stroke="black" points="291.61,-1642.3 281.19,-1644.2 290.52,-1649.22 291.61,-1642.3"/>
<text text-anchor="middle" x="362.67" y="-1647.23" font-family="Times,serif" font-size="14.00">!send_command.ready</text>
</g>
<!-- LISTEN_RESPONSE_ACMD6 -->
<g id="node37" class="node">
<title>LISTEN_RESPONSE_ACMD6</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1530.13" rx="135.41" ry="40.66"/>
<text text-anchor="middle" x="208" y="-1541.58" font-family="Times,serif" font-size="14.00">LISTEN_RESPONSE_ACMD6</text>
<text text-anchor="middle" x="208" y="-1525.08" font-family="Times,serif" font-size="14.00">response_type=1</text>
<text text-anchor="middle" x="208" y="-1508.58" font-family="Times,serif" font-size="14.00">read_command.listen=1</text>
</g>
<!-- WAIT_ACMD6&#45;&gt;LISTEN_RESPONSE_ACMD6 -->
<g id="edge56" class="edge">
<title>WAIT_ACMD6&#45;&gt;LISTEN_RESPONSE_ACMD6</title>
<path fill="none" stroke="black" d="M208,-1622.81C208,-1610.77 208,-1596.37 208,-1582.59"/>
<polygon fill="black" stroke="black" points="211.5,-1582.73 208,-1572.73 204.5,-1582.73 211.5,-1582.73"/>
<text text-anchor="middle" x="268" y="-1591.99" font-family="Times,serif" font-size="14.00">send_command.ready</text>
</g>
<!-- WAIT_RESPONSE_ACMD6 -->
<g id="node38" class="node">
<title>WAIT_RESPONSE_ACMD6</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1411.81" rx="126.93" ry="40.66"/>
<text text-anchor="middle" x="208" y="-1423.26" font-family="Times,serif" font-size="14.00">WAIT_RESPONSE_ACMD6</text>
<text text-anchor="middle" x="208" y="-1406.76" font-family="Times,serif" font-size="14.00">read_command.listen=0</text>
<text text-anchor="middle" x="208" y="-1390.26" font-family="Times,serif" font-size="14.00">counter=100</text>
</g>
<!-- LISTEN_RESPONSE_ACMD6&#45;&gt;WAIT_RESPONSE_ACMD6 -->
<g id="edge57" class="edge">
<title>LISTEN_RESPONSE_ACMD6&#45;&gt;WAIT_RESPONSE_ACMD6</title>
<path fill="none" stroke="black" d="M208,-1489.1C208,-1481.15 208,-1472.7 208,-1464.42"/>
<polygon fill="black" stroke="black" points="211.5,-1464.43 208,-1454.43 204.5,-1464.43 211.5,-1464.43"/>
</g>
<!-- WAIT_RESPONSE_ACMD6&#45;&gt;WAIT_RESPONSE_ACMD6 -->
<g id="edge58" class="edge">
<title>WAIT_RESPONSE_ACMD6&#45;&gt;WAIT_RESPONSE_ACMD6</title>
<path fill="none" stroke="black" d="M332.21,-1420.93C344.85,-1419.13 352.93,-1416.09 352.93,-1411.81 352.93,-1409.01 349.45,-1406.74 343.48,-1404.99"/>
<polygon fill="black" stroke="black" points="344.19,-1401.57 333.69,-1403 342.79,-1408.42 344.19,-1401.57"/>
<text text-anchor="middle" x="422.3" y="-1406.76" font-family="Times,serif" font-size="14.00">!read_command.received</text>
</g>
<!-- READY_TO_TRANSMIT -->
<g id="node39" class="node">
<title>READY_TO_TRANSMIT</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1254.66" rx="115.79" ry="63.99"/>
<text text-anchor="middle" x="208" y="-1282.61" font-family="Times,serif" font-size="14.00">READY_TO_TRANSMIT</text>
<text text-anchor="middle" x="208" y="-1266.11" font-family="Times,serif" font-size="14.00">clk_source=fast</text>
<text text-anchor="middle" x="208" y="-1249.61" font-family="Times,serif" font-size="14.00">address=0</text>
<text text-anchor="middle" x="208" y="-1233.11" font-family="Times,serif" font-size="14.00">buffer_half=0</text>
<text text-anchor="middle" x="208" y="-1216.61" font-family="Times,serif" font-size="14.00">counter=100</text>
</g>
<!-- WAIT_RESPONSE_ACMD6&#45;&gt;READY_TO_TRANSMIT -->
<g id="edge59" class="edge">
<title>WAIT_RESPONSE_ACMD6&#45;&gt;READY_TO_TRANSMIT</title>
<path fill="none" stroke="black" d="M208,-1370.86C208,-1358.39 208,-1344.21 208,-1330.16"/>
<polygon fill="black" stroke="black" points="211.5,-1330.48 208,-1320.48 204.5,-1330.48 211.5,-1330.48"/>
<text text-anchor="middle" x="267.25" y="-1339.86" font-family="Times,serif" font-size="14.00">read_command.ready</text>
</g>
<!-- DELAY_CLOCK_SWITCH -->
<g id="node40" class="node">
<title>DELAY_CLOCK_SWITCH</title>
<ellipse fill="none" stroke="black" cx="208" cy="-1124.68" rx="122.68" ry="28.99"/>
<text text-anchor="middle" x="208" y="-1127.88" font-family="Times,serif" font-size="14.00">DELAY_CLOCK_SWITCH</text>
<text text-anchor="middle" x="208" y="-1111.38" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- READY_TO_TRANSMIT&#45;&gt;DELAY_CLOCK_SWITCH -->
<g id="edge60" class="edge">
<title>READY_TO_TRANSMIT&#45;&gt;DELAY_CLOCK_SWITCH</title>
<path fill="none" stroke="black" d="M208,-1190.42C208,-1181.97 208,-1173.51 208,-1165.61"/>
<polygon fill="black" stroke="black" points="211.5,-1165.66 208,-1155.66 204.5,-1165.66 211.5,-1165.66"/>
</g>
<!-- DELAY_CLOCK_SWITCH&#45;&gt;DELAY_CLOCK_SWITCH -->
<g id="edge62" class="edge">
<title>DELAY_CLOCK_SWITCH&#45;&gt;DELAY_CLOCK_SWITCH</title>
<path fill="none" stroke="black" d="M327.06,-1132.17C340.2,-1130.75 348.68,-1128.25 348.68,-1124.68 348.68,-1122.28 344.85,-1120.36 338.35,-1118.93"/>
<polygon fill="black" stroke="black" points="338.97,-1115.49 328.55,-1117.42 337.9,-1122.41 338.97,-1115.49"/>
<text text-anchor="middle" x="378.68" y="-1119.63" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- TRANSMIT -->
<g id="node41" class="node">
<title>TRANSMIT</title>
<ellipse fill="none" stroke="black" cx="208" cy="-990.86" rx="102" ry="52.33"/>
<text text-anchor="middle" x="208" y="-1010.56" font-family="Times,serif" font-size="14.00">TRANSMIT</text>
<text text-anchor="middle" x="208" y="-994.06" font-family="Times,serif" font-size="14.00">cmd=17</text>
<text text-anchor="middle" x="208" y="-977.56" font-family="Times,serif" font-size="14.00">arg=address</text>
<text text-anchor="middle" x="208" y="-961.06" font-family="Times,serif" font-size="14.00">send_command.start=1</text>
</g>
<!-- DELAY_CLOCK_SWITCH&#45;&gt;TRANSMIT -->
<g id="edge61" class="edge">
<title>DELAY_CLOCK_SWITCH&#45;&gt;TRANSMIT</title>
<path fill="none" stroke="black" d="M208,-1095.4C208,-1083.46 208,-1069.05 208,-1054.81"/>
<polygon fill="black" stroke="black" points="211.5,-1055 208,-1045 204.5,-1055 211.5,-1055"/>
<text text-anchor="middle" x="239.88" y="-1064.39" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- WAIT_TRANSMIT -->
<g id="node42" class="node">
<title>WAIT_TRANSMIT</title>
<ellipse fill="none" stroke="black" cx="102" cy="-860.88" rx="102" ry="40.66"/>
<text text-anchor="middle" x="102" y="-872.33" font-family="Times,serif" font-size="14.00">WAIT_TRANSMIT</text>
<text text-anchor="middle" x="102" y="-855.83" font-family="Times,serif" font-size="14.00">send_command.start=0</text>
<text text-anchor="middle" x="102" y="-839.33" font-family="Times,serif" font-size="14.00">counter=4114</text>
</g>
<!-- TRANSMIT&#45;&gt;WAIT_TRANSMIT -->
<g id="edge63" class="edge">
<title>TRANSMIT&#45;&gt;WAIT_TRANSMIT</title>
<path fill="none" stroke="black" d="M168.53,-942.2C159.43,-931.21 149.75,-919.53 140.68,-908.58"/>
<polygon fill="black" stroke="black" points="143.6,-906.62 134.53,-901.15 138.21,-911.08 143.6,-906.62"/>
</g>
<!-- WAIT_TRANSMIT&#45;&gt;WAIT_TRANSMIT -->
<g id="edge64" class="edge">
<title>WAIT_TRANSMIT&#45;&gt;WAIT_TRANSMIT</title>
<path fill="none" stroke="black" d="M201.32,-870.54C213.79,-868.83 222,-865.61 222,-860.88 222,-857.77 218.47,-855.31 212.51,-853.51"/>
<polygon fill="black" stroke="black" points="213.3,-850.1 202.8,-851.52 211.9,-856.96 213.3,-850.1"/>
<text text-anchor="middle" x="254.25" y="-855.83" font-family="Times,serif" font-size="14.00">sd_data==1</text>
</g>
<!-- WAIT_END -->
<g id="node43" class="node">
<title>WAIT_END</title>
<ellipse fill="none" stroke="black" cx="102" cy="-738.73" rx="60.1" ry="28.99"/>
<text text-anchor="middle" x="102" y="-741.93" font-family="Times,serif" font-size="14.00">WAIT_END</text>
<text text-anchor="middle" x="102" y="-725.43" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- WAIT_TRANSMIT&#45;&gt;WAIT_END -->
<g id="edge65" class="edge">
<title>WAIT_TRANSMIT&#45;&gt;WAIT_END</title>
<path fill="none" stroke="black" d="M102,-819.87C102,-806.91 102,-792.54 102,-779.59"/>
<polygon fill="black" stroke="black" points="105.5,-779.68 102,-769.68 98.5,-779.68 105.5,-779.68"/>
<text text-anchor="middle" x="134.25" y="-788.92" font-family="Times,serif" font-size="14.00">sd_data==0</text>
</g>
<!-- WAIT_END&#45;&gt;WAIT_END -->
<g id="edge66" class="edge">
<title>WAIT_END&#45;&gt;WAIT_END</title>
<path fill="none" stroke="black" d="M158.87,-748.78C171.18,-747.79 180.1,-744.44 180.1,-738.73 180.1,-734.97 176.26,-732.24 170.14,-730.53"/>
<polygon fill="black" stroke="black" points="170.8,-727.09 160.36,-728.92 169.66,-734 170.8,-727.09"/>
<text text-anchor="middle" x="210.1" y="-733.68" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- FINISH_TRANSMIT -->
<g id="node44" class="node">
<title>FINISH_TRANSMIT</title>
<ellipse fill="none" stroke="black" cx="102" cy="-628.24" rx="96.17" ry="28.99"/>
<text text-anchor="middle" x="102" y="-631.44" font-family="Times,serif" font-size="14.00">FINISH_TRANSMIT</text>
<text text-anchor="middle" x="102" y="-614.94" font-family="Times,serif" font-size="14.00">address++</text>
</g>
<!-- WAIT_END&#45;&gt;FINISH_TRANSMIT -->
<g id="edge67" class="edge">
<title>WAIT_END&#45;&gt;FINISH_TRANSMIT</title>
<path fill="none" stroke="black" d="M102,-709.51C102,-697.17 102,-682.49 102,-669.07"/>
<polygon fill="black" stroke="black" points="105.5,-669.21 102,-659.21 98.5,-669.21 105.5,-669.21"/>
<text text-anchor="middle" x="133.88" y="-678.43" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- TRANSMIT2 -->
<g id="node45" class="node">
<title>TRANSMIT2</title>
<ellipse fill="none" stroke="black" cx="102" cy="-509.93" rx="102" ry="52.33"/>
<text text-anchor="middle" x="102" y="-529.63" font-family="Times,serif" font-size="14.00">TRANSMIT2</text>
<text text-anchor="middle" x="102" y="-513.13" font-family="Times,serif" font-size="14.00">cmd=17</text>
<text text-anchor="middle" x="102" y="-496.63" font-family="Times,serif" font-size="14.00">arg=address</text>
<text text-anchor="middle" x="102" y="-480.13" font-family="Times,serif" font-size="14.00">send_command.start=1</text>
</g>
<!-- FINISH_TRANSMIT&#45;&gt;TRANSMIT2 -->
<g id="edge68" class="edge">
<title>FINISH_TRANSMIT&#45;&gt;TRANSMIT2</title>
<path fill="none" stroke="black" d="M102,-598.79C102,-591.21 102,-582.72 102,-574.07"/>
<polygon fill="black" stroke="black" points="105.5,-574.21 102,-564.21 98.5,-574.21 105.5,-574.21"/>
</g>
<!-- WAIT_TRANSMIT2 -->
<g id="node46" class="node">
<title>WAIT_TRANSMIT2</title>
<ellipse fill="none" stroke="black" cx="102" cy="-379.94" rx="102" ry="40.66"/>
<text text-anchor="middle" x="102" y="-391.39" font-family="Times,serif" font-size="14.00">WAIT_TRANSMIT2</text>
<text text-anchor="middle" x="102" y="-374.89" font-family="Times,serif" font-size="14.00">send_command.start=0</text>
<text text-anchor="middle" x="102" y="-358.39" font-family="Times,serif" font-size="14.00">counter=4114</text>
</g>
<!-- TRANSMIT2&#45;&gt;WAIT_TRANSMIT2 -->
<g id="edge69" class="edge">
<title>TRANSMIT2&#45;&gt;WAIT_TRANSMIT2</title>
<path fill="none" stroke="black" d="M102,-457.24C102,-449.03 102,-440.55 102,-432.35"/>
<polygon fill="black" stroke="black" points="105.5,-432.52 102,-422.52 98.5,-432.52 105.5,-432.52"/>
</g>
<!-- WAIT_TRANSMIT2&#45;&gt;WAIT_TRANSMIT2 -->
<g id="edge70" class="edge">
<title>WAIT_TRANSMIT2&#45;&gt;WAIT_TRANSMIT2</title>
<path fill="none" stroke="black" d="M201.32,-389.6C213.79,-387.9 222,-384.68 222,-379.94 222,-376.83 218.47,-374.38 212.51,-372.58"/>
<polygon fill="black" stroke="black" points="213.3,-369.16 202.8,-370.59 211.9,-376.02 213.3,-369.16"/>
<text text-anchor="middle" x="254.25" y="-374.89" font-family="Times,serif" font-size="14.00">sd_data==1</text>
</g>
<!-- WAIT_END2 -->
<g id="node47" class="node">
<title>WAIT_END2</title>
<ellipse fill="none" stroke="black" cx="111" cy="-257.79" rx="64.88" ry="28.99"/>
<text text-anchor="middle" x="111" y="-260.99" font-family="Times,serif" font-size="14.00">WAIT_END2</text>
<text text-anchor="middle" x="111" y="-244.49" font-family="Times,serif" font-size="14.00">counter&#45;&#45;</text>
</g>
<!-- WAIT_TRANSMIT2&#45;&gt;WAIT_END2 -->
<g id="edge71" class="edge">
<title>WAIT_TRANSMIT2&#45;&gt;WAIT_END2</title>
<path fill="none" stroke="black" d="M105,-338.93C105.97,-325.97 107.04,-311.6 108.01,-298.65"/>
<polygon fill="black" stroke="black" points="111.5,-298.98 108.76,-288.75 104.52,-298.46 111.5,-298.98"/>
<text text-anchor="middle" x="139.56" y="-307.98" font-family="Times,serif" font-size="14.00">sd_data==0</text>
</g>
<!-- WAIT_END2&#45;&gt;WAIT_END2 -->
<g id="edge72" class="edge">
<title>WAIT_END2&#45;&gt;WAIT_END2</title>
<path fill="none" stroke="black" d="M172.44,-267.75C184.93,-266.67 193.88,-263.35 193.88,-257.79 193.88,-254.06 189.84,-251.33 183.4,-249.62"/>
<polygon fill="black" stroke="black" points="184.37,-246.23 173.94,-248.07 183.24,-253.14 184.37,-246.23"/>
<text text-anchor="middle" x="223.88" y="-252.74" font-family="Times,serif" font-size="14.00">counter!=0</text>
</g>
<!-- FINISH_TRANSMIT2 -->
<g id="node48" class="node">
<title>FINISH_TRANSMIT2</title>
<ellipse fill="none" stroke="black" cx="150" cy="-135.64" rx="132.76" ry="40.66"/>
<text text-anchor="middle" x="150" y="-147.09" font-family="Times,serif" font-size="14.00">FINISH_TRANSMIT2</text>
<text text-anchor="middle" x="150" y="-130.59" font-family="Times,serif" font-size="14.00">address++</text>
<text text-anchor="middle" x="150" y="-114.09" font-family="Times,serif" font-size="14.00">sd_buffer_half=!sd_buffer_half</text>
</g>
<!-- WAIT_END2&#45;&gt;FINISH_TRANSMIT2 -->
<g id="edge73" class="edge">
<title>WAIT_END2&#45;&gt;FINISH_TRANSMIT2</title>
<path fill="none" stroke="black" d="M120.14,-228.62C124.16,-216.24 129.01,-201.31 133.62,-187.12"/>
<polygon fill="black" stroke="black" points="136.85,-188.49 136.61,-177.9 130.19,-186.33 136.85,-188.49"/>
<text text-anchor="middle" x="162.38" y="-197.5" font-family="Times,serif" font-size="14.00">counter==0</text>
</g>
<!-- WAIT_FOR_BUFFER -->
<g id="node49" class="node">
<title>WAIT_FOR_BUFFER</title>
<ellipse fill="none" stroke="black" cx="309" cy="-28.99" rx="99.88" ry="28.99"/>
<text text-anchor="middle" x="309" y="-32.19" font-family="Times,serif" font-size="14.00">WAIT_FOR_BUFFER</text>
<text text-anchor="middle" x="309" y="-15.69" font-family="Times,serif" font-size="14.00">ready=1</text>
</g>
<!-- FINISH_TRANSMIT2&#45;&gt;WAIT_FOR_BUFFER -->
<g id="edge74" class="edge">
<title>FINISH_TRANSMIT2&#45;&gt;WAIT_FOR_BUFFER</title>
<path fill="none" stroke="black" d="M205.16,-98.33C223.02,-86.58 242.7,-73.63 260.07,-62.19"/>
<polygon fill="black" stroke="black" points="261.77,-65.27 268.2,-56.85 257.92,-59.42 261.77,-65.27"/>
</g>
<!-- WAIT_FOR_BUFFER&#45;&gt;TRANSMIT -->
<g id="edge76" class="edge">
<title>WAIT_FOR_BUFFER&#45;&gt;TRANSMIT</title>
<path fill="none" stroke="black" d="M311.51,-58.39C313.15,-79.43 315,-108.8 315,-134.64 315,-861.88 315,-861.88 315,-861.88 315,-892.18 297.13,-919.09 275.99,-940.32"/>
<polygon fill="black" stroke="black" points="273.67,-937.7 268.85,-947.13 278.5,-942.76 273.67,-937.7"/>
<text text-anchor="middle" x="431.63" y="-504.88" font-family="Times,serif" font-size="14.00">sd_buffer_half!=audio_buffer.address_half</text>
</g>
<!-- WAIT_FOR_BUFFER&#45;&gt;WAIT_FOR_BUFFER -->
<g id="edge75" class="edge">
<title>WAIT_FOR_BUFFER&#45;&gt;WAIT_FOR_BUFFER</title>
<path fill="none" stroke="black" d="M405.66,-36.84C418.42,-35.5 426.88,-32.89 426.88,-28.99 426.88,-26.37 423.06,-24.33 416.68,-22.87"/>
<polygon fill="black" stroke="black" points="417.58,-19.47 407.16,-21.37 416.49,-26.38 417.58,-19.47"/>
<text text-anchor="middle" x="545.38" y="-23.94" font-family="Times,serif" font-size="14.00">sd_buffer_half==audio_buffer.address_half</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 56 KiB

+23
View File
@@ -0,0 +1,23 @@
digraph send_command {
READY [shape="doublecircle",label="READY\ncounter=48\nready"]
node [shape="ellipse"]
SEND_CRC [label="SEND_CRC\n!ready\ncrc_start=1\nto_send={2'b01,command,arguments,8'b1}"]
DELAY [label="DELAY\ncrc_start=0"]
WAIT_CRC [label="WAIT_CRC\nto_send[7:1]=crc"]
SEND_DATA [label="SEND_DATA\ncounter--\nsend_sd_cmd=to_send[counter-1]"]
READY -> READY [label="!start"]
READY -> SEND_CRC [label="start"]
SEND_CRC -> DELAY;
DELAY -> WAIT_CRC;
WAIT_CRC -> WAIT_CRC [label="!crc_ready"]
WAIT_CRC -> SEND_DATA [label="crc_ready"]
SEND_DATA -> SEND_DATA [label="counter!=1"]
SEND_DATA -> READY [label="counter==0"]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

+1 -1
View File
@@ -2,6 +2,6 @@
`define SDVD_DEFS `define SDVD_DEFS
package sdvd_defs; package sdvd_defs;
// Playback speed type // Playback speed type
typedef logic [3:0] SPEED; typedef logic [4:0] SPEED;
endpackage endpackage
`endif `endif
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
+30 -37
View File
@@ -10,29 +10,22 @@ module audio_buffer_tb;
logic play, stop; logic play, stop;
SPEED speed; SPEED speed;
// Whether the current address being read from is in the upper or lower
// half of the 2KiB buffer
logic address_half;
// Whether the audio buffer is currently playing // Whether the audio buffer is currently playing
logic playing; logic playing;
// A 16-bit audio sample to output // A 16-bit audio sample to output
logic [15:0] sample; logic [15:0] sample;
// Inputs for the memory buffer
logic [10:0] addra;
logic [7:0] dina;
logic clka, ena;
logic [9:0] counter; logic [9:0] counter;
logic [15:0] test_memory [1023:0]; logic [15:0] test_memory [1023:0];
audio_buffer dut(.*);
audio_buffer_interface buffer();
audio_buffer dut(.driver(buffer),.*);
// The writer's clock should be much faster than the 48khz buffer clock // The writer's clock should be much faster than the 48khz buffer clock
initial clka = 0; initial buffer.clka = 0;
always #5 clka = ~clka; always #5 buffer.clka = ~buffer.clka;
// An order of magnitude difference is fine // An order of magnitude difference is fine
@@ -83,38 +76,38 @@ module audio_buffer_tb;
end end
// Writer // Writer
begin begin
ena = 1; buffer.ena = 1;
for (int i = 0; i<= 1024; i++) begin for (int i = 0; i<= 1024; i++) begin
addra = i*2; buffer.addra = i*2;
dina = i[7:0]; buffer.dina = i[7:0];
@(posedge clka) @(posedge buffer.clka)
addra = i*2+1; buffer.addra = i*2+1;
dina = i[15:8]; buffer.dina = i[15:8];
@(posedge clka); @(posedge buffer.clka);
end end
wait (address_half==1); wait (buffer.address_half==1);
// random test, write to lower half of memory // random test, write to lower half of memory
for (int i = 0; i< 512; i++) begin for (int i = 0; i< 512; i++) begin
addra = i*2; buffer.addra = i*2;
dina = $urandom; buffer.dina = $urandom;
test_memory[i][7:0] = dina; test_memory[i][7:0] = buffer.dina;
@(posedge clka) @(posedge buffer.clka)
addra = i*2+1; buffer.addra = i*2+1;
dina = $urandom; buffer.dina = $urandom;
test_memory[i][15:8] = dina; test_memory[i][15:8] = buffer.dina;
@(posedge clka); @(posedge buffer.clka);
end end
wait (address_half==0); wait (buffer.address_half==0);
// random test, write to upper half of memory // random test, write to upper half of memory
for (int i = 512; i< 1024; i++) begin for (int i = 512; i< 1024; i++) begin
addra = i*2; buffer.addra = i*2;
dina = $urandom; buffer.dina = $urandom;
test_memory[i][7:0] = dina; test_memory[i][7:0] = buffer.dina;
@(posedge clka) @(posedge buffer.clka)
addra = i*2+1; buffer.addra = i*2+1;
dina = $urandom; buffer.dina = $urandom;
test_memory[i][15:8] = dina; test_memory[i][15:8] = buffer.dina;
@(posedge clka); @(posedge buffer.clka);
end end
end end
join join
+1 -1
View File
@@ -12,7 +12,7 @@ module pwm_tb;
wire pwm_pin; wire pwm_pin;
logic [15:0] sample; logic [15:0] sample;
pwm dut (.*); pwm #(16) dut (.*);
initial forever #10 clk = ~clk; initial forever #10 clk = ~clk;
+3
View File
@@ -60,6 +60,9 @@ initial begin
errors++; errors++;
end end
@(posedge clk);
@(posedge clk);
$display("Generating random input to test assertions"); $display("Generating random input to test assertions");
for (int i=0; i<TESTCYCLES; i++) begin for (int i=0; i<TESTCYCLES; i++) begin
source = $urandom; source = $urandom;
+15 -11
View File
@@ -16,7 +16,7 @@ module read_data_tb;
// A 16-bit audio sample to output // A 16-bit audio sample to output
logic [15:0] sample; logic [15:0] sample;
logic sd_data; logic [3:0] sd_data;
audio_buffer_interface bufferInterface(); audio_buffer_interface bufferInterface();
@@ -104,37 +104,41 @@ module read_data_tb;
end end
task automatic write_random_sd(int start); task automatic write_random_sd(int start);
@(posedge sd_clk); @(posedge sd_clk);
sd_data = 1; sd_data = '1;
// send start bit // send start bit
@(posedge sd_clk); @(posedge sd_clk);
// send 256 data bits // send 256 data bits
sd_data = 0; sd_data = 0;
for (int i = 0; i < 256; i++) begin for (int i = 0; i < 256; i++) begin
write_byte(test_memory[start+i][7:0]); write_byte(test_memory[start-i-1][7:0]);
write_byte(test_memory[start+i][15:8]); write_byte(test_memory[start-i-1][15:8]);
end end
// Simulate randomized crc bits and stop bit // Simulate randomized crc bits and stop bit
repeat (16) @(posedge sd_clk) sd_data=$urandom; repeat (16*4) @(posedge sd_clk) sd_data=$urandom;
@(posedge sd_clk) sd_data=1; @(posedge sd_clk) sd_data='1;
endtask endtask
task automatic write_linear_sd(int start); task automatic write_linear_sd(int start);
@(posedge sd_clk); @(posedge sd_clk);
sd_data = 1; sd_data = '1;
// send start bit // send start bit
@(posedge sd_clk); @(posedge sd_clk);
// send 256 data bits // send 256 data bits
sd_data = 0; sd_data = 0;
start += 256;
for (int i = 0; i < 256; i++) begin for (int i = 0; i < 256; i++) begin
// NOTE: These are in the wrong order??
// One of the weird cases where simulation is different
// than hardware
write_byte(start[7:0]); write_byte(start[7:0]);
write_byte(start[15:8]); write_byte(start[15:8]);
start = start+1; start = start-1;
end end
// Simulate crc bits and stop bit // Simulate crc bits and stop bit
repeat (17) @(posedge sd_clk) sd_data=1; repeat (16*4+1) @(posedge sd_clk) sd_data='1;
endtask endtask
task automatic write_byte(logic [7:0] b); task automatic write_byte(logic [7:0] b);
for (int i=0; i<8; i++) @(posedge sd_clk) sd_data=b[7:4];
@(posedge sd_clk) sd_data=b[7-i]; @(posedge sd_clk) sd_data=b[3:0];
endtask endtask
endmodule endmodule
+3
View File
@@ -40,6 +40,7 @@ initial begin
counter = 48; counter = 48;
@(posedge clk); @(posedge clk);
start = 0;
// Try receiving the CMD8 // Try receiving the CMD8
while (counter != 0) begin while (counter != 0) begin
@@ -54,9 +55,11 @@ initial begin
assert (fill_me === {2'b01, 6'd8, 32'h1AA, 8'h87}) assert (fill_me === {2'b01, 6'd8, 32'h1AA, 8'h87})
else $error("Received wrong command, got 0x%x",fill_me); else $error("Received wrong command, got 0x%x",fill_me);
repeat (1) @(posedge clk);
assert (ready) assert (ready)
else $error("SD command sender not ready"); else $error("SD command sender not ready");
repeat (10) @(posedge clk);
$finish; $finish;
end end
@@ -16,7 +16,7 @@ wire [6:0] display_ones;
logic [6:0] expected_tens; logic [6:0] expected_tens;
logic [6:0] expected_ones; logic [6:0] expected_ones;
seconds_display Dut(.*); sixty_display Dut(.number(seconds),.*);
initial begin initial begin
$display("Testing seconds_display"); $display("Testing seconds_display");
for (seconds=0; seconds<60; seconds++) begin for (seconds=0; seconds<60; seconds++) begin