<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dooba.net &#187; Embedded</title>
	<atom:link href="http://dooba.net/category/embedded/feed/" rel="self" type="application/rss+xml" />
	<link>http://dooba.net</link>
	<description>Tech, Science, Insanity</description>
	<lastBuildDate>Tue, 06 Mar 2012 05:30:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>VHDL inferred gating</title>
		<link>http://dooba.net/2010/02/03/vhdl-inferred-gating/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vhdl-inferred-gating</link>
		<comments>http://dooba.net/2010/02/03/vhdl-inferred-gating/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 06:46:39 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Xilinx]]></category>
		<category><![CDATA[VHDL]]></category>

		<guid isPermaLink="false">http://dooba.net/2010/02/vhdl-inferred-gating/</guid>
		<description><![CDATA[So this was an interesting find. We have been working with a rather large VHDL code base, and noticed a huge amount of control logic was being generated during synthesis. It seems that part of this is due to an interesting &#8220;feature&#8221; of VHDL, or I suppose more exactly of synthesis tools (we saw this [...]]]></description>
			<content:encoded><![CDATA[<p>So this was an interesting find. We have been working with a rather large VHDL code base, and noticed a huge amount of control logic was being generated during synthesis. It seems that part of this is due to an interesting &#8220;feature&#8221; of VHDL, or I suppose more exactly of synthesis tools (we saw this with XST and Synplicity).</p>
<p>If you have some case statement, if then else, or switch, etc. Look carefully at signal assignments in each of the various cases. We were not always assigning to each signal in every case. This obviously follows from different cases doing different things.. but here is the tricky part. Clock gating and/or registering of signals is *inferred* for any signal that is not assigned to in all cases!</p>
<p>This can eat up logic fast, and if you are running near capacity of your target device, it can make it even worse, the added logic, clocking, and routing can cause the implementation to balloon. For example targeting an LX110-T, if we went above ~80% utilization, by the time we got through mapping and place&amp;route we were close to 95%. The only way we could account for this was the extra logic used for the inferred control signals.</p>
<p>This may not matter in a lot of designs where you have plenty of room in the part, or maybe you don&#8217;t for some reason have a lot of case statements. We ended up refactoring and just assigning a signal to itself or some don&#8217;t care value in the other cases.</p>
]]></content:encoded>
			<wfw:commentRss>http://dooba.net/2010/02/03/vhdl-inferred-gating/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple UDP</title>
		<link>http://dooba.net/2009/06/23/simple-udp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simple-udp</link>
		<comments>http://dooba.net/2009/06/23/simple-udp/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 16:00:34 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Xilinx]]></category>
		<category><![CDATA[Ethernet]]></category>
		<category><![CDATA[FPGA]]></category>

		<guid isPermaLink="false">http://dooba.net/?p=152</guid>
		<description><![CDATA[There are many reasons why you might need to send data or messages between devices on your network. Maybe you want to control a remote box, or you have a small linux setup running somewhere remotely and you want to sent and receive data. There are obviously several ways to do this, and one is [...]]]></description>
			<content:encoded><![CDATA[<p>There are many reasons why you might need to send data or messages between devices on your network. Maybe you want to control a remote box, or you have a small linux setup running somewhere remotely and you want to sent and receive data. There are obviously several ways to do this, and one is using sockets and UDP.</p>
<p>This code came about when I needed to talk to an embeded CPU in a Xilinx FPGA. I have ethernet on the card as well, and the CPU is setup to handle it. I wanted to send control commands to the CPU from my Linux workstation to verify some functionality. To do this, I have two pieces of code: (1) a &#8220;server&#8221; that spins on the FPGA and receives the incoming messages, and a &#8220;client&#8221; app that can send a command to the &#8220;server&#8221;. This is a trvial example and the code is basic, but you can see how easy it would be to expand as needed.</p>
<p>The Client:</p>
<pre name="code" class="c">
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>

void die(char* msg) { perror(msg); exit(1); }

int main(int argc, char *argv[]) {
	int sock;
	struct sockaddr_in server;
	unsigned short int serverPort = 9999;

	sock= socket(AF_INET, SOCK_DGRAM, 0);
	if(sock < 0 ) die("failed to create socket");

	server.sin_family = AF_INET;
	server.sin_addr.s_addr = inet_addr("127.0.0.1");
	server.sin_port = serverPort; .

	char msg[] = "Hello World. ";
	printf("We will send the message: \"%s\" to the server. \n", msg);

	if (sendto(socketDescriptor, msg, strlen(msg), 0, (struct sockaddr *) &#038;server, sizeof(server)) < 0) {
                   die("failed to send message");
	}

	return 0;
}
</pre>
<p>And now the Server:</p>
<pre name="code" class="c">
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>

#define BUFFSIZE 255
void Die(char* msg) { perror(msg); exit(1); }

int main(int argc, char* argv[]){
	int sock;
	struct sockaddr_in echoserver;
	struct sockaddr_in echoclient;

	char buffer[BUFFSIZE];
	unsigned int echolen, serverlen, clientlen;
	int rec = 0;

	if(argc != 2){
		fprintf(stderr, "USAGE: %s
<port>\n", argv[0]);
		exit(1);
	}

	/* create UDP socket */
	if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
		Die("failed to create socket");
	}

	memset(&#038;echoserver, 0, sizeof(echoserver));
	echoserver.sin_family = AF_INET;
	echoserver.sin_addr.s_addr = htonl(INADDR_ANY);
	echoserver.sin_port = htons(atoi(argv[1]));

	serverlen = sizeof(echoserver);
	if(bind(sock, (struct sockaddr *) &#038;echoserver, serverlen) < 0) {
		Die("failed to bind.");
	}

	while(1){

		clientlen = sizeof(echoclient);
		if((rec = recvfrom(sock, buffer, BUFFSIZE, 0, (struct sockaddr*)&#038;echoclient, &#038;clientlen)) < 0){
			Die("failed to rec mesg");
		}
		printf("client connected: %s\nData: %s\n\n", inet_ntoa(echoclient.sin_addr),buffer);

	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://dooba.net/2009/06/23/simple-udp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A simple bootloader&#8230;</title>
		<link>http://dooba.net/2009/06/11/a-simple-bootloader/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-simple-bootloader</link>
		<comments>http://dooba.net/2009/06/11/a-simple-bootloader/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 06:21:19 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Xilinx]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://dooba.net/?p=5</guid>
		<description><![CDATA[If you have ever used a Linux distro on an embedded system you know that a bootloader is a necessity. I&#8217;ve been working with PetaLinux for the Xilinx MicroBlaze and we have been using FS-boot to launch U-boot and then bring up Peta. However, recently I switched to BlueCat linux to take advantage of the [...]]]></description>
			<content:encoded><![CDATA[<p>If you have ever used a Linux distro on an embedded system you know that a bootloader is a necessity. I&#8217;ve been working with <a href="http://www.petalogix.com/">PetaLinux</a> for the Xilinx MicroBlaze and we have been using FS-boot to launch U-boot and then bring up Peta. However, recently I switched to BlueCat linux to take advantage of the MicroBlaze&#8217;s MMU. However, <a href="http://www.lynuxworks.com">BlueCat</a> doesn&#8217;t document a clear way to boot from flash. Below is some simple code to boot BlueCat. Note: the concept was taken from a Xilinx app note.</p>
<pre name="code" class="c">#include &lt;xparams.h&gt;
#define KDI_FLASH_LOC 0xXXXXXXXX //location of the linux image in flash
#define KDI_DDR_LOC 0xXXXXXXXX //location in DDR that you want your image to end up
#define KDI_LEN 0xXXXXXXXX //length of your image in bytes

main(){

uint8_t* kdi_flash_ptr = (uint8_t*)KDI_FLASH_LOC;
uint8_t* kdi_ddr_ptr = (uint8_t*)KDI_DDR_LOC;

void* laddr;

memcpy(kdi_flash_ptr, kdi_ddr_ptr, KDI_LEN);

laddr = (void*)KDI_DDR_LOC;
(*laddr)();

}</pre>
<p>You can use XPS to load your KDI file into flash, and then compile the bootloader into your bitstream, load the FPGA, and you are off!</p>
]]></content:encoded>
			<wfw:commentRss>http://dooba.net/2009/06/11/a-simple-bootloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
