{"id":218,"date":"2020-03-28T19:09:28","date_gmt":"2020-03-28T19:09:28","guid":{"rendered":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/?p=218"},"modified":"2020-03-29T15:38:14","modified_gmt":"2020-03-29T15:38:14","slug":"jonathans-status-report-for-saturday-mar-28","status":"publish","type":"post","link":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/2020\/03\/28\/jonathans-status-report-for-saturday-mar-28\/","title":{"rendered":"Jonathan\u2019s Status Report for Saturday, Mar. 28"},"content":{"rendered":"<p>This week I mainly worked on the microphone boards and FPGA drivers.\u00a0 The microphone boards were finished early this week, and ordered on Wednesday.\u00a0 They were fabricated and shipped yesterday, and expected to arrive by next Friday (4\/3).<\/p>\n<p>As mentioned previously, this design uses a small number of large boards with 16 microphones each, connected directly to the FPGA board with ribbon cables.\u00a0 This should significantly reduce the amount of work required to fabricate the boards and assemble the final device, though at the expense of some configurability, if we have to change some parameter of the array later.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-219\" src=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/Board_2D-300x298.png\" alt=\"\" width=\"300\" height=\"298\" srcset=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/Board_2D-300x298.png 300w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/Board_2D-150x150.png 150w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/Board_2D-100x100.png 100w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/Board_2D.png 553w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-220\" src=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/board_3d-300x295.png\" alt=\"\" width=\"300\" height=\"295\" srcset=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/board_3d-300x295.png 300w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/board_3d.png 615w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-221\" src=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/sch-300x201.png\" alt=\"\" width=\"300\" height=\"201\" srcset=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/sch-300x201.png 300w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/sch-768x514.png 768w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/sch.png 881w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>As the schematic shows, most of the parts on the board will not be populated, but were included as mitigations to possible issues.\u00a0 The microphone footprints were included in case we need to change microphones, and there are several different options for improving clock and data signal integrity (such as differential signaling and termination), if needed.\u00a0 Most parts, particularly the regulator, are relatively generic, and so can be acquired from multiple vendors, in case there is a problem with our digikey order (which was also placed this week).<\/p>\n<p>While working on the FPGA ethernet driver, one problem that came up was with the UDP checksum.\u00a0 Unlike the ethernet frame CRC, which is in the footer of the packet, the UDP checksum is held in the packet header:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-225\" src=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/ethernet_udp-300x240.png\" alt=\"\" width=\"300\" height=\"240\" srcset=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/ethernet_udp-300x240.png 300w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/ethernet_udp.png 697w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>This means that the header depends on all of the data to be sent, which, means that the entire packet must be held in memory, then the checksum computed, then either the checksum modified in memory before transmission, or, during transmission the &#8220;source&#8221; of data has to be changed from memory to the register holding the checksum.\u00a0 I didn&#8217;t particularly like either of these solutions, and so, came up with another.\u00a0 I made the checksum an arbitrary constant, and added two bytes to the end of the UDP payload.\u00a0 Those two bytes, which I termed the &#8220;cross&#8221;, are computed based on all of the data, and the header, so that the checksum works out to that constant.\u00a0 The equation below isn&#8217;t exactly right, but gives the basic idea:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-226\" src=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/cross-300x107.png\" alt=\"\" width=\"300\" height=\"107\" srcset=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/cross-300x107.png 300w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/cross-768x275.png 768w, http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-content\/uploads\/sites\/92\/2020\/03\/cross.png 863w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>In this way, the packet can be sent out without knowing it&#8217;s entire contents ahead of time.\u00a0 In fact, if configured to do so, could actually take in new microphone data in the middle of the transmission of a packet, and include that in the packet.\u00a0 This greatly simplifies the rest of the ethernet interface controller, at the expense of a small amount of data overhead in every packet.\u00a0 Given the size of the packets though, this tradeoff is easily worth it.<\/p>\n<p>This coming week, I mainly plan to work on getting the information flow, all the way from the FPGA PDM inputs to a logfile on a computer working.\u00a0 This was expected to be completed earlier, but the complexity of ethernet frames ended up being significantly greater than expected, and took several long days to get working.\u00a0 At this point all the components of the flow are working to some degree, but do not work together yet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This week I mainly worked on the microphone boards and FPGA drivers.\u00a0 The microphone boards were finished early this week, and ordered on Wednesday.\u00a0 They were fabricated and shipped yesterday, and expected to arrive by next Friday (4\/3). As mentioned previously, this design uses a small number of large boards with 16 microphones each, connected &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/2020\/03\/28\/jonathans-status-report-for-saturday-mar-28\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Jonathan\u2019s Status Report for Saturday, Mar. 28&#8221;<\/span><\/a><\/p>\n","protected":false},"author":279,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5,3],"tags":[6,7],"_links":{"self":[{"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/posts\/218"}],"collection":[{"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/users\/279"}],"replies":[{"embeddable":true,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/comments?post=218"}],"version-history":[{"count":4,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/posts\/218\/revisions"}],"predecessor-version":[{"id":227,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/posts\/218\/revisions\/227"}],"wp:attachment":[{"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/media?parent=218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/categories?post=218"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/course.ece.cmu.edu\/~ece500\/projects\/s20-teame0\/wp-json\/wp\/v2\/tags?post=218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}