<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SergeMoutou</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SergeMoutou"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/SergeMoutou"/>
		<updated>2026-05-11T22:34:05Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15839</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15839"/>
				<updated>2022-01-18T17:53:20Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Et un exemple pour essayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation de la bibliothèque=&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
=Et un exemple pour essayer=&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblée sur le bit 7 du PORTC. Ainsi l'envoi de la commande C7=0 vous éteindra cette LED 13 tandis que C7=1 l'allumera....&lt;br /&gt;
&lt;br /&gt;
=Voir aussi=&lt;br /&gt;
* [https://github.com/Palatis/Arduino-Lufa Bibliothèque LUFA pour Arduino]&lt;br /&gt;
* [http://medesign.seas.upenn.edu/index.php/Guides/MaEvArM-usb MEAM.Design : ATmega32u4 : USB Communications]&lt;br /&gt;
* [https://github.com/juanjold/hockbot Github associé au lien ci-dessus]&lt;br /&gt;
* [https://en.wikibooks.org/wiki/Serial_Programming/USB Wikibook en anglais]&lt;br /&gt;
* [https://www.beyondlogic.org/usbnutshell/usb1.shtml USB in a Nutshell Chapter 1]&lt;br /&gt;
* [https://www.usbmadesimple.co.uk/ums_1.htm USB maide simple Part 1]&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_miniqv2&amp;diff=15783</id>
		<title>Cours:TPS 2103 tp miniqv2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_miniqv2&amp;diff=15783"/>
				<updated>2021-11-26T16:14:12Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* {{Vert|Comment calibrer correctement les capteurs pour trouver les seuils}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_miniqv2_corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|'''!!&amp;lt;big&amp;gt;!!!!!!!!!&amp;lt;/big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}}&lt;br /&gt;
 {{Rouge|'''!!&amp;lt;big&amp;gt;Attention&amp;lt;/big&amp;gt;''' à bien poser le robot au sol lors de tout déplacement !!}}&lt;br /&gt;
 {{Rouge|'''!!&amp;lt;big&amp;gt;!!!!!!!!!&amp;lt;/big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}}&lt;br /&gt;
&lt;br /&gt;
Le µcontrôleur utilisé sur le robot miniQ v2 est un atmega32u4, avec une source d'horloge externe (Quartz) à 16MHz.&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Débogage}}=&lt;br /&gt;
&lt;br /&gt;
Il est intéressant lors de la conception d'un programme d'avoir des informations sur le déroulement de celui-ci.&lt;br /&gt;
&lt;br /&gt;
Une méthode simple est de disposer d'une liaison série, cependant :&lt;br /&gt;
*la seule liaison est en USB, ce qui en complique l'utilisation&lt;br /&gt;
*un fil sur un robot est peu pratique !&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons donc une information visuelle grâce à la led RGB. Vous utiliserez [https://github.com/cpldcpu/light_ws2812 cette librairie disponible sur github] dont les fichiers sont donnés ci-dessous :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : ws2812_config.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * light_ws2812_config.h&lt;br /&gt;
 *&lt;br /&gt;
 * Created: 18.01.2014 09:58:15&lt;br /&gt;
 *&lt;br /&gt;
 * User Configuration file for the light_ws2812_lib&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef WS2812_CONFIG_H_&lt;br /&gt;
#define WS2812_CONFIG_H_&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Define I/O pin&lt;br /&gt;
///////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
#define ws2812_port B     // Data port&lt;br /&gt;
#define ws2812_pin  6     // Data out pin&lt;br /&gt;
&lt;br /&gt;
#endif /* WS2812_CONFIG_H_ */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : light_ws2812.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * light weight WS2812 lib include&lt;br /&gt;
 *&lt;br /&gt;
 * Version 2.3  - Nev 29th 2015&lt;br /&gt;
 * Author: Tim (cpldcpu@gmail.com)&lt;br /&gt;
 *&lt;br /&gt;
 * Please do not change this file! All configuration is handled in &amp;quot;ws2812_config.h&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * License: GNU GPL v2 (see License.txt)&lt;br /&gt;
 +&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef LIGHT_WS2812_H_&lt;br /&gt;
#define LIGHT_WS2812_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;quot;ws2812_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 *  Structure of the LED array&lt;br /&gt;
 *&lt;br /&gt;
 * cRGB:     RGB  for WS2812S/B/C/D, SK6812, SK6812Mini, SK6812WWA, APA104, APA106&lt;br /&gt;
 * cRGBW:    RGBW for SK6812RGBW&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
struct cRGB  { uint8_t g; uint8_t r; uint8_t b; };&lt;br /&gt;
struct cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;};&lt;br /&gt;
&lt;br /&gt;
/* User Interface&lt;br /&gt;
 *&lt;br /&gt;
 * Input:&lt;br /&gt;
 *         ledarray:           An array of GRB data describing the LED colors&lt;br /&gt;
 *         number_of_leds:     The number of LEDs to write&lt;br /&gt;
 *         pinmask (optional): Bitmask describing the output bin. e.g. _BV(PB0)&lt;br /&gt;
 *&lt;br /&gt;
 * The functions will perform the following actions:&lt;br /&gt;
 *         - Set the data-out pin as output&lt;br /&gt;
 *         - Send out the LED data&lt;br /&gt;
 *         - Wait 50�s to reset the LEDs&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
void ws2812_setleds     (struct cRGB  *ledarray, uint16_t number_of_leds);&lt;br /&gt;
void ws2812_setleds_pin (struct cRGB  *ledarray, uint16_t number_of_leds,uint8_t pinmask);&lt;br /&gt;
void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t number_of_leds);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Old interface / Internal functions&lt;br /&gt;
 *&lt;br /&gt;
 * The functions take a byte-array and send to the data output as WS2812 bitstream.&lt;br /&gt;
 * The length is the number of bytes to send - three per LED.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
void ws2812_sendarray     (uint8_t *array,uint16_t length);&lt;br /&gt;
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Internal defines&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#define CONCAT(a, b)            a ## b&lt;br /&gt;
#define CONCAT_EXP(a, b)   CONCAT(a, b)&lt;br /&gt;
&lt;br /&gt;
#define ws2812_PORTREG  CONCAT_EXP(PORT,ws2812_port)&lt;br /&gt;
#define ws2812_DDRREG   CONCAT_EXP(DDR,ws2812_port)&lt;br /&gt;
&lt;br /&gt;
#endif /* LIGHT_WS2812_H_ */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : light_ws2812.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
* light weight WS2812 lib V2.0b&lt;br /&gt;
*&lt;br /&gt;
* Controls WS2811/WS2812/WS2812B RGB-LEDs&lt;br /&gt;
* Author: Tim (cpldcpu@gmail.com)&lt;br /&gt;
*&lt;br /&gt;
* Jan 18th, 2014  v2.0b Initial Version&lt;br /&gt;
* Nov 29th, 2015  v2.3  Added SK6812RGBW support&lt;br /&gt;
*&lt;br /&gt;
* License: GNU GPL v2 (see License.txt)&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;light_ws2812.h&amp;quot;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setleds for standard RGB&lt;br /&gt;
void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds)&lt;br /&gt;
{&lt;br /&gt;
   ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask)&lt;br /&gt;
{&lt;br /&gt;
  ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask);&lt;br /&gt;
  _delay_us(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Setleds for SK6812RGBW&lt;br /&gt;
void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)&lt;br /&gt;
{&lt;br /&gt;
  ws2812_sendarray_mask((uint8_t*)ledarray,leds&amp;lt;&amp;lt;2,_BV(ws2812_pin));&lt;br /&gt;
  _delay_us(80);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ws2812_sendarray(uint8_t *data,uint16_t datlen)&lt;br /&gt;
{&lt;br /&gt;
  ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  This routine writes an array of bytes with RGB values to the Dataout pin&lt;br /&gt;
  using the fast 800kHz clockless WS2811/2812 protocol.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Timing in ns&lt;br /&gt;
#define w_zeropulse   350&lt;br /&gt;
#define w_onepulse    900&lt;br /&gt;
#define w_totalperiod 1250&lt;br /&gt;
&lt;br /&gt;
// Fixed cycles used by the inner loop&lt;br /&gt;
#define w_fixedlow    2&lt;br /&gt;
#define w_fixedhigh   4&lt;br /&gt;
#define w_fixedtotal  8&lt;br /&gt;
&lt;br /&gt;
// Insert NOPs to match the timing, if possible&lt;br /&gt;
#define w_zerocycles    (((F_CPU/1000)*w_zeropulse          )/1000000)&lt;br /&gt;
#define w_onecycles     (((F_CPU/1000)*w_onepulse    +500000)/1000000)&lt;br /&gt;
#define w_totalcycles   (((F_CPU/1000)*w_totalperiod +500000)/1000000)&lt;br /&gt;
&lt;br /&gt;
// w1 - nops between rising edge and falling edge - low&lt;br /&gt;
#define w1 (w_zerocycles-w_fixedlow)&lt;br /&gt;
// w2   nops between fe low and fe high&lt;br /&gt;
#define w2 (w_onecycles-w_fixedhigh-w1)&lt;br /&gt;
// w3   nops to complete loop&lt;br /&gt;
#define w3 (w_totalcycles-w_fixedtotal-w1-w2)&lt;br /&gt;
&lt;br /&gt;
#if w1&amp;gt;0&lt;br /&gt;
  #define w1_nops w1&lt;br /&gt;
#else&lt;br /&gt;
  #define w1_nops  0&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// The only critical timing parameter is the minimum pulse length of the &amp;quot;0&amp;quot;&lt;br /&gt;
// Warn or throw error if this timing can not be met with current F_CPU settings.&lt;br /&gt;
#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000)&lt;br /&gt;
#if w_lowtime&amp;gt;550&lt;br /&gt;
   #error &amp;quot;Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?&amp;quot;&lt;br /&gt;
#elif w_lowtime&amp;gt;450&lt;br /&gt;
   #warning &amp;quot;Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S).&amp;quot;&lt;br /&gt;
   #warning &amp;quot;Please consider a higher clockspeed, if possible&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if w2&amp;gt;0&lt;br /&gt;
#define w2_nops w2&lt;br /&gt;
#else&lt;br /&gt;
#define w2_nops  0&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if w3&amp;gt;0&lt;br /&gt;
#define w3_nops w3&lt;br /&gt;
#else&lt;br /&gt;
#define w3_nops  0&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define w_nop1  &amp;quot;nop      \n\t&amp;quot;&lt;br /&gt;
#define w_nop2  &amp;quot;rjmp .+0 \n\t&amp;quot;&lt;br /&gt;
#define w_nop4  w_nop2 w_nop2&lt;br /&gt;
#define w_nop8  w_nop4 w_nop4&lt;br /&gt;
#define w_nop16 w_nop8 w_nop8&lt;br /&gt;
&lt;br /&gt;
void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t curbyte,ctr,masklo;&lt;br /&gt;
  uint8_t sreg_prev;&lt;br /&gt;
&lt;br /&gt;
  ws2812_DDRREG |= maskhi; // Enable output&lt;br /&gt;
&lt;br /&gt;
  masklo	=~maskhi&amp;amp;ws2812_PORTREG;&lt;br /&gt;
  maskhi |=        ws2812_PORTREG;&lt;br /&gt;
&lt;br /&gt;
  sreg_prev=SREG;&lt;br /&gt;
  cli();&lt;br /&gt;
&lt;br /&gt;
  while (datlen--) {&lt;br /&gt;
    curbyte=*data++;&lt;br /&gt;
&lt;br /&gt;
    asm volatile(&lt;br /&gt;
    &amp;quot;       ldi   %0,8  \n\t&amp;quot;&lt;br /&gt;
    &amp;quot;loop%=:            \n\t&amp;quot;&lt;br /&gt;
    &amp;quot;       out   %2,%3 \n\t&amp;quot;    //  '1' [01] '0' [01] - re&lt;br /&gt;
#if (w1_nops&amp;amp;1)&lt;br /&gt;
w_nop1&lt;br /&gt;
#endif&lt;br /&gt;
#if (w1_nops&amp;amp;2)&lt;br /&gt;
w_nop2&lt;br /&gt;
#endif&lt;br /&gt;
#if (w1_nops&amp;amp;4)&lt;br /&gt;
w_nop4&lt;br /&gt;
#endif&lt;br /&gt;
#if (w1_nops&amp;amp;8)&lt;br /&gt;
w_nop8&lt;br /&gt;
#endif&lt;br /&gt;
#if (w1_nops&amp;amp;16)&lt;br /&gt;
w_nop16&lt;br /&gt;
#endif&lt;br /&gt;
    &amp;quot;       sbrs  %1,7  \n\t&amp;quot;    //  '1' [03] '0' [02]&lt;br /&gt;
    &amp;quot;       out   %2,%4 \n\t&amp;quot;    //  '1' [--] '0' [03] - fe-low&lt;br /&gt;
    &amp;quot;       lsl   %1    \n\t&amp;quot;    //  '1' [04] '0' [04]&lt;br /&gt;
#if (w2_nops&amp;amp;1)&lt;br /&gt;
  w_nop1&lt;br /&gt;
#endif&lt;br /&gt;
#if (w2_nops&amp;amp;2)&lt;br /&gt;
  w_nop2&lt;br /&gt;
#endif&lt;br /&gt;
#if (w2_nops&amp;amp;4)&lt;br /&gt;
  w_nop4&lt;br /&gt;
#endif&lt;br /&gt;
#if (w2_nops&amp;amp;8)&lt;br /&gt;
  w_nop8&lt;br /&gt;
#endif&lt;br /&gt;
#if (w2_nops&amp;amp;16)&lt;br /&gt;
  w_nop16&lt;br /&gt;
#endif&lt;br /&gt;
    &amp;quot;       out   %2,%4 \n\t&amp;quot;    //  '1' [+1] '0' [+1] - fe-high&lt;br /&gt;
#if (w3_nops&amp;amp;1)&lt;br /&gt;
w_nop1&lt;br /&gt;
#endif&lt;br /&gt;
#if (w3_nops&amp;amp;2)&lt;br /&gt;
w_nop2&lt;br /&gt;
#endif&lt;br /&gt;
#if (w3_nops&amp;amp;4)&lt;br /&gt;
w_nop4&lt;br /&gt;
#endif&lt;br /&gt;
#if (w3_nops&amp;amp;8)&lt;br /&gt;
w_nop8&lt;br /&gt;
#endif&lt;br /&gt;
#if (w3_nops&amp;amp;16)&lt;br /&gt;
w_nop16&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;       dec   %0    \n\t&amp;quot;    //  '1' [+2] '0' [+2]&lt;br /&gt;
    &amp;quot;       brne  loop%=\n\t&amp;quot;    //  '1' [+3] '0' [+4]&lt;br /&gt;
    :	&amp;quot;=&amp;amp;d&amp;quot; (ctr)&lt;br /&gt;
    :	&amp;quot;r&amp;quot; (curbyte), &amp;quot;I&amp;quot; (_SFR_IO_ADDR(ws2812_PORTREG)), &amp;quot;r&amp;quot; (maskhi), &amp;quot;r&amp;quot; (masklo)&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  SREG=sreg_prev;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un exemple d'utilisation est donné ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;light_ws2812.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
struct cRGB led[1];&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	  while(1)&lt;br /&gt;
	  {&lt;br /&gt;
	    led[0].r=10;led[0].g=00;led[0].b=0;&lt;br /&gt;
	    ws2812_setleds(led,1);&lt;br /&gt;
	    _delay_ms(500);&lt;br /&gt;
	    led[0].r=0;led[0].g=00;led[0].b=0;&lt;br /&gt;
	    ws2812_setleds(led,1);&lt;br /&gt;
	    _delay_ms(500);&lt;br /&gt;
	  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Créer les 3 fichiers précédents sur éclipse en respectant rigoureusement le nom des fichiers et en copiant le code ci dessus dans chacun !}}&lt;br /&gt;
&lt;br /&gt;
 Vous devez donc avoir 4 fichiers dans votre projet (les 3 pour la led + le fichier contenant votre &amp;quot;main&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Après avoir vérifié le fonctionnement, écrire différents programmes qui :}}&lt;br /&gt;
*affichent successivement R puis V puis B en boucle&lt;br /&gt;
*affichent un dégradé de rouge&lt;br /&gt;
*affichent un dégradé de bleu&lt;br /&gt;
&lt;br /&gt;
={{Rouge|moteur !}}=&lt;br /&gt;
&lt;br /&gt;
Cette partie ayant été étudiée en TD, on partira du code suivant :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Base de programme}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;light_ws2812.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
struct cRGB led[1];&lt;br /&gt;
&lt;br /&gt;
// prototype des fonctions&lt;br /&gt;
void initMoteur();&lt;br /&gt;
inline void setVitesse (int16_t, int16_t) __attribute__((always_inline));&lt;br /&gt;
inline void setMoteurG (int16_t) __attribute__((always_inline));&lt;br /&gt;
inline void setMoteurD (int16_t) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
#define topPWM 100    // la vitesse des moteurs varie de -topPWM à topPWM&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	initMoteur();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initMoteur()&lt;br /&gt;
{&lt;br /&gt;
	DDRD |= (1&amp;lt;&amp;lt;PD7) | (1&amp;lt;&amp;lt;PD6);&lt;br /&gt;
	DDRE |= 1&amp;lt;&amp;lt;PE6;&lt;br /&gt;
	DDRC |= 1&amp;lt;&amp;lt;PC6;&lt;br /&gt;
	TCCR4B |= (1&amp;lt;&amp;lt;PWM4X)                               // inverse les sortie OCRxA et OCRxA/&lt;br /&gt;
		 |(1&amp;lt;&amp;lt;CS42)|(1&amp;lt;&amp;lt;CS41)|1&amp;lt;&amp;lt;CS40;             // prédiviseur&lt;br /&gt;
	TCCR4A |= (1&amp;lt;&amp;lt;PWM4A) | (1&amp;lt;&amp;lt;COM4A0);                // PWM sur COM4A/&lt;br /&gt;
	TCCR4C |= (1&amp;lt;&amp;lt;PWM4D) | (1&amp;lt;&amp;lt;COM4D0) | (1&amp;lt;&amp;lt;COM4D1);  // PWM sur COM4D&lt;br /&gt;
	TC4H=0;&lt;br /&gt;
	OCR4C=topPWM;                                      // valeur max PWM -&amp;gt; fmli = fq / (topPWM * prediv )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vG, int16_t vD)&lt;br /&gt;
{&lt;br /&gt;
	setMoteurD(vD);&lt;br /&gt;
	setMoteurG(vG);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setMoteurG(int16_t vit)&lt;br /&gt;
{&lt;br /&gt;
	if (vit&amp;lt;0)&lt;br /&gt;
	{&lt;br /&gt;
		vit = -vit;&lt;br /&gt;
		PORTD |= (1&amp;lt;&amp;lt;PD6);&lt;br /&gt;
	}&lt;br /&gt;
	else PORTD &amp;amp;=~ (1&amp;lt;&amp;lt;PD6);&lt;br /&gt;
	if (vit&amp;gt;topPWM) vit=topPWM;&lt;br /&gt;
	OCR4A = vit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setMoteurD(int16_t vit)&lt;br /&gt;
{&lt;br /&gt;
	if (vit&amp;lt;0)&lt;br /&gt;
	{&lt;br /&gt;
		vit = -vit;&lt;br /&gt;
		PORTE |= (1&amp;lt;&amp;lt;PE6);&lt;br /&gt;
	}&lt;br /&gt;
	else PORTE &amp;amp;=~ (1&amp;lt;&amp;lt;PE6);&lt;br /&gt;
	if (vit&amp;gt;topPWM) vit=topPWM;&lt;br /&gt;
	OCR4D = vit;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser ces fonctions pour que la trajectoire du robot soit un cercle}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Comment parcourir le cercle dans le sens inverse ?}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Comment faire varier le rayon du cercle ?}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Les boutons}}=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|light tracking robot}}=&lt;br /&gt;
[[Image:MiniQ_v2_CAN.png|droite|vignette]]&lt;br /&gt;
&lt;br /&gt;
2 capteurs de lumière sont positionnés sur le robot. Ce sont des LDR (résistances variant en fonction de l'intensité lumineuse) qui sont câblés en pont diviseur comme indiqué sur la figure ci-contre.&lt;br /&gt;
&lt;br /&gt;
Les informations nécessaires à la lecture de ce capteur sont :&lt;br /&gt;
*entrée analogique ADC0&lt;br /&gt;
*valeur environ 400 si la lumière est dans l'axe&lt;br /&gt;
*valeur diminue si elle est à gauche du robot ( sens de l'avancement du robot )&lt;br /&gt;
*tension de référence du CAN : AVCC&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez l'un des 2 canevas ci-dessous, l'un utilisant les interruptions, l'autre non :&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| {{Rouge|Avec interruption}} || {{Rouge|Par scrutation}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
void initMoteur();&lt;br /&gt;
inline ...&lt;br /&gt;
 &lt;br /&gt;
int16_t vt = xxxx;&lt;br /&gt;
int16_t wr = 0;&lt;br /&gt;
volatile int16_t n;&lt;br /&gt;
 &lt;br /&gt;
ISR(ADC_vect)&lt;br /&gt;
{&lt;br /&gt;
	n=ADC;&lt;br /&gt;
        ....&lt;br /&gt;
	//relancer une nouvelle conversion&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	initMoteur();&lt;br /&gt;
        // mettre en route CAN&lt;br /&gt;
&lt;br /&gt;
        // configurer CAN&lt;br /&gt;
&lt;br /&gt;
        // autoriser interruption CAN et lancer une conversion&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
void initMoteur();&lt;br /&gt;
inline ...&lt;br /&gt;
 &lt;br /&gt;
int16_t vt = xxxx;&lt;br /&gt;
int16_t wr = 0;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	initMoteur();&lt;br /&gt;
        // mettre en route CAN&lt;br /&gt;
&lt;br /&gt;
        // configurer CAN&lt;br /&gt;
&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
             // lancer une conversion&lt;br /&gt;
&lt;br /&gt;
             // attendre fin de conversion : le bit ADSC reste à 1 jusqu'à la fin de la conversion&lt;br /&gt;
             // donc : ne rien faire tant que le bit est à 1 (utiliser while et bit_is_set)&lt;br /&gt;
&lt;br /&gt;
             // lire la valeur&lt;br /&gt;
	     int16_t n=ADC;&lt;br /&gt;
             ....&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons faire un robot qui suit une source lumineuse. Pour cela, la vitesse des roues (plus exactement la vitesse de rotation du robot) doit dépendre de la valeur renvoyée par l'entrée analogique ADC0.&lt;br /&gt;
&lt;br /&gt;
On aura donc :&lt;br /&gt;
*vt : vitesse de translation (ex 20)&lt;br /&gt;
*wr : vitesse de rotation&lt;br /&gt;
*vitMoteurD = vt + wr&lt;br /&gt;
*vitMoteurG = vt - wr&lt;br /&gt;
* wr = f(ADC0)&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de réaliser ce comportement.}}&lt;br /&gt;
&lt;br /&gt;
{{Aide|Allons y progressivement}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est difficile de réaliser un programme fonctionnel directement.&lt;br /&gt;
&lt;br /&gt;
Il convient donc de procéder par étapes.&lt;br /&gt;
&lt;br /&gt;
Commencez donc par changer la couleur de la led suivant la position de la lumière par rapport au robot, par exemple :&lt;br /&gt;
*bleu à droite&lt;br /&gt;
*rouge à gauche&lt;br /&gt;
{{finAide}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Suivi de ligne}}=&lt;br /&gt;
&lt;br /&gt;
On souhaite maintenant programmer un robot suiveur de ligne, qui sera de couleur noire.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
5 capteurs photoréflectifs sont disposés sur le robot tel que résumé dans le tableau ci-dessous.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || extrême gauche || gauche || centre || droite || extrême droite&lt;br /&gt;
|-&lt;br /&gt;
| broche µc || 36 || 37 || 38 || 39 || 40&lt;br /&gt;
|-&lt;br /&gt;
| entrée CAN || ADC7 || ADC6 || ADC5 || ADC4 || ADC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On peut considérer dans un premier temps que la valeur lue sur le CAN est :&lt;br /&gt;
*inférieure à 300 sur du noir&lt;br /&gt;
*supérieur à 300 pour le blanc&lt;br /&gt;
&lt;br /&gt;
On décomposera la vitesse du robot de la même façon que précédemment :&lt;br /&gt;
*vt : vitesse de translation, constante par ex 30&lt;br /&gt;
*wr : vitesse de rotation, dépendra de la position du robot par rapport à la ligne&lt;br /&gt;
*vitMoteurD = vt + wr&lt;br /&gt;
*vitMoteurG = vt - wr&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Position de la ligne}}==&lt;br /&gt;
&lt;br /&gt;
Le plus important est de trouver la position du robot par rapport à la ligne, que l'on notera pos.&lt;br /&gt;
&lt;br /&gt;
Le principe est d'attribuer un poids à chaque capteur, d'autant plus grand que le capteur est excentré. Le signe donne le côté du capteur :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || extrême gauche || gauche || centre || droite || extrême droite&lt;br /&gt;
|-&lt;br /&gt;
| poids du capteur || 24 || 12 || 0 || -12 || -24&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L'algorithme est le suivant :&lt;br /&gt;
*initialiser pos à 0&lt;br /&gt;
*initialiser nbCaptOnLine à 0&lt;br /&gt;
*pour chaque capteur sur la ligne&lt;br /&gt;
**incrémenter nbCaptOnLine&lt;br /&gt;
**ajouter le poids du capteur à pos : pos &amp;lt;- pos + poids[numeroCapteur]&lt;br /&gt;
*normaliser pos : pos &amp;lt;- pos / nbCaptOnLine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemples''' :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || ex gauche || gauche || centre || droite || ex droite&lt;br /&gt;
|-&lt;br /&gt;
| poids du capteur || 24 || 12 || 0 || -12 || -24&lt;br /&gt;
|-&lt;br /&gt;
| Valeur CAN || 100 || 100 || 10 || 20 || 100&lt;br /&gt;
|-&lt;br /&gt;
| Capteur sur la ligne || N || N || O || O || N&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 pos = (0 + (-12))/2 = -6&lt;br /&gt;
||&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || ex gauche || gauche || centre || droite || ex droite&lt;br /&gt;
|-&lt;br /&gt;
| poids du capteur || 24 || 12 || 0 || -12 || -24&lt;br /&gt;
|-&lt;br /&gt;
| Valeur CAN || 100 || 15 || 10 || 20 || 100&lt;br /&gt;
|-&lt;br /&gt;
| Capteur sur la ligne || N || O || O || O || N&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 pos = (12 + 0 + (-12))/3 = 0&lt;br /&gt;
||&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || ex gauche || gauche || centre || droite || ex droite&lt;br /&gt;
|-&lt;br /&gt;
| poids du capteur || 24 || 12 || 0 || -12 || -24&lt;br /&gt;
|-&lt;br /&gt;
| Valeur CAN || 5 || 150 || 100 || 200 || 100&lt;br /&gt;
|-&lt;br /&gt;
| Capteur sur la ligne || O || N || N || N || N&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 pos = (24)/1 = 24&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vérification des capteurs}}==&lt;br /&gt;
&lt;br /&gt;
La première étape dans la conception du programme va consister à vérifier le {{CAN}}, en utilisant la led.&lt;br /&gt;
&lt;br /&gt;
On testera individuellement chaque capteur :&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si le capteur est au dessus de la ligne}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier ensuite le programme pour boucler sur le 5 capteurs :}}&lt;br /&gt;
*lumière bleue avant de lancer les conversions&lt;br /&gt;
*pour chaque capteur&lt;br /&gt;
**allumer la led en rouge si présence ligne&lt;br /&gt;
**allumer en vert pour indiquer qu'on passe au capteur suivant&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Comment calibrer correctement les capteurs pour trouver les seuils}}===&lt;br /&gt;
Ceci peut être réalisé par un simple programme Arduino qui nous permet de regarder les valeurs des capteurs par la liaison série :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  int data[5];&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  for (i=0;i&amp;lt;5;i++)&lt;br /&gt;
   {&lt;br /&gt;
    data[i]=analogRead(i);//store the value read from the sensors&lt;br /&gt;
    Serial.print(data[i]);Serial.print(&amp;quot; - &amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un essai avec un Robot a donné les résultats suivants.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Position du capteur || extrême gauche || gauche || centre || droite || extrême droite&lt;br /&gt;
|-&lt;br /&gt;
| broche µc || 36 || 37 || 38 || 39 || 40&lt;br /&gt;
|-&lt;br /&gt;
| entrée CAN || ADC7 || ADC6 || ADC5 || ADC4 || ADC1&lt;br /&gt;
|-&lt;br /&gt;
| entrée Arduino || A0 || A1 || A2 || A3 || A4&lt;br /&gt;
|-&lt;br /&gt;
| BLANC ||836 || 982 || 980 || 974 || 970&lt;br /&gt;
|-&lt;br /&gt;
| NOIR || 210 || 390 || 338 || 305 || 305&lt;br /&gt;
|-&lt;br /&gt;
| Seuil || 523 || 686 || 659 || 639 || 637&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Position de la ligne}}==&lt;br /&gt;
&lt;br /&gt;
Il est temps maintenant de calculer la variable {{rouge|pos}} tel qu'indiqué ci-dessus.&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier la couleur de la led suivant la valeur de pos :}}&lt;br /&gt;
*vert si pos = 0&lt;br /&gt;
*rouge si pos&amp;gt;0&lt;br /&gt;
*bleu si pos&amp;lt;0&lt;br /&gt;
*éteindre la led si aucun capteur n'est sur la ligne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Marche}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Il ne reste qu'à modifier la vitesse angulaire du robot (wr) en fonction de la variable pos}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : attention au signe, sinon la correction se fait dans le mauvais sens !&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15782</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15782"/>
				<updated>2021-11-26T15:49:36Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Et un exemple pour essayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation de la bibliothèque=&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
=Et un exemple pour essayer=&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblée sur le bit 7 du PORTC. Ainsi l'envoi de la commande PC7=0 vous éteindra cette LED 13 tandis que PC7=1 l'allumera....&lt;br /&gt;
&lt;br /&gt;
=Voir aussi=&lt;br /&gt;
* [https://github.com/Palatis/Arduino-Lufa Bibliothèque LUFA pour Arduino]&lt;br /&gt;
* [http://medesign.seas.upenn.edu/index.php/Guides/MaEvArM-usb MEAM.Design : ATmega32u4 : USB Communications]&lt;br /&gt;
* [https://github.com/juanjold/hockbot Github associé au lien ci-dessus]&lt;br /&gt;
* [https://en.wikibooks.org/wiki/Serial_Programming/USB Wikibook en anglais]&lt;br /&gt;
* [https://www.beyondlogic.org/usbnutshell/usb1.shtml USB in a Nutshell Chapter 1]&lt;br /&gt;
* [https://www.usbmadesimple.co.uk/ums_1.htm USB maide simple Part 1]&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15781</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15781"/>
				<updated>2021-11-26T15:48:24Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Et un exemple pour essayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation de la bibliothèque=&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
=Et un exemple pour essayer=&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblé sur le bit 7 du PORTC. Ainsi l'envoi de la commande PC7=0 vous éteindra cette LED 13 tandis que PC7=1 l'allumera....&lt;br /&gt;
&lt;br /&gt;
=Voir aussi=&lt;br /&gt;
* [https://github.com/Palatis/Arduino-Lufa Bibliothèque LUFA pour Arduino]&lt;br /&gt;
* [http://medesign.seas.upenn.edu/index.php/Guides/MaEvArM-usb MEAM.Design : ATmega32u4 : USB Communications]&lt;br /&gt;
* [https://github.com/juanjold/hockbot Github associé au lien ci-dessus]&lt;br /&gt;
* [https://en.wikibooks.org/wiki/Serial_Programming/USB Wikibook en anglais]&lt;br /&gt;
* [https://www.beyondlogic.org/usbnutshell/usb1.shtml USB in a Nutshell Chapter 1]&lt;br /&gt;
* [https://www.usbmadesimple.co.uk/ums_1.htm USB maide simple Part 1]&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15780</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15780"/>
				<updated>2021-11-26T15:37:03Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation de la bibliothèque=&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
=Et un exemple pour essayer=&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblé sur le bit 7 du PORTC. Ainsi l'envoi de la commande PC7=0 vous éteindra cette LED 13 tandis que PC7=1 l'allumera....&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15779</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15779"/>
				<updated>2021-11-26T15:33:57Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblé sur le bit 7 du PORTC. Ainsi l'envoi de la commande PC7=0 vous éteindra cette LED 13 tandis que PC7=1 l'allumera....&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15778</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15778"/>
				<updated>2021-11-26T15:32:26Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec ces deux fichiers, vous disposez d'un exemple présenté ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carta Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}&lt;br /&gt;
&lt;br /&gt;
Ce programme réalise un mini terminal série avec comme écran d'accueil :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy USB Serial Example, Simple Pin Control Shell&lt;br /&gt;
&lt;br /&gt;
Example Commands&lt;br /&gt;
  B0?   Read Port B, pin 0&lt;br /&gt;
  C2=0  Write Port C, pin 1 LOW&lt;br /&gt;
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la carte Arduino Leonardo la célèbre LED 13 est câblé sur le bit 7 du PORTC. Ainsi l'envoi de la commande PC7=0 vous éteindra cette LED 13 tandis que PC7=1 l'allumera....&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15721</id>
		<title>Cours:LeonardoSerialUsb</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:LeonardoSerialUsb&amp;diff=15721"/>
				<updated>2021-11-10T10:33:10Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
&lt;br /&gt;
Nous aurons besoin des 2 fichiers suivants :&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.h}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#ifndef usb_serial_h__&lt;br /&gt;
#define usb_serial_h__&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// setup&lt;br /&gt;
void usb_init(void);			// initialize everything&lt;br /&gt;
uint8_t usb_configured(void);		// is the USB port configured&lt;br /&gt;
&lt;br /&gt;
// receiving data&lt;br /&gt;
int16_t usb_serial_getchar(void);	// receive a character (-1 if timeout/error)&lt;br /&gt;
uint8_t usb_serial_available(void);	// number of bytes in receive buffer&lt;br /&gt;
void usb_serial_flush_input(void);	// discard any buffered input&lt;br /&gt;
&lt;br /&gt;
// transmitting data&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c);	// transmit a character&lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c);  // transmit a character, do not wait&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size); // transmit a buffer&lt;br /&gt;
void usb_serial_flush_output(void);	// immediately transmit any buffered output&lt;br /&gt;
&lt;br /&gt;
// serial parameters&lt;br /&gt;
uint32_t usb_serial_get_baud(void);	// get the baud rate&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void);	// get the number of stop bits&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void);// get the parity type&lt;br /&gt;
uint8_t usb_serial_get_numbits(void);	// get the number of data bits&lt;br /&gt;
uint8_t usb_serial_get_control(void);	// get the RTS and DTR signal state&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals); // set DSR, DCD, RI, etc&lt;br /&gt;
&lt;br /&gt;
// constants corresponding to the various serial parameters&lt;br /&gt;
#define USB_SERIAL_DTR			0x01&lt;br /&gt;
#define USB_SERIAL_RTS			0x02&lt;br /&gt;
#define USB_SERIAL_1_STOP		0&lt;br /&gt;
#define USB_SERIAL_1_5_STOP		1&lt;br /&gt;
#define USB_SERIAL_2_STOP		2&lt;br /&gt;
#define USB_SERIAL_PARITY_NONE		0&lt;br /&gt;
#define USB_SERIAL_PARITY_ODD		1&lt;br /&gt;
#define USB_SERIAL_PARITY_EVEN		2&lt;br /&gt;
#define USB_SERIAL_PARITY_MARK		3&lt;br /&gt;
#define USB_SERIAL_PARITY_SPACE		4&lt;br /&gt;
#define USB_SERIAL_DCD			0x01&lt;br /&gt;
#define USB_SERIAL_DSR			0x02&lt;br /&gt;
#define USB_SERIAL_BREAK		0x04&lt;br /&gt;
#define USB_SERIAL_RI			0x08&lt;br /&gt;
#define USB_SERIAL_FRAME_ERR		0x10&lt;br /&gt;
#define USB_SERIAL_PARITY_ERR		0x20&lt;br /&gt;
#define USB_SERIAL_OVERRUN_ERR		0x40&lt;br /&gt;
&lt;br /&gt;
// This file does not include the HID debug functions, so these empty&lt;br /&gt;
// macros replace them with nothing, so users can compile code that&lt;br /&gt;
// has calls to these functions.&lt;br /&gt;
#define usb_debug_putchar(c)&lt;br /&gt;
#define usb_debug_flush_output()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Everything below this point is only intended for usb_serial.c&lt;br /&gt;
#ifdef USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EP_TYPE_CONTROL			0x00&lt;br /&gt;
#define EP_TYPE_BULK_IN			0x81&lt;br /&gt;
#define EP_TYPE_BULK_OUT		0x80&lt;br /&gt;
#define EP_TYPE_INTERRUPT_IN		0xC1&lt;br /&gt;
#define EP_TYPE_INTERRUPT_OUT		0xC0&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_IN		0x41&lt;br /&gt;
#define EP_TYPE_ISOCHRONOUS_OUT		0x40&lt;br /&gt;
#define EP_SINGLE_BUFFER		0x02&lt;br /&gt;
#define EP_DOUBLE_BUFFER		0x06&lt;br /&gt;
#define EP_SIZE(s)	((s) == 64 ? 0x30 :	\&lt;br /&gt;
			((s) == 32 ? 0x20 :	\&lt;br /&gt;
			((s) == 16 ? 0x10 :	\&lt;br /&gt;
			             0x00)))&lt;br /&gt;
&lt;br /&gt;
#define MAX_ENDPOINT		4&lt;br /&gt;
&lt;br /&gt;
#define LSB(n) (n &amp;amp; 255)&lt;br /&gt;
#define MSB(n) ((n &amp;gt;&amp;gt; 8) &amp;amp; 255)&lt;br /&gt;
&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define HW_CONFIG() &lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = ((1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PLLP0)))&lt;br /&gt;
#define USB_CONFIG() (USBCON = (1&amp;lt;&amp;lt;USBE))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_ATmega32U4__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x01)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x12)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB646__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x1A)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#elif defined(__AVR_AT90USB1286__)&lt;br /&gt;
#define HW_CONFIG() (UHWCON = 0x81)&lt;br /&gt;
#define PLL_CONFIG() (PLLCSR = 0x16)&lt;br /&gt;
#define USB_CONFIG() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;OTGPADE)))&lt;br /&gt;
#define USB_FREEZE() (USBCON = ((1&amp;lt;&amp;lt;USBE)|(1&amp;lt;&amp;lt;FRZCLK)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// standard control endpoint request types&lt;br /&gt;
#define GET_STATUS			0&lt;br /&gt;
#define CLEAR_FEATURE			1&lt;br /&gt;
#define SET_FEATURE			3&lt;br /&gt;
#define SET_ADDRESS			5&lt;br /&gt;
#define GET_DESCRIPTOR			6&lt;br /&gt;
#define GET_CONFIGURATION		8&lt;br /&gt;
#define SET_CONFIGURATION		9&lt;br /&gt;
#define GET_INTERFACE			10&lt;br /&gt;
#define SET_INTERFACE			11&lt;br /&gt;
// HID (human interface device)&lt;br /&gt;
#define HID_GET_REPORT			1&lt;br /&gt;
#define HID_GET_PROTOCOL		3&lt;br /&gt;
#define HID_SET_REPORT			9&lt;br /&gt;
#define HID_SET_IDLE			10&lt;br /&gt;
#define HID_SET_PROTOCOL		11&lt;br /&gt;
// CDC (communication class device)&lt;br /&gt;
#define CDC_SET_LINE_CODING		0x20&lt;br /&gt;
#define CDC_GET_LINE_CODING		0x21&lt;br /&gt;
#define CDC_SET_CONTROL_LINE_STATE	0x22&lt;br /&gt;
#endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : usb_serial.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* USB Serial Example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/usb_serial.html&lt;br /&gt;
 * Copyright (c) 2008,2010,2011 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Version 1.0: Initial Release&lt;br /&gt;
// Version 1.1: support Teensy++&lt;br /&gt;
// Version 1.2: fixed usb_serial_available&lt;br /&gt;
// Version 1.3: added transmit bandwidth test&lt;br /&gt;
// Version 1.4: added usb_serial_write&lt;br /&gt;
// Version 1.5: add support for Teensy 2.0&lt;br /&gt;
// Version 1.6: fix zero length packet bug&lt;br /&gt;
// Version 1.7: fix usb_serial_set_control&lt;br /&gt;
&lt;br /&gt;
#define USB_SERIAL_PRIVATE_INCLUDE&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Configurable Options&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// You can change these to give your code its own name.  On Windows,&lt;br /&gt;
// these are only used before an INF file (driver install) is loaded.&lt;br /&gt;
#define STR_MANUFACTURER	L&amp;quot;Your Name&amp;quot;&lt;br /&gt;
#define STR_PRODUCT		L&amp;quot;USB Serial&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// All USB serial devices are supposed to have a serial number&lt;br /&gt;
// (according to Microsoft).  On windows, a new COM port is created&lt;br /&gt;
// for every unique serial/vendor/product number combination.  If&lt;br /&gt;
// you program 2 identical boards with 2 different serial numbers&lt;br /&gt;
// and they are assigned COM7 and COM8, each will always get the&lt;br /&gt;
// same COM port number because Windows remembers serial numbers.&lt;br /&gt;
//&lt;br /&gt;
// On Mac OS-X, a device file is created automatically which&lt;br /&gt;
// incorperates the serial number, eg, /dev/cu-usbmodem12341&lt;br /&gt;
//&lt;br /&gt;
// Linux by default ignores the serial number, and creates device&lt;br /&gt;
// files named /dev/ttyACM0, /dev/ttyACM1... in the order connected.&lt;br /&gt;
// Udev rules (in /etc/udev/rules.d) can define persistent device&lt;br /&gt;
// names linked to this serial number, as well as permissions, owner&lt;br /&gt;
// and group settings.&lt;br /&gt;
#define STR_SERIAL_NUMBER	L&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Mac OS-X and Linux automatically load the correct drivers.  On&lt;br /&gt;
// Windows, even though the driver is supplied by Microsoft, an&lt;br /&gt;
// INF file is needed to load the driver.  These numbers need to&lt;br /&gt;
// match the INF file.&lt;br /&gt;
#define VENDOR_ID		0x16C0&lt;br /&gt;
#define PRODUCT_ID		0x047A&lt;br /&gt;
&lt;br /&gt;
// When you write data, it goes into a USB endpoint buffer, which&lt;br /&gt;
// is transmitted to the PC when it becomes full, or after a timeout&lt;br /&gt;
// with no more writes.  Even if you write in exactly packet-size&lt;br /&gt;
// increments, this timeout is used to send a &amp;quot;zero length packet&amp;quot;&lt;br /&gt;
// that tells the PC no more data is expected and it should pass&lt;br /&gt;
// any buffered data to the application that may be waiting.  If&lt;br /&gt;
// you want data sent immediately, call usb_serial_flush_output().&lt;br /&gt;
#define TRANSMIT_FLUSH_TIMEOUT	5   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// If the PC is connected but not &amp;quot;listening&amp;quot;, this is the length&lt;br /&gt;
// of time before usb_serial_getchar() returns with an error.  This&lt;br /&gt;
// is roughly equivilant to a real UART simply transmitting the&lt;br /&gt;
// bits on a wire where nobody is listening, except you get an error&lt;br /&gt;
// code which you can ignore for serial-like discard of data, or&lt;br /&gt;
// use to know your data wasn't sent.&lt;br /&gt;
#define TRANSMIT_TIMEOUT	25   /* in milliseconds */&lt;br /&gt;
&lt;br /&gt;
// USB devices are supposed to implment a halt feature, which is&lt;br /&gt;
// rarely (if ever) used.  If you comment this line out, the halt&lt;br /&gt;
// code will be removed, saving 116 bytes of space (gcc 4.3.0).&lt;br /&gt;
// This is not strictly USB compliant, but works with all major&lt;br /&gt;
// operating systems.&lt;br /&gt;
#define SUPPORT_ENDPOINT_HALT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Endpoint Buffer Configuration&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// These buffer sizes are best for most applications, but perhaps if you&lt;br /&gt;
// want more buffering on some endpoint at the expense of others, this&lt;br /&gt;
// is where you can make such changes.  The AT90USB162 has only 176 bytes&lt;br /&gt;
// of DPRAM (USB buffers) and only endpoints 3 &amp;amp; 4 can double buffer.&lt;br /&gt;
&lt;br /&gt;
#define ENDPOINT0_SIZE		16&lt;br /&gt;
#define CDC_ACM_ENDPOINT	2&lt;br /&gt;
#define CDC_RX_ENDPOINT		3&lt;br /&gt;
#define CDC_TX_ENDPOINT		4&lt;br /&gt;
#if defined(__AVR_AT90USB162__)&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		32&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		32&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#else&lt;br /&gt;
#define CDC_ACM_SIZE		16&lt;br /&gt;
#define CDC_ACM_BUFFER		EP_SINGLE_BUFFER&lt;br /&gt;
#define CDC_RX_SIZE		64&lt;br /&gt;
#define CDC_RX_BUFFER 		EP_DOUBLE_BUFFER&lt;br /&gt;
#define CDC_TX_SIZE		64&lt;br /&gt;
#define CDC_TX_BUFFER		EP_DOUBLE_BUFFER&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static const uint8_t PROGMEM endpoint_config_table[] = {&lt;br /&gt;
	0,&lt;br /&gt;
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(CDC_ACM_SIZE) | CDC_ACM_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_OUT,      EP_SIZE(CDC_RX_SIZE) | CDC_RX_BUFFER,&lt;br /&gt;
	1, EP_TYPE_BULK_IN,       EP_SIZE(CDC_TX_SIZE) | CDC_TX_BUFFER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Descriptor Data&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Descriptors are the data that your computer reads when it auto-detects&lt;br /&gt;
// this USB device (called &amp;quot;enumeration&amp;quot; in USB lingo).  The most commonly&lt;br /&gt;
// changed items are editable at the top of this file.  Changing things&lt;br /&gt;
// in here should only be done by those who've read chapter 9 of the USB&lt;br /&gt;
// spec and relevant portions of any USB class specifications!&lt;br /&gt;
&lt;br /&gt;
const static uint8_t PROGMEM device_descriptor[] = {&lt;br /&gt;
	18,					// bLength&lt;br /&gt;
	1,					// bDescriptorType&lt;br /&gt;
	0x00, 0x02,				// bcdUSB&lt;br /&gt;
	2,					// bDeviceClass&lt;br /&gt;
	0,					// bDeviceSubClass&lt;br /&gt;
	0,					// bDeviceProtocol&lt;br /&gt;
	ENDPOINT0_SIZE,				// bMaxPacketSize0&lt;br /&gt;
	LSB(VENDOR_ID), MSB(VENDOR_ID),		// idVendor&lt;br /&gt;
	LSB(PRODUCT_ID), MSB(PRODUCT_ID),	// idProduct&lt;br /&gt;
	0x00, 0x01,				// bcdDevice&lt;br /&gt;
	1,					// iManufacturer&lt;br /&gt;
	2,					// iProduct&lt;br /&gt;
	3,					// iSerialNumber&lt;br /&gt;
	1					// bNumConfigurations&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)&lt;br /&gt;
const static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {&lt;br /&gt;
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10&lt;br /&gt;
	9, 					// bLength;&lt;br /&gt;
	2,					// bDescriptorType;&lt;br /&gt;
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength&lt;br /&gt;
	MSB(CONFIG1_DESC_SIZE),&lt;br /&gt;
	2,					// bNumInterfaces&lt;br /&gt;
	1,					// bConfigurationValue&lt;br /&gt;
	0,					// iConfiguration&lt;br /&gt;
	0xC0,					// bmAttributes&lt;br /&gt;
	50,					// bMaxPower&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	0,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	1,					// bNumEndpoints&lt;br /&gt;
	0x02,					// bInterfaceClass&lt;br /&gt;
	0x02,					// bInterfaceSubClass&lt;br /&gt;
	0x01,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x00,					// bDescriptorSubtype&lt;br /&gt;
	0x10, 0x01,				// bcdCDC&lt;br /&gt;
	// Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x01,					// bDescriptorSubtype&lt;br /&gt;
	0x01,					// bmCapabilities&lt;br /&gt;
	1,					// bDataInterface&lt;br /&gt;
	// Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28&lt;br /&gt;
	4,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x02,					// bDescriptorSubtype&lt;br /&gt;
	0x06,					// bmCapabilities&lt;br /&gt;
	// Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33&lt;br /&gt;
	5,					// bFunctionLength&lt;br /&gt;
	0x24,					// bDescriptorType&lt;br /&gt;
	0x06,					// bDescriptorSubtype&lt;br /&gt;
	0,					// bMasterInterface&lt;br /&gt;
	1,					// bSlaveInterface0&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_ACM_ENDPOINT | 0x80,		// bEndpointAddress&lt;br /&gt;
	0x03,					// bmAttributes (0x03=intr)&lt;br /&gt;
	CDC_ACM_SIZE, 0,			// wMaxPacketSize&lt;br /&gt;
	64,					// bInterval&lt;br /&gt;
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12&lt;br /&gt;
	9,					// bLength&lt;br /&gt;
	4,					// bDescriptorType&lt;br /&gt;
	1,					// bInterfaceNumber&lt;br /&gt;
	0,					// bAlternateSetting&lt;br /&gt;
	2,					// bNumEndpoints&lt;br /&gt;
	0x0A,					// bInterfaceClass&lt;br /&gt;
	0x00,					// bInterfaceSubClass&lt;br /&gt;
	0x00,					// bInterfaceProtocol&lt;br /&gt;
	0,					// iInterface&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_RX_ENDPOINT,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_RX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0,					// bInterval&lt;br /&gt;
	// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13&lt;br /&gt;
	7,					// bLength&lt;br /&gt;
	5,					// bDescriptorType&lt;br /&gt;
	CDC_TX_ENDPOINT | 0x80,			// bEndpointAddress&lt;br /&gt;
	0x02,					// bmAttributes (0x02=bulk)&lt;br /&gt;
	CDC_TX_SIZE, 0,				// wMaxPacketSize&lt;br /&gt;
	0					// bInterval&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// If you're desperate for a little extra code memory, these strings&lt;br /&gt;
// can be completely removed if iManufacturer, iProduct, iSerialNumber&lt;br /&gt;
// in the device desciptor are changed to zeros.&lt;br /&gt;
struct usb_string_descriptor_struct {&lt;br /&gt;
	uint8_t bLength;&lt;br /&gt;
	uint8_t bDescriptorType;&lt;br /&gt;
	int16_t wString[];&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string0 = {&lt;br /&gt;
	4,&lt;br /&gt;
	3,&lt;br /&gt;
	{0x0409}&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string1 = {&lt;br /&gt;
	sizeof(STR_MANUFACTURER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_MANUFACTURER&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string2 = {&lt;br /&gt;
	sizeof(STR_PRODUCT),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_PRODUCT&lt;br /&gt;
};&lt;br /&gt;
const static struct usb_string_descriptor_struct PROGMEM string3 = {&lt;br /&gt;
	sizeof(STR_SERIAL_NUMBER),&lt;br /&gt;
	3,&lt;br /&gt;
	STR_SERIAL_NUMBER&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This table defines which descriptor data is sent for each specific&lt;br /&gt;
// request from the host (in wValue and wIndex).&lt;br /&gt;
const static struct descriptor_list_struct {&lt;br /&gt;
	uint16_t	wValue;&lt;br /&gt;
	uint16_t	wIndex;&lt;br /&gt;
	const uint8_t	*addr;&lt;br /&gt;
	uint8_t		length;&lt;br /&gt;
} PROGMEM descriptor_list[] = {&lt;br /&gt;
	{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},&lt;br /&gt;
	{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},&lt;br /&gt;
	{0x0300, 0x0000, (const uint8_t *)&amp;amp;string0, 4},&lt;br /&gt;
	{0x0301, 0x0409, (const uint8_t *)&amp;amp;string1, sizeof(STR_MANUFACTURER)},&lt;br /&gt;
	{0x0302, 0x0409, (const uint8_t *)&amp;amp;string2, sizeof(STR_PRODUCT)},&lt;br /&gt;
	{0x0303, 0x0409, (const uint8_t *)&amp;amp;string3, sizeof(STR_SERIAL_NUMBER)}&lt;br /&gt;
};&lt;br /&gt;
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Variables - these are the only non-stack RAM usage&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// zero when we are not configured, non-zero when enumerated&lt;br /&gt;
static volatile uint8_t usb_configuration=0;&lt;br /&gt;
&lt;br /&gt;
// the time remaining before we transmit any partially full&lt;br /&gt;
// packet, or send a zero length packet.&lt;br /&gt;
static volatile uint8_t transmit_flush_timer=0;&lt;br /&gt;
static uint8_t transmit_previous_timeout=0;&lt;br /&gt;
&lt;br /&gt;
// serial port settings (baud rate, control signals, etc) set&lt;br /&gt;
// by the PC.  These are ignored, but kept in RAM.&lt;br /&gt;
static uint8_t cdc_line_coding[7]={0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x08};&lt;br /&gt;
static uint8_t cdc_line_rtsdtr=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Public Functions - these are the API intended for the user&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// initialize USB serial&lt;br /&gt;
void usb_init(void)&lt;br /&gt;
{&lt;br /&gt;
	HW_CONFIG();&lt;br /&gt;
        USB_FREEZE();				// enable USB&lt;br /&gt;
        PLL_CONFIG();				// config PLL, 16 MHz xtal&lt;br /&gt;
        while (!(PLLCSR &amp;amp; (1&amp;lt;&amp;lt;PLOCK))) ;	// wait for PLL lock&lt;br /&gt;
        USB_CONFIG();				// start USB clock&lt;br /&gt;
        UDCON = 0;				// enable attach resistor&lt;br /&gt;
	usb_configuration = 0;&lt;br /&gt;
	cdc_line_rtsdtr = 0;&lt;br /&gt;
        UDIEN = (1&amp;lt;&amp;lt;EORSTE)|(1&amp;lt;&amp;lt;SOFE);&lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return 0 if the USB is not configured, or the configuration&lt;br /&gt;
// number selected by the HOST&lt;br /&gt;
uint8_t usb_configured(void)&lt;br /&gt;
{&lt;br /&gt;
	return usb_configuration;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get the next character, or -1 if nothing received&lt;br /&gt;
int16_t usb_serial_getchar(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t c, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
	retry:&lt;br /&gt;
	c = UEINTX;&lt;br /&gt;
	if (!(c &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// no data in buffer&lt;br /&gt;
		if (c &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) {&lt;br /&gt;
			UEINTX = 0x6B;&lt;br /&gt;
			goto retry;&lt;br /&gt;
		}	&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// take one byte out of the buffer&lt;br /&gt;
	c = UEDATX;&lt;br /&gt;
	// if buffer completely used, release it&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// number of bytes available in the receive buffer&lt;br /&gt;
uint8_t usb_serial_available(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t n=0, i, intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		n = UEBCLX;&lt;br /&gt;
		if (!n) {&lt;br /&gt;
			i = UEINTX;&lt;br /&gt;
			if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI) &amp;amp;&amp;amp; !(i &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x6B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// discard any buffered input&lt;br /&gt;
void usb_serial_flush_input(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (usb_configuration) {&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_RX_ENDPOINT;&lt;br /&gt;
		while ((UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			UEINTX = 0x6B; &lt;br /&gt;
		}&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a character.  0 returned on success, -1 on error&lt;br /&gt;
int8_t usb_serial_putchar(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// wait for the FIFO to be ready to accept data&lt;br /&gt;
	timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// are we ready to transmit?&lt;br /&gt;
		if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		// have we waited too long?  This happens if the user&lt;br /&gt;
		// is not running an application that is listening&lt;br /&gt;
		if (UDFNUML == timeout) {&lt;br /&gt;
			transmit_previous_timeout = 1;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		// has the USB gone offline?&lt;br /&gt;
		if (!usb_configuration) return -1;&lt;br /&gt;
		// get ready to try checking again&lt;br /&gt;
		intr_state = SREG;&lt;br /&gt;
		cli();&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
	// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// transmit a character, but do not wait if the buffer is full,&lt;br /&gt;
//   0 returned on success, -1 on buffer full or error &lt;br /&gt;
int8_t usb_serial_putchar_nowait(uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// buffer is full&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	// actually write the byte into the FIFO&lt;br /&gt;
	UEDATX = c;&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
	transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// transmit a buffer.&lt;br /&gt;
//  0 returned on success, -1 on error&lt;br /&gt;
// This function is optimized for speed!  Each call takes approx 6.1 us overhead&lt;br /&gt;
// plus 0.25 us per byte.  12 Mbit/sec USB has 8.67 us per-packet overhead and&lt;br /&gt;
// takes 0.67 us per byte.  If called with 64 byte packet-size blocks, this function&lt;br /&gt;
// can transmit at full USB speed using 43% CPU time.  The maximum theoretical speed&lt;br /&gt;
// is 19 packets per USB frame, or 1216 kbytes/sec.  However, bulk endpoints have the&lt;br /&gt;
// lowest priority, so any other USB devices will likely reduce the speed.  Speed&lt;br /&gt;
// can also be limited by how quickly the PC-based software reads data, as the host&lt;br /&gt;
// controller in the PC will not allocate bandwitdh without a pending read request.&lt;br /&gt;
// (thanks to Victor Suarez for testing and feedback and initial code)&lt;br /&gt;
&lt;br /&gt;
int8_t usb_serial_write(const uint8_t *buffer, uint16_t size)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t timeout, intr_state, write_size;&lt;br /&gt;
&lt;br /&gt;
	// if we're not online (enumerated and configured), error&lt;br /&gt;
	if (!usb_configuration) return -1;&lt;br /&gt;
	// interrupts are disabled so these functions can be&lt;br /&gt;
	// used from the main program or interrupt context,&lt;br /&gt;
	// even both in the same program!&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
	// if we gave up due to timeout before, don't wait again&lt;br /&gt;
	if (transmit_previous_timeout) {&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		transmit_previous_timeout = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// each iteration of this loop transmits a packet&lt;br /&gt;
	while (size) {&lt;br /&gt;
		// wait for the FIFO to be ready to accept data&lt;br /&gt;
		timeout = UDFNUML + TRANSMIT_TIMEOUT;&lt;br /&gt;
		while (1) {&lt;br /&gt;
			// are we ready to transmit?&lt;br /&gt;
			if (UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL)) break;&lt;br /&gt;
			SREG = intr_state;&lt;br /&gt;
			// have we waited too long?  This happens if the user&lt;br /&gt;
			// is not running an application that is listening&lt;br /&gt;
			if (UDFNUML == timeout) {&lt;br /&gt;
				transmit_previous_timeout = 1;&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			// has the USB gone offline?&lt;br /&gt;
			if (!usb_configuration) return -1;&lt;br /&gt;
			// get ready to try checking again&lt;br /&gt;
			intr_state = SREG;&lt;br /&gt;
			cli();&lt;br /&gt;
			UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// compute how many bytes will fit into the next packet&lt;br /&gt;
		write_size = CDC_TX_SIZE - UEBCLX;&lt;br /&gt;
		if (write_size &amp;gt; size) write_size = size;&lt;br /&gt;
		size -= write_size;&lt;br /&gt;
&lt;br /&gt;
		// write the packet&lt;br /&gt;
		switch (write_size) {&lt;br /&gt;
			#if (CDC_TX_SIZE == 64)&lt;br /&gt;
			case 64: UEDATX = *buffer++;&lt;br /&gt;
			case 63: UEDATX = *buffer++;&lt;br /&gt;
			case 62: UEDATX = *buffer++;&lt;br /&gt;
			case 61: UEDATX = *buffer++;&lt;br /&gt;
			case 60: UEDATX = *buffer++;&lt;br /&gt;
			case 59: UEDATX = *buffer++;&lt;br /&gt;
			case 58: UEDATX = *buffer++;&lt;br /&gt;
			case 57: UEDATX = *buffer++;&lt;br /&gt;
			case 56: UEDATX = *buffer++;&lt;br /&gt;
			case 55: UEDATX = *buffer++;&lt;br /&gt;
			case 54: UEDATX = *buffer++;&lt;br /&gt;
			case 53: UEDATX = *buffer++;&lt;br /&gt;
			case 52: UEDATX = *buffer++;&lt;br /&gt;
			case 51: UEDATX = *buffer++;&lt;br /&gt;
			case 50: UEDATX = *buffer++;&lt;br /&gt;
			case 49: UEDATX = *buffer++;&lt;br /&gt;
			case 48: UEDATX = *buffer++;&lt;br /&gt;
			case 47: UEDATX = *buffer++;&lt;br /&gt;
			case 46: UEDATX = *buffer++;&lt;br /&gt;
			case 45: UEDATX = *buffer++;&lt;br /&gt;
			case 44: UEDATX = *buffer++;&lt;br /&gt;
			case 43: UEDATX = *buffer++;&lt;br /&gt;
			case 42: UEDATX = *buffer++;&lt;br /&gt;
			case 41: UEDATX = *buffer++;&lt;br /&gt;
			case 40: UEDATX = *buffer++;&lt;br /&gt;
			case 39: UEDATX = *buffer++;&lt;br /&gt;
			case 38: UEDATX = *buffer++;&lt;br /&gt;
			case 37: UEDATX = *buffer++;&lt;br /&gt;
			case 36: UEDATX = *buffer++;&lt;br /&gt;
			case 35: UEDATX = *buffer++;&lt;br /&gt;
			case 34: UEDATX = *buffer++;&lt;br /&gt;
			case 33: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 32)&lt;br /&gt;
			case 32: UEDATX = *buffer++;&lt;br /&gt;
			case 31: UEDATX = *buffer++;&lt;br /&gt;
			case 30: UEDATX = *buffer++;&lt;br /&gt;
			case 29: UEDATX = *buffer++;&lt;br /&gt;
			case 28: UEDATX = *buffer++;&lt;br /&gt;
			case 27: UEDATX = *buffer++;&lt;br /&gt;
			case 26: UEDATX = *buffer++;&lt;br /&gt;
			case 25: UEDATX = *buffer++;&lt;br /&gt;
			case 24: UEDATX = *buffer++;&lt;br /&gt;
			case 23: UEDATX = *buffer++;&lt;br /&gt;
			case 22: UEDATX = *buffer++;&lt;br /&gt;
			case 21: UEDATX = *buffer++;&lt;br /&gt;
			case 20: UEDATX = *buffer++;&lt;br /&gt;
			case 19: UEDATX = *buffer++;&lt;br /&gt;
			case 18: UEDATX = *buffer++;&lt;br /&gt;
			case 17: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			#if (CDC_TX_SIZE &amp;gt;= 16)&lt;br /&gt;
			case 16: UEDATX = *buffer++;&lt;br /&gt;
			case 15: UEDATX = *buffer++;&lt;br /&gt;
			case 14: UEDATX = *buffer++;&lt;br /&gt;
			case 13: UEDATX = *buffer++;&lt;br /&gt;
			case 12: UEDATX = *buffer++;&lt;br /&gt;
			case 11: UEDATX = *buffer++;&lt;br /&gt;
			case 10: UEDATX = *buffer++;&lt;br /&gt;
			case  9: UEDATX = *buffer++;&lt;br /&gt;
			#endif&lt;br /&gt;
			case  8: UEDATX = *buffer++;&lt;br /&gt;
			case  7: UEDATX = *buffer++;&lt;br /&gt;
			case  6: UEDATX = *buffer++;&lt;br /&gt;
			case  5: UEDATX = *buffer++;&lt;br /&gt;
			case  4: UEDATX = *buffer++;&lt;br /&gt;
			case  3: UEDATX = *buffer++;&lt;br /&gt;
			case  2: UEDATX = *buffer++;&lt;br /&gt;
			default:&lt;br /&gt;
			case  1: UEDATX = *buffer++;&lt;br /&gt;
			case  0: break;&lt;br /&gt;
		}&lt;br /&gt;
		// if this completed a packet, transmit it now!&lt;br /&gt;
		if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// immediately transmit any buffered output.&lt;br /&gt;
// This doesn't actually transmit the data - that is impossible!&lt;br /&gt;
// USB devices only transmit when the host allows, so the best&lt;br /&gt;
// we can do is release the FIFO buffer for when the host wants it&lt;br /&gt;
void usb_serial_flush_output(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (transmit_flush_timer) {&lt;br /&gt;
		UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
		UEINTX = 0x3A;&lt;br /&gt;
		transmit_flush_timer = 0;&lt;br /&gt;
	}&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// functions to read the various async serial settings.  These&lt;br /&gt;
// aren't actually used by USB at all (communication is always&lt;br /&gt;
// at full USB speed), but they are set by the host so we can&lt;br /&gt;
// set them properly if we're converting the USB to a real serial&lt;br /&gt;
// communication&lt;br /&gt;
uint32_t usb_serial_get_baud(void)&lt;br /&gt;
{&lt;br /&gt;
	return *(uint32_t *)cdc_line_coding;&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_stopbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[4];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_paritytype(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[5];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_numbits(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_coding[6];&lt;br /&gt;
}&lt;br /&gt;
uint8_t usb_serial_get_control(void)&lt;br /&gt;
{&lt;br /&gt;
	return cdc_line_rtsdtr;&lt;br /&gt;
}&lt;br /&gt;
// write the control signals, DCD, DSR, RI, etc&lt;br /&gt;
// There is no CTS signal.  If software on the host has transmitted&lt;br /&gt;
// data to you but you haven't been calling the getchar function,&lt;br /&gt;
// it remains buffered (either here or on the host) and can not be&lt;br /&gt;
// lost because you weren't listening at the right time, like it&lt;br /&gt;
// would in real serial communication.&lt;br /&gt;
int8_t usb_serial_set_control(uint8_t signals)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intr_state;&lt;br /&gt;
&lt;br /&gt;
	intr_state = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	if (!usb_configuration) {&lt;br /&gt;
		// we're not enumerated/configured&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	UENUM = CDC_ACM_ENDPOINT;&lt;br /&gt;
	if (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RWAL))) {&lt;br /&gt;
		// unable to write&lt;br /&gt;
		// TODO; should this try to abort the previously&lt;br /&gt;
		// buffered message??&lt;br /&gt;
		SREG = intr_state;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	UEDATX = 0xA1;&lt;br /&gt;
	UEDATX = 0x20;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 0; // 0 seems to work nicely.  what if this is 1??&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = 1;&lt;br /&gt;
	UEDATX = 0;&lt;br /&gt;
	UEDATX = signals;&lt;br /&gt;
	UEINTX = 0x3A;&lt;br /&gt;
	SREG = intr_state;&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *  Private Functions - not intended for general user consumption....&lt;br /&gt;
 *&lt;br /&gt;
 **************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Device Interrupt - handle all device-level events&lt;br /&gt;
// the transmit buffer flushing is triggered by the start of frame&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_GEN_vect)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t intbits, t;&lt;br /&gt;
&lt;br /&gt;
        intbits = UDINT;&lt;br /&gt;
        UDINT = 0;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;EORSTI)) {&lt;br /&gt;
		UENUM = 0;&lt;br /&gt;
		UECONX = 1;&lt;br /&gt;
		UECFG0X = EP_TYPE_CONTROL;&lt;br /&gt;
		UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;&lt;br /&gt;
		UEIENX = (1&amp;lt;&amp;lt;RXSTPE);&lt;br /&gt;
		usb_configuration = 0;&lt;br /&gt;
		cdc_line_rtsdtr = 0;&lt;br /&gt;
        }&lt;br /&gt;
	if (intbits &amp;amp; (1&amp;lt;&amp;lt;SOFI)) {&lt;br /&gt;
		if (usb_configuration) {&lt;br /&gt;
			t = transmit_flush_timer;&lt;br /&gt;
			if (t) {&lt;br /&gt;
				transmit_flush_timer = --t;&lt;br /&gt;
				if (!t) {&lt;br /&gt;
					UENUM = CDC_TX_ENDPOINT;&lt;br /&gt;
					UEINTX = 0x3A;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Misc functions to wait for ready and send/receive packets&lt;br /&gt;
static inline void usb_wait_in_ready(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;TXINI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_send_in(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;TXINI);&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_wait_receive_out(void)&lt;br /&gt;
{&lt;br /&gt;
	while (!(UEINTX &amp;amp; (1&amp;lt;&amp;lt;RXOUTI))) ;&lt;br /&gt;
}&lt;br /&gt;
static inline void usb_ack_out(void)&lt;br /&gt;
{&lt;br /&gt;
	UEINTX = ~(1&amp;lt;&amp;lt;RXOUTI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// USB Endpoint Interrupt - endpoint 0 is handled here.  The&lt;br /&gt;
// other endpoints are manipulated by the user-callable&lt;br /&gt;
// functions, and the start-of-frame interrupt.&lt;br /&gt;
//&lt;br /&gt;
ISR(USB_COM_vect)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t intbits;&lt;br /&gt;
	const uint8_t *list;&lt;br /&gt;
        const uint8_t *cfg;&lt;br /&gt;
	uint8_t i, n, len, en;&lt;br /&gt;
	uint8_t *p;&lt;br /&gt;
	uint8_t bmRequestType;&lt;br /&gt;
	uint8_t bRequest;&lt;br /&gt;
	uint16_t wValue;&lt;br /&gt;
	uint16_t wIndex;&lt;br /&gt;
	uint16_t wLength;&lt;br /&gt;
	uint16_t desc_val;&lt;br /&gt;
	const uint8_t *desc_addr;&lt;br /&gt;
	uint8_t	desc_length;&lt;br /&gt;
&lt;br /&gt;
        UENUM = 0;&lt;br /&gt;
        intbits = UEINTX;&lt;br /&gt;
        if (intbits &amp;amp; (1&amp;lt;&amp;lt;RXSTPI)) {&lt;br /&gt;
                bmRequestType = UEDATX;&lt;br /&gt;
                bRequest = UEDATX;&lt;br /&gt;
                wValue = UEDATX;&lt;br /&gt;
                wValue |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wIndex = UEDATX;&lt;br /&gt;
                wIndex |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                wLength = UEDATX;&lt;br /&gt;
                wLength |= (UEDATX &amp;lt;&amp;lt; 8);&lt;br /&gt;
                UEINTX = ~((1&amp;lt;&amp;lt;RXSTPI) | (1&amp;lt;&amp;lt;RXOUTI) | (1&amp;lt;&amp;lt;TXINI));&lt;br /&gt;
                if (bRequest == GET_DESCRIPTOR) {&lt;br /&gt;
			list = (const uint8_t *)descriptor_list;&lt;br /&gt;
			for (i=0; ; i++) {&lt;br /&gt;
				if (i &amp;gt;= NUM_DESC_LIST) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);  //stall&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wValue) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_val = pgm_read_word(list);&lt;br /&gt;
				if (desc_val != wIndex) {&lt;br /&gt;
					list += sizeof(struct descriptor_list_struct)-2;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_addr = (const uint8_t *)pgm_read_word(list);&lt;br /&gt;
				list += 2;&lt;br /&gt;
				desc_length = pgm_read_byte(list);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			len = (wLength &amp;lt; 256) ? wLength : 255;&lt;br /&gt;
			if (len &amp;gt; desc_length) len = desc_length;&lt;br /&gt;
			do {&lt;br /&gt;
				// wait for host ready for IN packet&lt;br /&gt;
				do {&lt;br /&gt;
					i = UEINTX;&lt;br /&gt;
				} while (!(i &amp;amp; ((1&amp;lt;&amp;lt;TXINI)|(1&amp;lt;&amp;lt;RXOUTI))));&lt;br /&gt;
				if (i &amp;amp; (1&amp;lt;&amp;lt;RXOUTI)) return;	// abort&lt;br /&gt;
				// send IN packet&lt;br /&gt;
				n = len &amp;lt; ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE;&lt;br /&gt;
				for (i = n; i; i--) {&lt;br /&gt;
					UEDATX = pgm_read_byte(desc_addr++);&lt;br /&gt;
				}&lt;br /&gt;
				len -= n;&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
			} while (len || n == ENDPOINT0_SIZE);&lt;br /&gt;
			return;&lt;br /&gt;
                }&lt;br /&gt;
		if (bRequest == SET_ADDRESS) {&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UDADDR = wValue | (1&amp;lt;&amp;lt;ADDEN);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == SET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0) {&lt;br /&gt;
			usb_configuration = wValue;&lt;br /&gt;
			cdc_line_rtsdtr = 0;&lt;br /&gt;
			transmit_flush_timer = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			cfg = endpoint_config_table;&lt;br /&gt;
			for (i=1; i&amp;lt;5; i++) {&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				en = pgm_read_byte(cfg++);&lt;br /&gt;
				UECONX = en;&lt;br /&gt;
				if (en) {&lt;br /&gt;
					UECFG0X = pgm_read_byte(cfg++);&lt;br /&gt;
					UECFG1X = pgm_read_byte(cfg++);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
        		UERST = 0x1E;&lt;br /&gt;
        		UERST = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_CONFIGURATION &amp;amp;&amp;amp; bmRequestType == 0x80) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			UEDATX = usb_configuration;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_GET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0xA1) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				UEDATX = *p++;&lt;br /&gt;
			}&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_LINE_CODING &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			usb_wait_receive_out();&lt;br /&gt;
			p = cdc_line_coding;&lt;br /&gt;
			for (i=0; i&amp;lt;7; i++) {&lt;br /&gt;
				*p++ = UEDATX;&lt;br /&gt;
			}&lt;br /&gt;
			usb_ack_out();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == CDC_SET_CONTROL_LINE_STATE &amp;amp;&amp;amp; bmRequestType == 0x21) {&lt;br /&gt;
			cdc_line_rtsdtr = wValue;&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (bRequest == GET_STATUS) {&lt;br /&gt;
			usb_wait_in_ready();&lt;br /&gt;
			i = 0;&lt;br /&gt;
			#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
			if (bmRequestType == 0x82) {&lt;br /&gt;
				UENUM = wIndex;&lt;br /&gt;
				if (UECONX &amp;amp; (1&amp;lt;&amp;lt;STALLRQ)) i = 1;&lt;br /&gt;
				UENUM = 0;&lt;br /&gt;
			}&lt;br /&gt;
			#endif&lt;br /&gt;
			UEDATX = i;&lt;br /&gt;
			UEDATX = 0;&lt;br /&gt;
			usb_send_in();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		#ifdef SUPPORT_ENDPOINT_HALT&lt;br /&gt;
		if ((bRequest == CLEAR_FEATURE || bRequest == SET_FEATURE)&lt;br /&gt;
		  &amp;amp;&amp;amp; bmRequestType == 0x02 &amp;amp;&amp;amp; wValue == 0) {&lt;br /&gt;
			i = wIndex &amp;amp; 0x7F;&lt;br /&gt;
			if (i &amp;gt;= 1 &amp;amp;&amp;amp; i &amp;lt;= MAX_ENDPOINT) {&lt;br /&gt;
				usb_send_in();&lt;br /&gt;
				UENUM = i;&lt;br /&gt;
				if (bRequest == SET_FEATURE) {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQ)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
				} else {&lt;br /&gt;
					UECONX = (1&amp;lt;&amp;lt;STALLRQC)|(1&amp;lt;&amp;lt;RSTDT)|(1&amp;lt;&amp;lt;EPEN);&lt;br /&gt;
					UERST = (1 &amp;lt;&amp;lt; i);&lt;br /&gt;
					UERST = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		#endif&lt;br /&gt;
        }&lt;br /&gt;
	UECONX = (1&amp;lt;&amp;lt;STALLRQ) | (1&amp;lt;&amp;lt;EPEN);	// stall&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante début|titre=Fichier : exemple.c}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Simple example for Teensy USB Development Board&lt;br /&gt;
 * http://www.pjrc.com/teensy/&lt;br /&gt;
 * Copyright (c) 2008 PJRC.COM, LLC&lt;br /&gt;
 * &lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
 * of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
 * in the Software without restriction, including without limitation the rights&lt;br /&gt;
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
 * copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
 * furnished to do so, subject to the following conditions:&lt;br /&gt;
 * &lt;br /&gt;
 * The above copyright notice and this permission notice shall be included in&lt;br /&gt;
 * all copies or substantial portions of the Software.&lt;br /&gt;
 * &lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;
 * THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;usb_serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define LED_CONFIG	(DDRD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_ON		(PORTD |= (1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define LED_OFF		(PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;6))&lt;br /&gt;
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))&lt;br /&gt;
&lt;br /&gt;
void send_str(const char *s);&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size);&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num);&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
// Very simple character echo test&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int n = usb_serial_getchar();&lt;br /&gt;
		if (n &amp;gt;= 0) usb_serial_putchar(n);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Basic command interpreter for controlling port pins&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	char buf[32];&lt;br /&gt;
	uint8_t n;&lt;br /&gt;
&lt;br /&gt;
	// set for 16 MHz clock, and turn on the LED&lt;br /&gt;
	CPU_PRESCALE(0);&lt;br /&gt;
	LED_CONFIG;&lt;br /&gt;
	LED_ON;&lt;br /&gt;
&lt;br /&gt;
	// initialize the USB, and then wait for the host&lt;br /&gt;
	// to set configuration.  If the Teensy is powered&lt;br /&gt;
	// without a PC connected to the USB port, this &lt;br /&gt;
	// will wait forever.&lt;br /&gt;
	usb_init();&lt;br /&gt;
	while (!usb_configured()) /* wait */ ;&lt;br /&gt;
	_delay_ms(1000);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		// wait for the user to run their terminal emulator program&lt;br /&gt;
		// which sets DTR to indicate it is ready to receive.&lt;br /&gt;
		while (!(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) /* wait */ ;&lt;br /&gt;
&lt;br /&gt;
		// discard anything that was received prior.  Sometimes the&lt;br /&gt;
		// operating system or other software will send a modem&lt;br /&gt;
		// &amp;quot;AT command&amp;quot;, which can still be buffered.&lt;br /&gt;
		usb_serial_flush_input();&lt;br /&gt;
&lt;br /&gt;
		// print a nice welcome message&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\nTeensy USB Serial Example, &amp;quot;&lt;br /&gt;
			&amp;quot;Simple Pin Control Shell\r\n\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;Example Commands\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  B0?   Read Port B, pin 0\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  C2=0  Write Port C, pin 1 LOW\r\n&amp;quot;&lt;br /&gt;
			&amp;quot;  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		// and then listen for commands and process them&lt;br /&gt;
		while (1) {&lt;br /&gt;
			send_str(PSTR(&amp;quot;&amp;gt; &amp;quot;));&lt;br /&gt;
			n = recv_str(buf, sizeof(buf));&lt;br /&gt;
			if (n == 255) break;&lt;br /&gt;
			send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
			parse_and_execute_command(buf, n);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Send a string to the USB serial port.  The string must be in&lt;br /&gt;
// flash memory, using PSTR&lt;br /&gt;
//&lt;br /&gt;
void send_str(const char *s)&lt;br /&gt;
{&lt;br /&gt;
	char c;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		c = pgm_read_byte(s++);&lt;br /&gt;
		if (!c) break;&lt;br /&gt;
		usb_serial_putchar(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Receive a string from the USB serial port.  The string is stored&lt;br /&gt;
// in the buffer and this function will not exceed the buffer size.&lt;br /&gt;
// A carriage return or newline completes the string, and is not&lt;br /&gt;
// stored into the buffer.&lt;br /&gt;
// The return value is the number of characters received, or 255 if&lt;br /&gt;
// the virtual serial connection was closed while waiting.&lt;br /&gt;
//&lt;br /&gt;
uint8_t recv_str(char *buf, uint8_t size)&lt;br /&gt;
{&lt;br /&gt;
	int16_t r;&lt;br /&gt;
	uint8_t count=0;&lt;br /&gt;
&lt;br /&gt;
	while (count &amp;lt; size) {&lt;br /&gt;
		r = usb_serial_getchar();&lt;br /&gt;
		if (r != -1) {&lt;br /&gt;
			if (r == '\r' || r == '\n') return count;&lt;br /&gt;
			if (r &amp;gt;= ' ' &amp;amp;&amp;amp; r &amp;lt;= '~') {&lt;br /&gt;
				*buf++ = r;&lt;br /&gt;
				usb_serial_putchar(r);&lt;br /&gt;
				count++;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (!usb_configured() ||&lt;br /&gt;
			  !(usb_serial_get_control() &amp;amp; USB_SERIAL_DTR)) {&lt;br /&gt;
				// user no longer connected&lt;br /&gt;
				return 255;&lt;br /&gt;
			}&lt;br /&gt;
			// just a normal timeout, keep waiting&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// parse a user command and execute it, or print an error message&lt;br /&gt;
//&lt;br /&gt;
void parse_and_execute_command(const char *buf, uint8_t num)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t port, pin, val;&lt;br /&gt;
&lt;br /&gt;
	if (num &amp;lt; 3) {&lt;br /&gt;
		send_str(PSTR(&amp;quot;unrecognized format, 3 chars min req'd\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// first character is the port letter&lt;br /&gt;
	if (buf[0] &amp;gt;= 'A' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'F') {&lt;br /&gt;
		port = buf[0] - 'A';&lt;br /&gt;
	} else if (buf[0] &amp;gt;= 'a' &amp;amp;&amp;amp; buf[0] &amp;lt;= 'f') {&lt;br /&gt;
		port = buf[0] - 'a';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown port \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be A - F\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// second character is the pin number&lt;br /&gt;
	if (buf[1] &amp;gt;= '0' &amp;amp;&amp;amp; buf[1] &amp;lt;= '7') {&lt;br /&gt;
		pin = buf[1] - '0';&lt;br /&gt;
	} else {&lt;br /&gt;
		send_str(PSTR(&amp;quot;Unknown pin \&amp;quot;&amp;quot;));&lt;br /&gt;
		usb_serial_putchar(buf[0]);&lt;br /&gt;
		send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 to 7\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is a question mark, read the pin&lt;br /&gt;
	if (buf[2] == '?') {&lt;br /&gt;
		// make the pin an input&lt;br /&gt;
		*(uint8_t *)(0x21 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		// read the pin&lt;br /&gt;
		val = *(uint8_t *)(0x20 + port * 3) &amp;amp; (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
		usb_serial_putchar(val ? '1' : '0');&lt;br /&gt;
		send_str(PSTR(&amp;quot;\r\n&amp;quot;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	// if the third character is an equals sign, write the pin&lt;br /&gt;
	if (num &amp;gt;= 4 &amp;amp;&amp;amp; buf[2] == '=') {&lt;br /&gt;
		if (buf[3] == '0') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it low&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) &amp;amp;= ~(1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (buf[3] == '1') {&lt;br /&gt;
			// make the pin an output&lt;br /&gt;
			*(uint8_t *)(0x21 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			// drive it high&lt;br /&gt;
			*(uint8_t *)(0x22 + port * 3) |= (1 &amp;lt;&amp;lt; pin);&lt;br /&gt;
			return;&lt;br /&gt;
		} else {&lt;br /&gt;
			send_str(PSTR(&amp;quot;Unknown value \&amp;quot;&amp;quot;));&lt;br /&gt;
			usb_serial_putchar(buf[3]);&lt;br /&gt;
			send_str(PSTR(&amp;quot;\&amp;quot;, must be 0 or 1\r\n&amp;quot;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	// otherwise, error message&lt;br /&gt;
	send_str(PSTR(&amp;quot;Unknown command \&amp;quot;&amp;quot;));&lt;br /&gt;
	usb_serial_putchar(buf[0]);&lt;br /&gt;
	send_str(PSTR(&amp;quot;\&amp;quot;, must be ? or =\r\n&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante fin}}&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=15370</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=15370"/>
				<updated>2021-07-21T12:56:39Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
Il est simple de réaliser un compteur/décompteur avec des LPM. Si on veut le faire en VHDL, cela a été fait avec un compteur/décompteur décimal en exercice 4 du TP 5.&lt;br /&gt;
&lt;br /&gt;
Ainsi, &lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	     if EN='1' then&lt;br /&gt;
	       if du='1' then&lt;br /&gt;
	         if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	         end if;&lt;br /&gt;
		    else &lt;br /&gt;
	         if cmpt=&amp;quot;0000&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;1001&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt - 1;&lt;br /&gt;
	         end if;	&lt;br /&gt;
          end if;&lt;br /&gt;
        end if;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
doit se simplifier en :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if(rising_edge(Clock)) then&lt;br /&gt;
        if EN='1' then&lt;br /&gt;
          if du='1' then&lt;br /&gt;
            cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
          else&lt;br /&gt;
            cmpt &amp;lt;= cmpt - 1;	&lt;br /&gt;
          end if; --if du='1'&lt;br /&gt;
        end if; --if EN='1'&lt;br /&gt;
     end if;-- if(rising_edge(Clock))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
si on retire la gestion du reset. La gestion du '''EN''' pourrait elle aussi être retirée.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_5_Corr&amp;diff=15369</id>
		<title>Cours:TP M1102 TP 5 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_5_Corr&amp;diff=15369"/>
				<updated>2021-07-21T12:55:49Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=TP 5=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
L'exercice 1 a déjà été corrigé dans [[Cours:TP_M1102_TP_4_Corr|Corrigé du TP4 (Exercice 4)]]. Il ne sera donc réalisé en TP5 que s'il ne l'a pas été en TP 4.&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
===Question 1===&lt;br /&gt;
On vous présente plusieurs corrections de cet exercice. L'enseignant les présentera toutes ou en choisira quelques unes.&lt;br /&gt;
&lt;br /&gt;
Comme on utilise le même fichier de contraintes dans les trois façons de faire ci-dessous, on vous donne ce fichier ici :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Leds8[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Première façon : on fait tout soi-même====&lt;br /&gt;
Le compteur 8 bits utilisé ici était donné dans le TP4. On a simplement modifié le nom de son horloge.&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  Leds8: OUT std_logic_vector(7 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT cmpt8bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));&lt;br /&gt;
END COMPONENT cmpt8bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : cmpt8bits PORT MAP (&lt;br /&gt;
         clk =&amp;gt; s_horloge_lente,&lt;br /&gt;
	 cnt =&amp;gt; leds8);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 8 bits&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt8bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));&lt;br /&gt;
END cmpt8bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt8bits OF cmpt8bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(7 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt8bits;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Deuxième façon : on utilise les LPM====&lt;br /&gt;
&lt;br /&gt;
En principe les LPM ne sont présentés qu'en question 4. Nous en donnons ici une première utilisation.&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé correct le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
LIBRARY lpm; -- for LPM&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  Leds8: OUT std_logic_vector(7 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
&lt;br /&gt;
  -- LE FIL INTENE&lt;br /&gt;
  SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk,&lt;br /&gt;
            q(23) =&amp;gt; s_horloge_lente);&lt;br /&gt;
  -- compteur 8 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 8&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; s_horloge_lente,&lt;br /&gt;
            q =&amp;gt; Leds8);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Remarquez''' comme cette façon de faire est compacte. Mais on va vous présenter encore plus compact dans la suite.&lt;br /&gt;
&lt;br /&gt;
====Troisième façon : on remarque que le problème est de créer deux compteurs cascdés que l'on peut regrouper====&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé correct le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
LIBRARY lpm; -- for LPM&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  Leds8: OUT std_logic_vector(7 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
&lt;br /&gt;
  -- LE FIL INTENE&lt;br /&gt;
  SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 32&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk,&lt;br /&gt;
            q(31 downto 24) =&amp;gt; Leds8);  &lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non seulement cette façon de faire est la plus compacte, mais en plus c'est elle qui respecte au mieux les règles des horloges dans un FPGA.&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
Même s'il est intéressant pédagogiquement de présenter d'abord la question 2 puis la question 3, nous allons faire directement la correction de la question 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  HEX0,HEX1: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT cmpt8bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));&lt;br /&gt;
END COMPONENT cmpt8bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT transcod7segs;&lt;br /&gt;
&lt;br /&gt;
-- LES FILS INTERNES&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
SIGNAL s_cmpt8 : std_logic_vector(7 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : cmpt8bits PORT MAP (&lt;br /&gt;
         clk =&amp;gt; s_horloge_lente,&lt;br /&gt;
	 cnt =&amp;gt; s_cmpt8);&lt;br /&gt;
  i3 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_cmpt8(3 DOWNTO 0),&lt;br /&gt;
           s7segs =&amp;gt; HEX0);&lt;br /&gt;
  i4 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_cmpt8(7 DOWNTO 4),&lt;br /&gt;
           s7segs =&amp;gt; HEX1);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 8 bits&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt8bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));&lt;br /&gt;
END cmpt8bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt8bits OF cmpt8bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(7 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt8bits;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
-- transcodeur pour affichage 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et avec son fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Leds8[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX1[0],Unknown,PIN_C18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[1],Unknown,PIN_D18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[2],Unknown,PIN_E18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[3],Unknown,PIN_B16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[4],Unknown,PIN_A17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[5],Unknown,PIN_A18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[6],Unknown,PIN_B17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[7],Unknown,PIN_A16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
La question 4 qui utilise les LPM se trouve corrigée en question 1. Il suffit de remplacer les compteurs 24 et 8 bits par deux LPM ou mieux par un seul de 32 bits dans la correction de la question 3.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  HEX0: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
component CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
--         ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end component CounterBCD;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT transcod7segs;&lt;br /&gt;
&lt;br /&gt;
-- LES FILS INTERNES&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
SIGNAL s_digit0BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : CounterBCD PORT MAP (&lt;br /&gt;
         EN =&amp;gt; '1',&lt;br /&gt;
 	 Clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
 	 Reset =&amp;gt; '0',&lt;br /&gt;
--         ENO : out std_logic;&lt;br /&gt;
 	 Output =&amp;gt; s_digit0BCD);&lt;br /&gt;
&lt;br /&gt;
  i3 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit0BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX0);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 4 bits BCD&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
--         ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end CounterBCD;&lt;br /&gt;
 &lt;br /&gt;
architecture Behavioral of CounterBCD is&lt;br /&gt;
   signal cmpt: std_logic_vector(3 downto 0);&lt;br /&gt;
begin   process(Clock,Reset)&lt;br /&gt;
   begin&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	 if EN='1' then&lt;br /&gt;
	    if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	       cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	    else&lt;br /&gt;
	       cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	    end if;&lt;br /&gt;
         end if;&lt;br /&gt;
      end if;&lt;br /&gt;
   end process;&lt;br /&gt;
   Output &amp;lt;= cmpt;&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
-- transcodeur pour affichage 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Commençons par détailler le compteur BCD cascadable :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
         ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end CounterBCD;&lt;br /&gt;
 &lt;br /&gt;
architecture Behavioral of CounterBCD is&lt;br /&gt;
   signal cmpt: std_logic_vector(3 downto 0);&lt;br /&gt;
   SIGNAL s_en_cmpt : std_logic_vector(4 downto 0);&lt;br /&gt;
begin   &lt;br /&gt;
  process(Clock,Reset) begin&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	 if EN='1' then&lt;br /&gt;
	    if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	       cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	    else&lt;br /&gt;
	       cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	    end if;&lt;br /&gt;
         end if;&lt;br /&gt;
      end if;&lt;br /&gt;
   end process;&lt;br /&gt;
   Output &amp;lt;= cmpt;&lt;br /&gt;
   s_en_cmpt &amp;lt;= en &amp;amp; cmpt; -- operateur '&amp;amp;' est une concatenation&lt;br /&gt;
  with s_en_cmpt select&lt;br /&gt;
    ENO &amp;lt;= '1' when &amp;quot;11001&amp;quot;, -- EN actif et on est arrivé à (1001)=9&lt;br /&gt;
           '0' when others;&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La réalisation du compteur BCD cascadable est primordiale et surtout la façon de faire est du VHDL correct. &lt;br /&gt;
* présence d'un signal d'entrée '''EN''' qui bloque le fonctionnement du compteur s'il est à 0&lt;br /&gt;
* présence d'un signal de sortie '''ENO''' qui passe à un lorque le compteur est arrivé à 9 (et s'il est autorisé à compter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Cascader des compteurs avec ce type de signaux consiste à relier la sortie '''ENO''' à l'entrée '''EN''' de l'étage suivant.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Venons-en maintenant au programme complet :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  HEX0,HEX1: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
component CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
         ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end component CounterBCD;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT transcod7segs;&lt;br /&gt;
&lt;br /&gt;
-- LES FILS INTERNES&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
SIGNAL s_digit0BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_digit1BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_eno : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : CounterBCD PORT MAP (&lt;br /&gt;
         EN =&amp;gt; '1',&lt;br /&gt;
 	      Clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
 	      Reset =&amp;gt; '0',&lt;br /&gt;
         ENO =&amp;gt; s_eno,&lt;br /&gt;
 	      Output =&amp;gt; s_digit0BCD);&lt;br /&gt;
  i3 : CounterBCD PORT MAP (&lt;br /&gt;
         EN =&amp;gt; s_eno,&lt;br /&gt;
 	      Clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
 	      Reset =&amp;gt; '0',&lt;br /&gt;
         ENO =&amp;gt; open,&lt;br /&gt;
 	      Output =&amp;gt; s_digit1BCD);&lt;br /&gt;
  i4 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit0BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX0);&lt;br /&gt;
  i5 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit1BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX1);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 4 bits BCD&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
         ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end CounterBCD;&lt;br /&gt;
 &lt;br /&gt;
architecture Behavioral of CounterBCD is&lt;br /&gt;
   signal cmpt: std_logic_vector(3 downto 0);&lt;br /&gt;
	SIGNAL s_en_cmpt : std_logic_vector(4 downto 0);&lt;br /&gt;
begin   process(Clock,Reset)&lt;br /&gt;
   begin&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	 if EN='1' then&lt;br /&gt;
	    if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	       cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	    else&lt;br /&gt;
	       cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	    end if;&lt;br /&gt;
         end if;&lt;br /&gt;
      end if;&lt;br /&gt;
   end process;&lt;br /&gt;
   Output &amp;lt;= cmpt;&lt;br /&gt;
	s_en_cmpt &amp;lt;= en &amp;amp; cmpt; -- operateur '&amp;amp;' est une concatenation&lt;br /&gt;
  with s_en_cmpt select&lt;br /&gt;
    ENO &amp;lt;= '1' when &amp;quot;11001&amp;quot;,&lt;br /&gt;
           '0' when others;&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
-- transcodeur pour affichage 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
&lt;br /&gt;
===Première version : on écrit absolument tout en VHDL===&lt;br /&gt;
&lt;br /&gt;
Seule la gestion de la sortie '''ENO''' est plus complexe dans un compteur/décompteur. Mais les étudiants disposent d'un lien qui leur donne la solution. Voici donc le programme complet :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Testé OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  DU : in std_logic; -- down / up = 0 / 1&lt;br /&gt;
  HEX0,HEX1: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
component CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
	 du: in std_logic;&lt;br /&gt;
    ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end component CounterBCD;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT transcod7segs;&lt;br /&gt;
&lt;br /&gt;
-- LES FILS INTERNES&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
SIGNAL s_digit0BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_digit1BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_eno : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : CounterBCD PORT MAP (&lt;br /&gt;
         EN =&amp;gt; '1',&lt;br /&gt;
			du =&amp;gt; DU,&lt;br /&gt;
 	      Clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
 	      Reset =&amp;gt; '0',&lt;br /&gt;
         ENO =&amp;gt; s_eno,&lt;br /&gt;
 	      Output =&amp;gt; s_digit0BCD);&lt;br /&gt;
  i3 : CounterBCD PORT MAP (&lt;br /&gt;
         EN =&amp;gt; s_eno,&lt;br /&gt;
			du =&amp;gt; DU,&lt;br /&gt;
 	      Clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
 	      Reset =&amp;gt; '0',&lt;br /&gt;
         ENO =&amp;gt; open,&lt;br /&gt;
 	      Output =&amp;gt; s_digit1BCD);&lt;br /&gt;
&lt;br /&gt;
  i4 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit0BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX0);&lt;br /&gt;
  i5 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit1BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX1);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 4 bits BCD&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity CounterBCD is&lt;br /&gt;
   port( EN: in std_logic;&lt;br /&gt;
 	 Clock: in std_logic;&lt;br /&gt;
 	 Reset: in std_logic;&lt;br /&gt;
	 du: in std_logic;&lt;br /&gt;
    ENO : out std_logic;&lt;br /&gt;
 	 Output: out std_logic_vector(3 downto 0));&lt;br /&gt;
end CounterBCD;&lt;br /&gt;
 &lt;br /&gt;
architecture Behavioral of CounterBCD is&lt;br /&gt;
   signal cmpt: std_logic_vector(3 downto 0);&lt;br /&gt;
	signal s_en_cmpt:  std_logic_vector(5 downto 0);&lt;br /&gt;
begin   process(Clock,Reset)&lt;br /&gt;
   begin&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	     if EN='1' then&lt;br /&gt;
	       if du='1' then&lt;br /&gt;
	         if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	         end if;&lt;br /&gt;
		    else &lt;br /&gt;
	         if cmpt=&amp;quot;0000&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;1001&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt - 1;&lt;br /&gt;
	         end if;	&lt;br /&gt;
          end if;&lt;br /&gt;
        end if;&lt;br /&gt;
     end if;&lt;br /&gt;
   end process;&lt;br /&gt;
	-- sortie du comptage&lt;br /&gt;
   Output &amp;lt;= cmpt;&lt;br /&gt;
	-- gestion combinatoire de la sortie ENO&lt;br /&gt;
   s_en_cmpt &amp;lt;= en &amp;amp; du &amp;amp; cmpt;&lt;br /&gt;
   with s_en_cmpt select&lt;br /&gt;
     ENO &amp;lt;= '1' when &amp;quot;111001&amp;quot;,&lt;br /&gt;
	         '1' when &amp;quot;100000&amp;quot;,&lt;br /&gt;
            '0' when others;&lt;br /&gt;
				&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
-- transcodeur pour affichage 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ainsi que le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
DU,Input,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Leds8[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Leds8[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX1[0],Unknown,PIN_C18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[1],Unknown,PIN_D18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[2],Unknown,PIN_E18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[3],Unknown,PIN_B16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[4],Unknown,PIN_A17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[5],Unknown,PIN_A18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[6],Unknown,PIN_B17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Deuxième version en LPM===&lt;br /&gt;
L'utilisation des LPM pour faire compteur décompteur est simple. Mais pour les cascader vous êtes obligé de faire un travail combinatoire par vous-même. Ce qui diminue franchement sa simplicité.&lt;br /&gt;
&lt;br /&gt;
Voici le programme en LPM BCD (uniquement pour les compteur BCD):&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
-- testé OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
LIBRARY lpm; -- for LPM&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  DU : in std_logic; -- down / up = 0 / 1&lt;br /&gt;
  EN : in std_logic;&lt;br /&gt;
  HEX0,HEX1: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
COMPONENT transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT transcod7segs;&lt;br /&gt;
&lt;br /&gt;
-- LES FILS INTERNES&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
SIGNAL s_digit0BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_digit1BCD : std_logic_vector(3 downto 0);&lt;br /&gt;
signal s_en_cmpt:  std_logic_vector(3 downto 0);&lt;br /&gt;
SIGNAL s_eno,s_eno0, s_eno9 : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
  i2 : lpm_counter GENERIC MAP (&lt;br /&gt;
    LPM_WIDTH =&amp;gt; 4,&lt;br /&gt;
    LPM_MODULUS =&amp;gt; 10 -- pour BCD&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (&lt;br /&gt;
    CLOCK =&amp;gt; s_horloge_lente,&lt;br /&gt;
    updown =&amp;gt; DU,&lt;br /&gt;
    cnt_en =&amp;gt; EN,&lt;br /&gt;
    eq(9) =&amp;gt; s_eno9, -- détection de la valeur 9&lt;br /&gt;
    eq(0) =&amp;gt; s_eno0, -- détection de la valeur 0&lt;br /&gt;
    q =&amp;gt; s_digit0BCD);	&lt;br /&gt;
 &lt;br /&gt;
-- **** voici le calcul combinatoire à faire pour cascader : *****&lt;br /&gt;
    s_en_cmpt &amp;lt;= en &amp;amp; DU &amp;amp; s_eno9 &amp;amp; s_eno0;&lt;br /&gt;
    with s_en_cmpt select&lt;br /&gt;
     s_eno &amp;lt;= '1' when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              '1' when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              '0' when others;&lt;br /&gt;
-- fin du calcul&lt;br /&gt;
  i3 : lpm_counter GENERIC MAP (&lt;br /&gt;
    LPM_WIDTH =&amp;gt; 4,&lt;br /&gt;
    LPM_MODULUS =&amp;gt; 10 -- pour BCD&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (&lt;br /&gt;
    CLOCK =&amp;gt; s_horloge_lente,&lt;br /&gt;
    cnt_en =&amp;gt; s_eno,&lt;br /&gt;
    updown =&amp;gt; DU,&lt;br /&gt;
    q =&amp;gt; s_digit1BCD);	&lt;br /&gt;
&lt;br /&gt;
  i4 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit0BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX0);&lt;br /&gt;
  i5 : transcod7segs PORT MAP(&lt;br /&gt;
           e =&amp;gt; s_digit1BCD,&lt;br /&gt;
           s7segs =&amp;gt; HEX1);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
-- transcodeur pour affichage 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  e : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a ajouté la ligne :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EN,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
aux contraintes.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_4_Corr&amp;diff=15368</id>
		<title>Cours:TP M1102 TP 4 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_4_Corr&amp;diff=15368"/>
				<updated>2021-07-21T12:55:13Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP 4=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
Voici donc le compteur qui divise la fréquence. Il est bon de savoir calculer par avance la fréquence de ce genre de compteur :&lt;br /&gt;
* compteur 1 bit divise par deux&lt;br /&gt;
* compteur 2 bits divise par 4 = 2^2&lt;br /&gt;
* compteur 3 bits divise par 8 = 2^3&lt;br /&gt;
* ....&lt;br /&gt;
*compteur 24 bits (b23,b22,...,b1,b0) divise par 2^24 soit 50000000/2^24 = 2,98 Hz&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le petit fichier de contrainte peut être exprimé par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50MHz,Input,PIN_P11,,,PIN_P11,3.3-V LVTTL,,,,,&lt;br /&gt;
clk_slow,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme VHDL complet qui comprend deux composants reliés ensemble pour en faire un troisième :&lt;br /&gt;
* composant diviseur de fréquence le l'exercice 1&lt;br /&gt;
* composant diagramme d'évolution demandé dans l'énoncé&lt;br /&gt;
* composant global pour les tests visuels à l’œil&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  q0,q1: OUT std_logic);&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les somposants :&lt;br /&gt;
COMPONENT cmpt_exo2 IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  q0,q1: OUT std_logic);&lt;br /&gt;
END COMPONENT cmpt_exo2;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_hologe_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
    clk_50MHz =&amp;gt; clk,&lt;br /&gt;
	 clk_slow =&amp;gt; s_hologe_lente);&lt;br /&gt;
  i2 : cmpt_exo2 PORT MAP (&lt;br /&gt;
    clk =&amp;gt; s_hologe_lente,&lt;br /&gt;
	 q0 =&amp;gt; q0,&lt;br /&gt;
    q1 =&amp;gt; q1);&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- diagramme d'évolution demandé&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
ENTITY cmpt_exo2 IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  q0,q1: OUT std_logic);&lt;br /&gt;
END cmpt_exo2;&lt;br /&gt;
ARCHITECTURE arch_cmpt_exo2 OF cmpt_exo2 IS&lt;br /&gt;
  SIGNAL q1q0 : std_logic_vector(1 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  PROCESS (clk) BEGIN -- ou cmpt:PROCESS (clk) BEGIN&lt;br /&gt;
    IF (clk'EVENT AND clk='1') THEN&lt;br /&gt;
      q1q0(0) &amp;lt;= NOT q1q0(0);&lt;br /&gt;
      -- add the second equation here&lt;br /&gt;
		q1q0(1) &amp;lt;= q1q0(0) XOR q1q0(1);&lt;br /&gt;
    END IF;&lt;br /&gt;
  END PROCESS;&lt;br /&gt;
  -- mise a jour des sorties&lt;br /&gt;
  q0 &amp;lt;= q1q0(0);&lt;br /&gt;
  q1 &amp;lt;= q1q0(1);&lt;br /&gt;
END arch_cmpt_exo2;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour compléter voici le fichier de contraintes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,PIN_P11,3.3-V LVTTL,,,,,&lt;br /&gt;
q0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
q1,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Un peu long à faire avec des étudiants pour trouver les équations de récurrences. Une version plus simple à réaliser est donnée dans l'exercice suivant.&lt;br /&gt;
&lt;br /&gt;
Voici quand même le &lt;br /&gt;
&lt;br /&gt;
; tableau État présent/État futur&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot;|État présent||colspan=&amp;quot;7&amp;quot;|État futur&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''g'''||'''f'''||'''e'''||'''d'''||'''c'''||'''b'''||'''a'''||'''g+'''||'''f+'''||'''e+'''||'''d+'''||'''c+'''||'''b+'''||'''a+'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0||0||0||1||1||1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||0||0||1||0||1||0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||1||0||0||0||1||1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0||0||0||0||0||1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0||0||1||0||0||1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0||1||0||0||0||0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0||1||0||1||1||1||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||0||0||0||0||0||0||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0||0||0||0||0||1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0||0||0||1||0||0||0||0||0||0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour simplifier l'écriture des équations de récurrences, nous allons utiliser des notations intermédiaires. Ne disposant pas de la possibilité d'écrire les équations logiques correctement dans ce WIKI, nous allons les écrire en VHDL :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
zero &amp;lt;= g and not f and not e and not d and not c and not b and not a;     --&amp;quot;1000000&amp;quot; pour allumer 0&lt;br /&gt;
un &amp;lt;= g and f and e and d and not c and not b and a;                       --&amp;quot;1111001&amp;quot; pour allumer 1&lt;br /&gt;
deux &amp;lt;= not g and f and not e and not d and c and not b and not a;         --&amp;quot;0100100&amp;quot; pour allumer 2&lt;br /&gt;
trois &amp;lt;= not g and f and e and not d and not c and not b and not a;        --&amp;quot;0110000&amp;quot; pour allumer 3&lt;br /&gt;
quatre &amp;lt;= not g and not f and e and d and not c and not b and  a;          --&amp;quot;0011001&amp;quot; pour allumer 4&lt;br /&gt;
cinq &amp;lt;= not g and not f and e and not d and not c and b and not a;         --&amp;quot;0010010&amp;quot; pour allumer 5&lt;br /&gt;
six &amp;lt;= not g and not f and not e and not d and not c and b and not a;      --&amp;quot;0000010&amp;quot; pour allumer 6&lt;br /&gt;
sept &amp;lt;= g and f and e and d and not c and not b and not a;                 --&amp;quot;1111000&amp;quot; pour allumer 7&lt;br /&gt;
huit &amp;lt;= not g and not f and not e and not d and not c and not b and not a; --&amp;quot;0000000&amp;quot; pour allumer 8&lt;br /&gt;
neuf &amp;lt;= not g and not f and e and not d and not c and not b and not a;     --&amp;quot;0010000&amp;quot; pour allumer 9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le composant compteur sept segments avec des équations de récurrences :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Compteur 7 segments&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL; &lt;br /&gt;
ENTITY cmpt7seg IS&lt;br /&gt;
  PORT(CLK_lent : IN STD_LOGIC;&lt;br /&gt;
  a,b,c,d,e,f,g : INOUT STD_LOGIC);&lt;br /&gt;
-- ou  alors : s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END cmpt7seg;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_cmpt7seg of cmpt7seg is&lt;br /&gt;
  signal zero,un,deux,trois,quatre,cinq,six,sept,huit,neuf : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  zero &amp;lt;= g and not f and not e and not d and not c and not b and not a;     --&amp;quot;1000000&amp;quot; pour allumer 0&lt;br /&gt;
  un &amp;lt;= g and f and e and d and not c and not b and a;                       --&amp;quot;1111001&amp;quot; pour allumer 1&lt;br /&gt;
  deux &amp;lt;= not g and f and not e and not d and c and not b and not a;         --&amp;quot;0100100&amp;quot; pour allumer 2&lt;br /&gt;
  trois &amp;lt;= not g and f and e and not d and not c and not b and not a;        --&amp;quot;0110000&amp;quot; pour allumer 3&lt;br /&gt;
  quatre &amp;lt;= not g and not f and e and d and not c and not b and  a;          --&amp;quot;0011001&amp;quot; pour allumer 4&lt;br /&gt;
  cinq &amp;lt;= not g and not f and e and not d and not c and b and not a;         --&amp;quot;0010010&amp;quot; pour allumer 5&lt;br /&gt;
  six &amp;lt;= not g and not f and not e and not d and not c and b and not a;      --&amp;quot;0000010&amp;quot; pour allumer 6&lt;br /&gt;
  sept &amp;lt;= g and f and e and d and not c and not b and not a;                 --&amp;quot;1111000&amp;quot; pour allumer 7&lt;br /&gt;
  huit &amp;lt;= not g and not f and not e and not d and not c and not b and not a; --&amp;quot;0000000&amp;quot; pour allumer 8&lt;br /&gt;
  neuf &amp;lt;= not g and not f and e and not d and not c and not b and not a;     --&amp;quot;0010000&amp;quot; pour allumer 9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  PROCESS (clk_lent) BEGIN -- ou cmpt:PROCESS (clk) BEGIN&lt;br /&gt;
    IF (clk_lent'EVENT AND clk_lent='1') THEN&lt;br /&gt;
      g &amp;lt;= neuf OR zero OR six;&lt;br /&gt;
      f &amp;lt;= zero OR un OR deux OR six;&lt;br /&gt;
      e &amp;lt;= zero OR deux OR trois OR quatre OR six OR huit;&lt;br /&gt;
      d &amp;lt;= zero OR trois OR six;&lt;br /&gt;
      c &amp;lt;= un;&lt;br /&gt;
      b &amp;lt;= quatre OR cinq;&lt;br /&gt;
      a &amp;lt;= zero OR trois;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END PROCESS;&lt;br /&gt;
END arch_cmpt7seg;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Et voici donc le programme complet avec l'horloge lente :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  HEX0: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les somposants :&lt;br /&gt;
COMPONENT cmpt7seg IS&lt;br /&gt;
  PORT(CLK_lent : IN STD_LOGIC;&lt;br /&gt;
  a,b,c,d,e,f,g : OUT STD_LOGIC);&lt;br /&gt;
-- ou  alors : s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END COMPONENT cmpt7seg;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
    clk_50MHz =&amp;gt; clk,&lt;br /&gt;
	 clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : cmpt7seg PORT MAP (&lt;br /&gt;
    clk_lent =&amp;gt; s_horloge_lente,&lt;br /&gt;
	 a =&amp;gt; HEX0(0),&lt;br /&gt;
    b =&amp;gt; HEX0(1),&lt;br /&gt;
	 c =&amp;gt; HEX0(2),&lt;br /&gt;
	 d =&amp;gt; HEX0(3),&lt;br /&gt;
	 e =&amp;gt; HEX0(4),&lt;br /&gt;
	 f =&amp;gt; HEX0(5),&lt;br /&gt;
	 g =&amp;gt; HEX0(6));&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 7 segments&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL; &lt;br /&gt;
ENTITY cmpt7seg IS&lt;br /&gt;
  PORT(CLK_lent : IN STD_LOGIC;&lt;br /&gt;
  a,b,c,d,e,f,g : INOUT STD_LOGIC);&lt;br /&gt;
-- ou  alors : s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END cmpt7seg;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_cmpt7seg of cmpt7seg is&lt;br /&gt;
  signal zero,un,deux,trois,quatre,cinq,six,sept,huit,neuf : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  zero &amp;lt;= g and not f and not e and not d and not c and not b and not a;     --&amp;quot;1000000&amp;quot; pour allumer 0&lt;br /&gt;
  un &amp;lt;= g and f and e and d and not c and not b and a;                       --&amp;quot;1111001&amp;quot; pour allumer 1&lt;br /&gt;
  deux &amp;lt;= not g and f and not e and not d and c and not b and not a;         --&amp;quot;0100100&amp;quot; pour allumer 2&lt;br /&gt;
  trois &amp;lt;= not g and f and e and not d and not c and not b and not a;        --&amp;quot;0110000&amp;quot; pour allumer 3&lt;br /&gt;
  quatre &amp;lt;= not g and not f and e and d and not c and not b and  a;          --&amp;quot;0011001&amp;quot; pour allumer 4&lt;br /&gt;
  cinq &amp;lt;= not g and not f and e and not d and not c and b and not a;         --&amp;quot;0010010&amp;quot; pour allumer 5&lt;br /&gt;
  six &amp;lt;= not g and not f and not e and not d and not c and b and not a;      --&amp;quot;0000010&amp;quot; pour allumer 6&lt;br /&gt;
  sept &amp;lt;= g and f and e and d and not c and not b and not a;                 --&amp;quot;1111000&amp;quot; pour allumer 7&lt;br /&gt;
  huit &amp;lt;= not g and not f and not e and not d and not c and not b and not a; --&amp;quot;0000000&amp;quot; pour allumer 8&lt;br /&gt;
  neuf &amp;lt;= not g and not f and e and not d and not c and not b and not a;     --&amp;quot;0010000&amp;quot; pour allumer 9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  PROCESS (clk_lent) BEGIN -- ou cmpt:PROCESS (clk) BEGIN&lt;br /&gt;
    IF (clk_lent'EVENT AND clk_lent='1') THEN&lt;br /&gt;
      g &amp;lt;= neuf OR zero OR six;&lt;br /&gt;
      f &amp;lt;= zero OR un OR deux OR six;&lt;br /&gt;
      e &amp;lt;= zero OR deux OR trois OR quatre OR six OR huit;&lt;br /&gt;
      d &amp;lt;= zero OR trois OR six;&lt;br /&gt;
      c &amp;lt;= un;&lt;br /&gt;
      b &amp;lt;= quatre OR cinq;&lt;br /&gt;
      a &amp;lt;= zero OR trois;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END PROCESS;&lt;br /&gt;
END arch_cmpt7seg;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le compilateur de Quartus permet le mélange des &amp;quot;INOUT&amp;quot; et &amp;quot;OUT&amp;quot; comme cela est fait ici :&lt;br /&gt;
* un INOUT dans l'entité&lt;br /&gt;
* un OUT dans la déclaration du composant associé à l'entité ci-dessus&lt;br /&gt;
* un OUT dans le composant global&lt;br /&gt;
'''&amp;lt;big&amp;gt;Tous les compilateurs ne permettent pas cela !!! &amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici pour finir le fichier de contraintes csv associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,PIN_P11,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il suffit de forcer l'affichage de zéro quand on active l'entrée Init. Les équations de récurrences sont alors changées comme ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
  PROCESS (clk_lent) BEGIN -- ou cmpt:PROCESS (clk) BEGIN&lt;br /&gt;
    IF (clk_lent'EVENT AND clk_lent='1') THEN&lt;br /&gt;
      g &amp;lt;= neuf OR zero OR six OR Init;&lt;br /&gt;
      f &amp;lt;= (zero OR un OR deux OR six) AND NOT INIT;&lt;br /&gt;
      e &amp;lt;= (zero OR deux OR trois OR quatre OR six OR huit) AND NOT INIT;&lt;br /&gt;
      d &amp;lt;= (zero OR trois OR six) AND NOT INIT;&lt;br /&gt;
      c &amp;lt;= un AND NOT INIT;&lt;br /&gt;
      b &amp;lt;= (quatre OR cinq) AND NOT INIT;&lt;br /&gt;
      a &amp;lt;= (zero OR trois) AND NOT INIT;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END PROCESS;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ainsi quand Init passe à un, g passe à 1 (à cause du OU Init) tandis que f,e,d,c,b et a passent à 0 ( à cause du &amp;quot;et not init&amp;quot;) ce qui éteint seulement g et donc affiche 0 !&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
Cette façon de procéder est beaucoup plus rapide que celle de l'exercice 3. Il n'y a pas besoin des équations de récurrence mais seulement du diagramme d'évolution.&lt;br /&gt;
&lt;br /&gt;
On vous donne le programme global comportant le compteur 24 bits pour réaliser une horloge lente et le compteur direct sept segments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY compteur IS PORT (&lt;br /&gt;
  clk: IN std_logic;&lt;br /&gt;
  HEX0: OUT std_logic_vector(6 downto 0));&lt;br /&gt;
END compteur;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_compteur OF compteur IS&lt;br /&gt;
-- les somposants :&lt;br /&gt;
COMPONENT cmpt7seg IS&lt;br /&gt;
  PORT(CLK : IN STD_LOGIC;&lt;br /&gt;
    s_7segs : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));&lt;br /&gt;
END COMPONENT cmpt7seg;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
    clk_50MHz =&amp;gt; clk,&lt;br /&gt;
	 clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : cmpt7seg PORT MAP (&lt;br /&gt;
    clk_lent =&amp;gt; s_horloge_lente,&lt;br /&gt;
	 a =&amp;gt; HEX0(0),&lt;br /&gt;
         b =&amp;gt; HEX0(1),&lt;br /&gt;
	 c =&amp;gt; HEX0(2),&lt;br /&gt;
	 d =&amp;gt; HEX0(3),&lt;br /&gt;
	 e =&amp;gt; HEX0(4),&lt;br /&gt;
	 f =&amp;gt; HEX0(5),&lt;br /&gt;
	 g =&amp;gt; HEX0(6));&lt;br /&gt;
END arch_compteur;&lt;br /&gt;
&lt;br /&gt;
-- Compteur 7 segments&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY cmpt7seg IS&lt;br /&gt;
  PORT(CLK : IN STD_LOGIC;&lt;br /&gt;
    s_7segs : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));&lt;br /&gt;
END cmpt7seg;&lt;br /&gt;
ARCHITECTURE arch OF cmpt7seg IS -- comment éviter les equations&lt;br /&gt;
  SIGNAL s7segs : STD_LOGIC_VECTOR(6 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  PROCESS(clk) BEGIN&lt;br /&gt;
    IF (clk'EVENT AND clk='1') THEN&lt;br /&gt;
     CASE s7segs is --style case when&lt;br /&gt;
       WHEN &amp;quot;1000000&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;1111001&amp;quot;; -- premiere transition &lt;br /&gt;
       WHEN &amp;quot;1111001&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0100100&amp;quot;; -- deuxieme transition&lt;br /&gt;
       WHEN &amp;quot;0100100&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0110000&amp;quot;; -- troisieme transition&lt;br /&gt;
       WHEN &amp;quot;0110000&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0011001&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;0011001&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0010010&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;0010010&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0000010&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;0000010&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;1111000&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;1111000&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0000000&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;0000000&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;0010000&amp;quot;;&lt;br /&gt;
       WHEN &amp;quot;0010000&amp;quot; =&amp;gt; s7segs &amp;lt;=&amp;quot;1000000&amp;quot;; -- dernière transition&lt;br /&gt;
-- dans tous les autres cas on revient sur 8 ce qui utilise 42 LE contre 45 LE pour bouclage à 0 !!!!&lt;br /&gt;
       WHEN OTHERS =&amp;gt; s7segs &amp;lt;=&amp;quot;0000000&amp;quot;; &lt;br /&gt;
     END CASE;&lt;br /&gt;
   END IF;&lt;br /&gt;
  END PROCESS;&lt;br /&gt;
  s_7segs &amp;lt;=s7segs;&lt;br /&gt;
END arch;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Réaliser un compteur binaire ou décimal avec affichage sur digit(s) sept segments sera une opération classique dans la suite des TPs. Pourtant la technique que l'on utilisera ne sera pas celle qui est présentée ici. Elle sera en général composée de deux composants, un compteur et un transcodeur d'affichage. L'intérêt de cet exercice est donc purement pédagogique !'''&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=15367</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=15367"/>
				<updated>2021-07-21T12:54:04Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(3));                     &lt;br /&gt;
END arch_add4;&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout); -- câblé mais inutile dans XS3&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_2_Corr&amp;diff=15366</id>
		<title>Cours:TP M1102 TP 2 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_2_Corr&amp;diff=15366"/>
				<updated>2021-07-21T12:53:04Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP2=&lt;br /&gt;
==Exercice 1 : Multiplieur de deux nombres de 2 bits==&lt;br /&gt;
Si X est un nombre sur 2 bits (X1,X0)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, Y est un nombre sur 2 bits (Y1,Y0)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; alors le réultat Z est un nombre sur 4 bits (Z3,Z2,Z1,Z0)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;. En effet, X et Y qui sont donc sur 2 bits peuvent varier entre 0 et 3 et donc leur produit Z entre 0 et 9 ce qui est un nombre sur 4 bits.&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;4&amp;quot;|Sorties||Résultat numérique &lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;|X||colspan=&amp;quot;2&amp;quot;|Y||colspan=&amp;quot;4&amp;quot;|Z||Z = X x Y &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''X1'''||'''X0'''||'''Y1'''||'''Y0'''||'''Z3'''||'''Z2'''||'''Z1'''||'''Z0'''||&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0||0||0||0||0 = 0 x 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0||0||0||0||0 = 0 x 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0||0||0||0||0 = 0 x 2&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0||0||0||0||0 = 0 x 3&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0||0||0||0||0 = 1 x 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0||0||0||1||1 = 1 x 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0||0||1||0||2 = 1 x 2&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0||0||1||1||3 = 1 x 3&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0||0||0||0||0 = 2 x 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0||0||1||0||2 = 2 x 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||0||1||0||0||4 = 2 x 2&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||0||1||1||0||6 = 2 x 3&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||0||0||0||0||0 = 3 x 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||0||0||1||1||3 = 3 x 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||0||1||1||0||6 = 3 x 2&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1||0||0||1||9 = 3 x 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL correspondant est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- verifié le 18/09/20 pas S. Moutou&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY multiplier IS PORT(&lt;br /&gt;
  X,Y : in std_logic_vector(1 downto 0);&lt;br /&gt;
  Z : out std_logic_vector(3 downto 0));&lt;br /&gt;
END multiplier;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of multiplier IS &lt;br /&gt;
  signal entrees : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- construction de entrées :&lt;br /&gt;
  entrees &amp;lt;= Y &amp;amp; X;&lt;br /&gt;
  -- Table de vérité&lt;br /&gt;
  with entrees select&lt;br /&gt;
    Z &amp;lt;= &amp;quot;0000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
         &amp;quot;0001&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
         &amp;quot;0010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
         &amp;quot;0011&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
         &amp;quot;0010&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
         &amp;quot;0100&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
         &amp;quot;0110&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
         &amp;quot;0000&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
         &amp;quot;0011&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
         &amp;quot;0110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
         &amp;quot;1001&amp;quot; when others;&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
X[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
X[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
Y[0],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Y[1],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Z[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
Z[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Z[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Z[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2 : Transcodeur binaire 7 segments==&lt;br /&gt;
Si l'on vous demande de lire attentivement la première ligne de la table de vérité, c'est simplement pour vous faire constater qu'un '''zéro''' se fait en éteignant le segment 'g' et que donc pour éteindre un segment il faut lui mettre un 1 logique ce qui permet de déduire que pour allumer un segment il faut mettre un 0 logique.&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;7&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''sw3'''||'''sw2'''||'''sw1'''||'''sw0'''||'''g'''||'''f'''||'''e'''||'''d'''||'''c'''||'''b'''||'''a'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0|| 1 || 0 || 0 || 0 || 0 || 0 || 0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1|| 1 || 1 || 1 || 1 || 0 || 0 || 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0|| 0 || 1 || 0 || 0 || 1 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1|| 0 || 1 || 1 || 0 || 0 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0|| 0 || 0 || 1 || 1 || 0 || 0 || 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1|| 0 || 0 || 1 || 0 || 0 || 1 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0|| 0 || 0 || 0 || 0 || 0 || 1 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1|| 1 || 1 || 1 || 1 || 0 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0|| 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1|| 0 || 0 || 1 || 0 || 0 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0|| 0 || 0 || 0 || 1 || 0 || 0 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1|| 0 || 0 || 0 || 0 || 0 || 1 || 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0|| 1 || 0 || 0 || 0 || 1 || 1 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1|| 0 || 1 || 0 || 0 || 0 || 0 || 1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0|| 0 || 0 || 0 || 0 || 1 || 1 || 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1|| 0 || 0 || 0 || 1 || 1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Et voici un programme VHDL de correction qui n'utilise que des '''std_logic''' dans l'entité :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- vérifié le 28/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  sw0,sw1,sw2,sw3 : in std_logic; -- 4 entrées&lt;br /&gt;
  g,f,e,d,c,b,a : out std_logic); -- 7 sorties&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS&lt;br /&gt;
  signal entree4 : std_logic_vector(3 downto 0);&lt;br /&gt;
  signal s7segments : std_logic_vector(6 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- construction de l'entrée 4 bits&lt;br /&gt;
  entree4 &amp;lt;= sw3 &amp;amp; sw2 &amp;amp; sw1 &amp;amp; sw0;&lt;br /&gt;
  -- table de vérité avec with select when&lt;br /&gt;
  with entree4 select&lt;br /&gt;
                --gfedcba&lt;br /&gt;
    s7segments &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
                 &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
                 &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
                 &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
                 &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
                 &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
                 &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
                 &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
                 &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
                 &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
                 &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
                 &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
                 &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
                 &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
                 &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
                 &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
  -- construction des sorties individuelles&lt;br /&gt;
  a &amp;lt;= s7segments(0);&lt;br /&gt;
  b &amp;lt;= s7segments(1);&lt;br /&gt;
  c &amp;lt;= s7segments(2);&lt;br /&gt;
  d &amp;lt;= s7segments(3);&lt;br /&gt;
  e &amp;lt;= s7segments(4);&lt;br /&gt;
  f &amp;lt;= s7segments(5);&lt;br /&gt;
  g &amp;lt;= s7segments(6);&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
SW0,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
SW1,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
SW2,Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW3,Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
a,Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
b,Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
c,Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
d,Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
e,Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
f,Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
g,Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Il faudra lui préférer une version uniquement avec des std_logic_vectors'''&amp;lt;/big&amp;gt; qui est en général plus facile à câbler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcod7segs IS PORT(&lt;br /&gt;
  sw : in std_logic_vector(3 downto 0);&lt;br /&gt;
  s7segs : out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcod7segs;&lt;br /&gt;
ARCHITECTURE arch of transcod7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with sw select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    s7segs &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
              &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
              &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
              &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
              &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
              &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
              &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
              &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
              &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
              &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
              &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
              &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
              &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
              &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
              &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Son fichier  '''csv''' de containtes est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s7segs[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segs[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3 Transcodeur pour dé==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Les entrées &amp;quot;tout le monde à 0&amp;quot; et &amp;quot;tout le monde à 1&amp;quot; ne sortent aucun affichage (toutes les leds éteintes)&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;7&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e2'''||'''e1'''||'''e0'''||'''D7'''||'''D6'''||'''D5'''||'''D4'''||'''D3'''||'''D2'''||'''D1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0||0||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0||0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0||0||0||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0||0||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0||1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||0||1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1||1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||0||0||0||0||0||0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20 par S.Moutou&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY transcodDE IS PORT(&lt;br /&gt;
  sw : in std_logic_vector(2 downto 0);&lt;br /&gt;
  D : out std_logic_vector(7 downto 1));&lt;br /&gt;
END transcodDE;&lt;br /&gt;
ARCHITECTURE arch of transcodDE IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with sw select&lt;br /&gt;
      -- D7.....D1&lt;br /&gt;
    D &amp;lt;= &amp;quot;0000000&amp;quot; when &amp;quot;000&amp;quot;,&lt;br /&gt;
         &amp;quot;0001000&amp;quot; when &amp;quot;001&amp;quot;,&lt;br /&gt;
         &amp;quot;1000001&amp;quot; when &amp;quot;010&amp;quot;,&lt;br /&gt;
         &amp;quot;1001001&amp;quot; when &amp;quot;011&amp;quot;,&lt;br /&gt;
         &amp;quot;1010101&amp;quot; when &amp;quot;100&amp;quot;,&lt;br /&gt;
         &amp;quot;1011101&amp;quot; when &amp;quot;101&amp;quot;,&lt;br /&gt;
         &amp;quot;1110111&amp;quot; when &amp;quot;110&amp;quot;,&lt;br /&gt;
         &amp;quot;0000000&amp;quot; when others;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici maintenant le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
D[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
&lt;br /&gt;
Il est possible d'assembler deux &amp;quot;with select when&amp;quot; ensemble sans port map. Un couper/coller en adaptant les entrées et sorties fait l'affaire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20 par S. Moutou&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
-- ADAPTER l'entité au problème !!!!!!&lt;br /&gt;
ENTITY transcodDE7segs IS PORT(&lt;br /&gt;
  sw : in std_logic_vector(2 downto 0);&lt;br /&gt;
  D : out std_logic_vector(7 downto 1);&lt;br /&gt;
  s7segments: out std_logic_vector(6 downto 0));&lt;br /&gt;
END transcodDE7segs;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of transcodDE7segs IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  -- transcodeur du Dé&lt;br /&gt;
  with sw select&lt;br /&gt;
      -- D7.....D1&lt;br /&gt;
    D &amp;lt;= &amp;quot;0000000&amp;quot; when &amp;quot;000&amp;quot;,&lt;br /&gt;
         &amp;quot;0001000&amp;quot; when &amp;quot;001&amp;quot;,&lt;br /&gt;
         &amp;quot;1000001&amp;quot; when &amp;quot;010&amp;quot;,&lt;br /&gt;
         &amp;quot;1001001&amp;quot; when &amp;quot;011&amp;quot;,&lt;br /&gt;
         &amp;quot;1010101&amp;quot; when &amp;quot;100&amp;quot;,&lt;br /&gt;
         &amp;quot;1011101&amp;quot; when &amp;quot;101&amp;quot;,&lt;br /&gt;
         &amp;quot;1110111&amp;quot; when &amp;quot;110&amp;quot;,&lt;br /&gt;
         &amp;quot;0000000&amp;quot; when others;&lt;br /&gt;
-- Ajouter la deuxième partie maintenant&lt;br /&gt;
  -- transcodeur 7 segments&lt;br /&gt;
  with sw select&lt;br /&gt;
                 --gfedcba&lt;br /&gt;
    s7segments &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;000&amp;quot;,&lt;br /&gt;
                  &amp;quot;1111001&amp;quot; when &amp;quot;001&amp;quot;,&lt;br /&gt;
                  &amp;quot;0100100&amp;quot; when &amp;quot;010&amp;quot;,&lt;br /&gt;
                  &amp;quot;0110000&amp;quot; when &amp;quot;011&amp;quot;,&lt;br /&gt;
                  &amp;quot;0011001&amp;quot; when &amp;quot;100&amp;quot;,&lt;br /&gt;
                  &amp;quot;0010010&amp;quot; when &amp;quot;101&amp;quot;,&lt;br /&gt;
                  &amp;quot;0000010&amp;quot; when &amp;quot;110&amp;quot;,&lt;br /&gt;
                  &amp;quot;1111000&amp;quot; when others;&lt;br /&gt;
  &lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L'entée (000)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; n'affiche aucune led pour le dé mais affiche naturellement 0 sur l'afficheur sept segments.&lt;br /&gt;
*L'entée (111)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; n'affiche aucune led pour le dé mais affiche naturellement 7 sur l'afficheur sept segments.&lt;br /&gt;
&lt;br /&gt;
L'inconvénient de la méthode ci-dessus est que l'on modifie le code source du transcodeur pour l'adapter au problème très particulier que l'on cherche à résoudre. Ici on a amputé le &amp;quot;with select when&amp;quot; du transodeur 7 segments de la moitié de ses lignes. On lui préférera par la suite une méthode de câblage ('''PORT MAP''') qui adapte uniquement par câblage. On n'utilise pas le poids fort des entrées, alors on la câble à '0' et le compilateur fera les simplifications. C'est cette méthode que l'on utilisera dans l'exercice suivant, méthode qui nécessite un certain entraînement.&lt;br /&gt;
&lt;br /&gt;
Et voici maintenant le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
D[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
D[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s7segments[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
s7segments[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4 : transcodeur binaire sept segments sur deux digits==&lt;br /&gt;
{{Aide|Par quoi commence-t-on ?}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est dit dans l'énoncé, il existe plusieurs méthodes pour résoudre cet exercice. Il faut d'abord comprendre quelles sont les entrées et quelles sont les sorties. En clair, comme d'habitude on résout le problème de l'entité.&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
entity exo4a is port(&lt;br /&gt;
  sw : in std_logic_vector(7 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  hex0, hex1 : out std_logic_vector(6 downto 0)); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Il reste maintenant à réaliser les deux with select when dans l'architecture.&lt;br /&gt;
&lt;br /&gt;
'''Cette méthode qui consiste à gérer deux &amp;quot;with select when&amp;quot; séparés se fait facilement parce qu'en fait les deux &amp;quot;with select when&amp;quot; sont complètement indépendants.'''&lt;br /&gt;
{{finAide}}&lt;br /&gt;
&lt;br /&gt;
Voici donc le programme complet :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vérifié le 28/09/20 par S. Moutou&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity exo4a is port(&lt;br /&gt;
  sw : in std_logic_vector(7 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  hex0, hex1 : out std_logic_vector(6 downto 0)); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF exo4a IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  -- on commence par la gestion du transcodeur du poids faible&lt;br /&gt;
  with sw(3 downto 0) select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    hex0 &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
            &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
            &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
            &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
            &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
            &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
            &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
            &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
            &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
            &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
            &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
            &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
            &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
            &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
            &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
            &amp;quot;0001110&amp;quot; when others;&lt;br /&gt;
  -- on poursuit par la gestion du transcodeur du poids fort&lt;br /&gt;
  with sw(7 downto 4) select&lt;br /&gt;
             --gfedcba&lt;br /&gt;
    hex1 &amp;lt;= &amp;quot;1000000&amp;quot; when &amp;quot;0000&amp;quot;,&lt;br /&gt;
            &amp;quot;1111001&amp;quot; when &amp;quot;0001&amp;quot;,&lt;br /&gt;
            &amp;quot;0100100&amp;quot; when &amp;quot;0010&amp;quot;,&lt;br /&gt;
            &amp;quot;0110000&amp;quot; when &amp;quot;0011&amp;quot;,&lt;br /&gt;
            &amp;quot;0011001&amp;quot; when &amp;quot;0100&amp;quot;,&lt;br /&gt;
            &amp;quot;0010010&amp;quot; when &amp;quot;0101&amp;quot;,&lt;br /&gt;
            &amp;quot;0000010&amp;quot; when &amp;quot;0110&amp;quot;,&lt;br /&gt;
            &amp;quot;1111000&amp;quot; when &amp;quot;0111&amp;quot;,&lt;br /&gt;
            &amp;quot;0000000&amp;quot; when &amp;quot;1000&amp;quot;,&lt;br /&gt;
            &amp;quot;0010000&amp;quot; when &amp;quot;1001&amp;quot;,&lt;br /&gt;
            &amp;quot;0001000&amp;quot; when &amp;quot;1010&amp;quot;,&lt;br /&gt;
            &amp;quot;0000011&amp;quot; when &amp;quot;1011&amp;quot;,&lt;br /&gt;
            &amp;quot;1000110&amp;quot; when &amp;quot;1100&amp;quot;,&lt;br /&gt;
            &amp;quot;0100001&amp;quot; when &amp;quot;1101&amp;quot;,&lt;br /&gt;
            &amp;quot;0000110&amp;quot; when &amp;quot;1110&amp;quot;,&lt;br /&gt;
            &amp;quot;0001110&amp;quot; when others;  &lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le fichier de contrainte correspondant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[4],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[5],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[6],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[7],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[8],Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
SW[9],Unknown,PIN_F15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX1[0],Unknown,PIN_C18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[1],Unknown,PIN_D18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[2],Unknown,PIN_E18,6,B6_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[3],Unknown,PIN_B16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[4],Unknown,PIN_A17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[5],Unknown,PIN_A18,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX1[6],Unknown,PIN_B17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_1_Corr&amp;diff=15365</id>
		<title>Cours:TP M1102 TP 1 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_1_Corr&amp;diff=15365"/>
				<updated>2021-07-21T12:52:22Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=M1102 : TP1 : solutions=&lt;br /&gt;
==Exercice 0==&lt;br /&gt;
===Avec deuxième fichier pour les contraintes===&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity exo0tp1 is port (&lt;br /&gt;
  e0,e1 : IN std_logic;&lt;br /&gt;
  s_et,s_ou : OUT std_logic);&lt;br /&gt;
END entity;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF exo0tp1 IS&lt;br /&gt;
  SIGNAL s_e,s_s: std_logic_vector(1 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  s_e &amp;lt;= e1 &amp;amp; e0; -- A retenir : manière de regrouper des signaux&lt;br /&gt;
  s_et &amp;lt;= s_s(1);&lt;br /&gt;
  s_ou &amp;lt;= s_s(0);&lt;br /&gt;
  WITH s_e SELECT&lt;br /&gt;
    s_s &amp;lt;= &amp;quot;00&amp;quot; WHEN &amp;quot;00&amp;quot;,&lt;br /&gt;
           &amp;quot;01&amp;quot; WHEN &amp;quot;01&amp;quot;,&lt;br /&gt;
           &amp;quot;01&amp;quot; WHEN &amp;quot;10&amp;quot;,&lt;br /&gt;
           &amp;quot;11&amp;quot; WHEN others;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contrainte :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
e0,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e1,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
s_et,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s_ou,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Avec les contraintes dans le fichier VHDL===&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity exo0tp1 is port (&lt;br /&gt;
  e0,e1 : IN std_logic;&lt;br /&gt;
  s_et,s_ou : OUT std_logic);&lt;br /&gt;
END entity;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF exo0tp1 IS&lt;br /&gt;
  SIGNAL s_e,s_s: std_logic_vector(1 downto 0);&lt;br /&gt;
  attribute chip_pin : string;&lt;br /&gt;
  attribute chip_pin of e0 : signal is &amp;quot;c10&amp;quot;;&lt;br /&gt;
  attribute chip_pin of e1 : signal is &amp;quot;c11&amp;quot;;&lt;br /&gt;
  attribute chip_pin of s_et : signal is &amp;quot;a8&amp;quot;;&lt;br /&gt;
  attribute chip_pin of s_ou : signal is &amp;quot;a9&amp;quot;;&lt;br /&gt;
BEGIN&lt;br /&gt;
  s_e &amp;lt;= e1 &amp;amp; e0; -- A retenir : manière de regrouper des signaux&lt;br /&gt;
  s_et &amp;lt;= s_s(1);&lt;br /&gt;
  s_ou &amp;lt;= s_s(0);&lt;br /&gt;
  WITH s_e SELECT&lt;br /&gt;
    s_s &amp;lt;= &amp;quot;00&amp;quot; WHEN &amp;quot;00&amp;quot;,&lt;br /&gt;
           &amp;quot;01&amp;quot; WHEN &amp;quot;01&amp;quot;,&lt;br /&gt;
           &amp;quot;01&amp;quot; WHEN &amp;quot;10&amp;quot;,&lt;br /&gt;
           &amp;quot;11&amp;quot; WHEN others;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;3&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e2'''||'''e1'''||'''e0'''||'''a'''||'''b'''||'''s'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||0||1&lt;br /&gt;
|}&lt;br /&gt;
===Question 2 : Équation en VHDL===&lt;br /&gt;
Voici l'équation logique simplifiée :  y = e2.e1.e0 + /e2.&lt;br /&gt;
&lt;br /&gt;
'''Se rappeler qu'il n'y a pas de priorité des opérateurs en VHDL contrairement à l'algèbre de Boole, ce qui impose l'usage de parenthèses pour expliciter les priorités.'''&lt;br /&gt;
&lt;br /&gt;
Voici comment s'écrit l'équation en VHDL. On vous laisse écrire l'entité et l'architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
s &amp;lt;= (e2 and e1 and e0) or (not e2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Complétez tout ceci pour avoir l'architecture et l'entité :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
  signal a : std_logic_vector(2 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  a &amp;lt;= e2 &amp;amp; &amp;amp;e1 &amp;amp; e0;&lt;br /&gt;
  with a select&lt;br /&gt;
    s &amp;lt;= '0' when &amp;quot;100&amp;quot; | &amp;quot;101&amp;quot; | &amp;quot;110&amp;quot;,&lt;br /&gt;
         '1' when others;&lt;br /&gt;
-- plus efficace que le listing équivalent à la table de vérité&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2 : Vote au directoire==&lt;br /&gt;
Voici la table de vérité :&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sortie &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''d'''||'''c'''||'''b'''||'''a'''||'''v'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
Voici un morceau du programme VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vote au directoire&lt;br /&gt;
signal e : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  e &amp;lt;= d&amp;amp;c&amp;amp;b&amp;amp;a;&lt;br /&gt;
  with e select&lt;br /&gt;
    v &amp;lt;= '0' when x&amp;quot;0&amp;quot; | x&amp;quot;1&amp;quot; | x&amp;quot;2&amp;quot; | x&amp;quot;3&amp;quot; | x&amp;quot;4&amp;quot; | x&amp;quot;5&amp;quot; | x&amp;quot;6&amp;quot; | x&amp;quot;8&amp;quot;,&lt;br /&gt;
         '1' when others;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'après tableau de karnaugh, on a :&lt;br /&gt;
&lt;br /&gt;
v = a.b.c + d.c + d.a + d.b&lt;br /&gt;
&lt;br /&gt;
On peut analyser/confirmer la logique de cette expression. Si le directeur vote oui, il suffit d'un associé votant oui pour valider le vote. Si le directeur vote non, il faut les 3 associés pour valider le vote. Et cette expression inclue le cas où tout le monde vote oui.&lt;br /&gt;
&lt;br /&gt;
En VHDL, l'équation s'écrit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vote au directoire&lt;br /&gt;
s &amp;lt;= ( a and b and c) or (d and c) or ( d and b) or (d and a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3: Vote au directoire amélioré==&lt;br /&gt;
Voici la table de vérité :&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sortie &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''D'''||'''C'''||'''B'''||'''A'''||'''v'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voici un morceau du programme VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vote au directoire amélioré&lt;br /&gt;
signal e : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  e &amp;lt;= D&amp;amp;C&amp;amp;B&amp;amp;A;&lt;br /&gt;
  with e select&lt;br /&gt;
    v &amp;lt;= '1' when x&amp;quot;6&amp;quot; | x&amp;quot;7&amp;quot; | x&amp;quot;A&amp;quot; | x&amp;quot;B&amp;quot; | x&amp;quot;C&amp;quot; | x&amp;quot;D&amp;quot; | x&amp;quot;E&amp;quot; | x&amp;quot;F&amp;quot;,&lt;br /&gt;
         '0' when others;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'après tableau de karnaugh, on a :&lt;br /&gt;
&lt;br /&gt;
v = d.c + c.b + d.b&lt;br /&gt;
&lt;br /&gt;
On peut analyser/confirmer la logique de cette expression. Si le directeur vote oui, il suffit d'un associé votant oui pour valider le vote. Si le directeur vote non, il faut les 3 associés pour valider le vote. Et cette expression inclue le cas où tout le monde vote oui.&lt;br /&gt;
&lt;br /&gt;
En VHDL, l'équation s'écrit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Vote au directoire amélioré&lt;br /&gt;
s &amp;lt;= (d and c) or ( c and b) or (d and b);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ErB32019&amp;diff=14659</id>
		<title>Cours:ErB32019</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ErB32019&amp;diff=14659"/>
				<updated>2021-04-04T13:29:28Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Caractéristiques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Projet GPS tracker=&lt;br /&gt;
Ce que l'on cherche à réaliser est décrit dans cette vidéo : [https://www.youtube.com/watch?v=D20uSl_JHrk Arduino GPS tracker and Google Maps Tutorial] ou ce cours de 49mn : [https://www.youtube.com/watch?v=OsMoowoB2Rg LESSON 22: Build an Arduino GPS Tracker]&lt;br /&gt;
&lt;br /&gt;
=Propeller clock=&lt;br /&gt;
Ce projet est donné depuis un certain nombre d'années et va continuer encore cette année. Il se fera avec des Leds et non plus a bandeau de leds numérique (WS2812 rgb leds). Voir la vidéo : [https://www.youtube.com/watch?v=HYtftl7_pO0 Arduino NANO Propeller LED Analog Clock]&lt;br /&gt;
&lt;br /&gt;
Vous pouvez trouver aussi [https://www.electronicshub.org/pov-display-using-arduino/ un document explicatif] avec un peu de code. Une autre technique utilisant un registre à décalage 74HC595 [https://ijireeice.com/wp-content/uploads/2014/12/IJIREEICE-15.pdf est présentée ICI].&lt;br /&gt;
&lt;br /&gt;
Il vous est possible de choisir une autre technologie que le microcontrôleur, à savoir le FPGA.&lt;br /&gt;
&lt;br /&gt;
=Optical Flow=&lt;br /&gt;
Ce projet peut concerner un ou deux binômes mais alors en concurrence. Autrement dit, s'il y a deux binômes il y a deux projets différents.&lt;br /&gt;
&lt;br /&gt;
Ce que l'on cherche à faire est présenté dans cette vidéo : [https://www.youtube.com/watch?v=8P_5KFCGcTg Arduino based pan-tilt optical flow tracking] Vous disposerez de &lt;br /&gt;
* tourelle pan/tilt et ses servomoteurs&lt;br /&gt;
* Optical Flow Sensor APM2.5 improve position hold accuracy Multicopter ADNS 3080&lt;br /&gt;
* Ecran 2,8'&lt;br /&gt;
* microcontrôleur ou FPGA au choix&lt;br /&gt;
&lt;br /&gt;
Du code pour lire le composant ADNS 3080 peut être trouvé sur gitHub :&lt;br /&gt;
* [https://github.com/Lauszus/ADNS3080 ADNS3080]&lt;br /&gt;
* [https://github.com/Neumi/OpticalFlowA3080ArduinoProcessing Optical Flow A3080 Arduino and Processing]&lt;br /&gt;
==Caractéristiques du capteur==&lt;br /&gt;
*&amp;lt;b&amp;gt;Caractéristiques&amp;lt;/b&amp;gt; : ce capteur est basé sur le capteur de souris ADNS3080 qui est un bon choix pour le flux optique. &lt;br /&gt;
*&amp;lt;b&amp;gt;Haute résolution :&amp;lt;/b&amp;gt; images 30x30 pixels, ce qui signifie qu'il peut avoir des fonctionnalités que les petites souris ne peuvent pas avoir.&lt;br /&gt;
*&amp;lt;b&amp;gt;Haute vitesse :&amp;lt;/b&amp;gt; taux de mise à jour de 2000 à 6400 images par seconde, ce qui contribue à de meilleures performances de faible luminosité que les autres capteurs de souris.&lt;br /&gt;
* Interface SPI, ce qui signifie qu'elle peut être interfacée à de nombreux micro-contrôleurs et coexistent avec d'autres capteurs.&lt;br /&gt;
* Destiné à s'interfacer avec un microcontrôleur 5V.&lt;br /&gt;
* Objectif de 8mm avec FOV de 11 degrés.&lt;br /&gt;
* Monture d'objectif Standard M12x0.5, ce qui signifie que vous pouvez remplacer l'objectif facilement.&lt;br /&gt;
&lt;br /&gt;
Instruction d'utilisation:&lt;br /&gt;
* Il fonctionne bien dans les environnements extérieurs éclairés.&lt;br /&gt;
* Il ne fonctionne pas bien avec les lumières fluorescentes (le clignotement perturbe le capteur).&lt;br /&gt;
* Il faut une surface non uniforme pour voir le mouvement (les tapis unis ne sont pas son ami).&lt;br /&gt;
&lt;br /&gt;
==Solution intermédiaire : optical flow et écran avec MSP432==&lt;br /&gt;
&amp;lt;source lang=arduino&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*************************&lt;br /&gt;
* Carte SD ----- Launchpad&lt;br /&gt;
* TM4C123G (ARM)&lt;br /&gt;
* GND ----------- GND&lt;br /&gt;
* +3.3 ---------- Vcc&lt;br /&gt;
* CS ------------ PB5 (PB_5)&lt;br /&gt;
* MOSI ---------- PB7 (PB_7)&lt;br /&gt;
* SCK ----------- PB4 (PB_4)&lt;br /&gt;
* MISO ---------- PB6 (PB_6)&lt;br /&gt;
*&lt;br /&gt;
**************************/ &lt;br /&gt;
&lt;br /&gt;
//#define PIN_SS        PB_5&lt;br /&gt;
#define PIN_MISO      14&lt;br /&gt;
#define PIN_MOSI      15&lt;br /&gt;
#define PIN_SCK       7&lt;br /&gt;
&lt;br /&gt;
#define PIN_MOUSECAM_RESET     17&lt;br /&gt;
#define PIN_MOUSECAM_CS        18&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PIXELS_X                 30&lt;br /&gt;
#define ADNS3080_PIXELS_Y                 30&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PRODUCT_ID            0x00&lt;br /&gt;
#define ADNS3080_REVISION_ID           0x01&lt;br /&gt;
#define ADNS3080_MOTION                0x02&lt;br /&gt;
#define ADNS3080_DELTA_X               0x03&lt;br /&gt;
#define ADNS3080_DELTA_Y               0x04&lt;br /&gt;
#define ADNS3080_SQUAL                 0x05&lt;br /&gt;
#define ADNS3080_PIXEL_SUM             0x06&lt;br /&gt;
#define ADNS3080_MAXIMUM_PIXEL         0x07&lt;br /&gt;
#define ADNS3080_CONFIGURATION_BITS    0x0a&lt;br /&gt;
#define ADNS3080_EXTENDED_CONFIG       0x0b&lt;br /&gt;
#define ADNS3080_DATA_OUT_LOWER        0x0c&lt;br /&gt;
#define ADNS3080_DATA_OUT_UPPER        0x0d&lt;br /&gt;
#define ADNS3080_SHUTTER_LOWER         0x0e&lt;br /&gt;
#define ADNS3080_SHUTTER_UPPER         0x0f&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_LOWER    0x10&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_UPPER    0x11&lt;br /&gt;
#define ADNS3080_MOTION_CLEAR          0x12&lt;br /&gt;
#define ADNS3080_FRAME_CAPTURE         0x13&lt;br /&gt;
#define ADNS3080_SROM_ENABLE           0x14&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MAX_BOUND_LOWER      0x19&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MAX_BOUND_UPPER      0x1a&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MIN_BOUND_LOWER      0x1b&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MIN_BOUND_UPPER      0x1c&lt;br /&gt;
#define ADNS3080_SHUTTER_MAX_BOUND_LOWER           0x1e&lt;br /&gt;
#define ADNS3080_SHUTTER_MAX_BOUND_UPPER           0x1e&lt;br /&gt;
#define ADNS3080_SROM_ID               0x1f&lt;br /&gt;
#define ADNS3080_OBSERVATION           0x3d&lt;br /&gt;
#define ADNS3080_INVERSE_PRODUCT_ID    0x3f&lt;br /&gt;
#define ADNS3080_PIXEL_BURST           0x40&lt;br /&gt;
#define ADNS3080_MOTION_BURST          0x50&lt;br /&gt;
#define ADNS3080_SROM_LOAD             0x60&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PRODUCT_ID_VAL        0x17&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Basic Colors&lt;br /&gt;
#define RED  0xf800&lt;br /&gt;
#define GREEN   0x07e0&lt;br /&gt;
#define BLUE  0x001f&lt;br /&gt;
#define BLACK   0x0000&lt;br /&gt;
#define YELLOW  0xffe0&lt;br /&gt;
#define WHITE   0xffff&lt;br /&gt;
&lt;br /&gt;
//Other Colors&lt;br /&gt;
#define CYAN  0x07ff  &lt;br /&gt;
#define BRIGHT_RED  0xf810  &lt;br /&gt;
#define GRAY1   0x8410  &lt;br /&gt;
#define GRAY2   0x4208  &lt;br /&gt;
&lt;br /&gt;
//TFT resolution 240*320&lt;br /&gt;
#define MIN_X   0&lt;br /&gt;
#define MIN_Y   0&lt;br /&gt;
#define MAX_X   239&lt;br /&gt;
#define MAX_Y   319&lt;br /&gt;
&lt;br /&gt;
#define FONT_SPACE 6&lt;br /&gt;
#define FONT_X 8&lt;br /&gt;
#define FONT_Y 8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t simpleFont[][8] =&lt;br /&gt;
{&lt;br /&gt;
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},&lt;br /&gt;
  {0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},&lt;br /&gt;
  {0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},&lt;br /&gt;
  {0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},&lt;br /&gt;
  {0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},&lt;br /&gt;
  {0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},&lt;br /&gt;
  {0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},&lt;br /&gt;
  {0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},&lt;br /&gt;
  {0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},&lt;br /&gt;
  {0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},&lt;br /&gt;
  {0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},&lt;br /&gt;
  {0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},&lt;br /&gt;
  {0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},&lt;br /&gt;
  {0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},&lt;br /&gt;
  {0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},&lt;br /&gt;
  {0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void TFT_sendCMD(uint8_t index);&lt;br /&gt;
void TFT_WRITE_DATA(uint8_t data);&lt;br /&gt;
void TFT_sendData(uint16_t data);&lt;br /&gt;
void TFT_WRITE_Package(uint16_t *data, uint8_t howmany);&lt;br /&gt;
void TFT_backlight_on(void);&lt;br /&gt;
void TFT_backlight_off(void);&lt;br /&gt;
uint8_t TFT_Read_Register(uint8_t Addr, uint8_t xParameter);&lt;br /&gt;
void TFT_TFTinit (void);&lt;br /&gt;
uint8_t TFT_readID(void);&lt;br /&gt;
void TFT_setCol(uint16_t StartCol,uint16_t EndCol);&lt;br /&gt;
void TFT_setPage(uint16_t StartPage,uint16_t EndPage);&lt;br /&gt;
void TFT_fillScreen(uint16_t XL, uint16_t XR, uint16_t YU, uint16_t YD, uint16_t color);&lt;br /&gt;
void TFT_fillScreen2(void);&lt;br /&gt;
void TFT_setXY(uint16_t poX, uint16_t poY);&lt;br /&gt;
void TFT_setPixel(uint16_t poX, uint16_t poY,uint16_t color);&lt;br /&gt;
void TFT_drawChar( uint8_t ascii, uint16_t poX, uint16_t poY,uint16_t size, uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
void TFT_drawString(char *string,uint16_t poX, uint16_t poY, uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
void TFT_fillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color);&lt;br /&gt;
void  TFT_drawHorizontalLine( uint16_t poX, uint16_t poY,uint16_t length,uint16_t color);&lt;br /&gt;
void TFT_drawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color);&lt;br /&gt;
void TFT_drawVerticalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color);&lt;br /&gt;
void TFT_drawRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width,uint16_t color);&lt;br /&gt;
void TFT_drawCircle(int poX, int poY, int r,uint16_t color);&lt;br /&gt;
void TFT_fillCircle(int poX, int poY, int r,uint16_t color);&lt;br /&gt;
void TFT_drawTraingle( int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, uint16_t color);&lt;br /&gt;
uint8_t TFT_drawNumber(long long_num,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
uint8_t TFT_drawFloat(float floatNumber,uint8_t decimal,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_transfer(uint8_t data);&lt;br /&gt;
void SPI_init();&lt;br /&gt;
&lt;br /&gt;
// CAMERA &lt;br /&gt;
void mousecam_reset();&lt;br /&gt;
int mousecam_init();&lt;br /&gt;
void mousecam_write_reg(int reg, int val);&lt;br /&gt;
int mousecam_read_reg(int reg);&lt;br /&gt;
&lt;br /&gt;
struct MD&lt;br /&gt;
{&lt;br /&gt;
 byte motion;&lt;br /&gt;
 char dx, dy;&lt;br /&gt;
 byte squal;&lt;br /&gt;
 word shutter;&lt;br /&gt;
 byte max_pix;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mousecam_read_motion(struct MD *p);&lt;br /&gt;
&lt;br /&gt;
// pdata must point to an array of size ADNS3080_PIXELS_X x ADNS3080_PIXELS_Y&lt;br /&gt;
// you must call mousecam_reset() after this if you want to go back to normal operation&lt;br /&gt;
int mousecam_frame_capture(byte *pdata);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
int main() {&lt;br /&gt;
  uint8_t i, t[4];&lt;br /&gt;
  uint16_t cmpt=0;&lt;br /&gt;
// init&lt;br /&gt;
//   SPI_init();&lt;br /&gt;
   &lt;br /&gt;
   TFT_TFTinit (); //init TFT library&lt;br /&gt;
   TFT_backlight_on();                          // turn on the background light&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('S',0,0,1,RED,BLACK);              // draw char: 'S', (0, 0), size: 1, color: RED&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',10,10,2,BLUE,BLACK);           // draw char: 'E', (10, 10), size: 2, color: BLUE&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',20,40,3,GREEN,BLACK);          // draw char: 'E', (20, 40), size: 3, color: GREEN&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',30,80,4,YELLOW,BLACK);         // draw char: 'E', (30, 80), size: 4, color: YELLOW&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('D',40,120,4,YELLOW,BLACK);        // draw char: 'D', (40, 120), size: 4, color: YELLOW&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawString(&amp;quot;Hello&amp;quot;,0,180,3,CYAN,BLACK);     // draw string: &amp;quot;hello&amp;quot;, (0, 180), size: 3, color: CYAN&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawString(&amp;quot;World!!&amp;quot;,60,220,4,WHITE,BLACK); // draw string: &amp;quot;world!!&amp;quot;, (80, 230), size: 4, color: WHITE&lt;br /&gt;
// loop&lt;br /&gt;
  while(1) {&lt;br /&gt;
                               &lt;br /&gt;
//  TFT_backlight_on();  &lt;br /&gt;
//  _delay_ms(1000);                         &lt;br /&gt;
//  TFT_backlight_off();  &lt;br /&gt;
//  _delay_ms(1000);&lt;br /&gt;
//  TFT_fillScreen(0, 239, 0, 319, GREEN);&lt;br /&gt;
  TFT_drawLine(0,0,239,319,RED);            //start: (0, 0) end: (239, 319), color : RED&lt;br /&gt;
   &lt;br /&gt;
  TFT_drawVerticalLine(60,100,100,GREEN);   // Draw a vertical line&lt;br /&gt;
                                              // start: (60, 100) length: 100 color: green&lt;br /&gt;
                                         &lt;br /&gt;
  TFT_drawHorizontalLine(30,60,150,BLUE);   //Draw a horizontal line&lt;br /&gt;
                                              //start: (30, 60), high: 150, color: blue&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  pinMode(31,OUTPUT); // P3.1 = 31 = DC&lt;br /&gt;
  pinMode(13,OUTPUT); //SSEL = CS = P3.6 = 18&lt;br /&gt;
  pinMode(2,OUTPUT); //led = = P6.0 = 2&lt;br /&gt;
  pinMode(17,OUTPUT);  // RST = P5.7 = 17&lt;br /&gt;
  pinMode(RED_LED,OUTPUT);&lt;br /&gt;
  pinMode(PIN_MISO,INPUT);&lt;br /&gt;
  pinMode(PIN_MOSI,OUTPUT);&lt;br /&gt;
  pinMode(PIN_SCK,OUTPUT);&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte frame[ADNS3080_PIXELS_X * ADNS3080_PIXELS_Y];&lt;br /&gt;
  uint8_t cmpt=0;&lt;br /&gt;
  uint16_t gris;&lt;br /&gt;
//*********************** gestion camera **********************&lt;br /&gt;
  &lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV32);&lt;br /&gt;
  SPI.setDataMode(SPI_MODE3);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  if(mousecam_init()==-1)&lt;br /&gt;
  {&lt;br /&gt;
    //Serial.println(&amp;quot;Mouse cam failed to init&amp;quot;);&lt;br /&gt;
    while(1);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  //  TFT_backlight_on();  &lt;br /&gt;
//  _delay_ms(1000);                         &lt;br /&gt;
//  TFT_backlight_off();  &lt;br /&gt;
//  _delay_ms(1000);&lt;br /&gt;
//  TFT_fillScreen(0, 239, 0, 319, GREEN);&lt;br /&gt;
/*&lt;br /&gt;
  TFT_drawLine(0,0,239,319,RED);            //start: (0, 0) end: (239, 319), color : RED&lt;br /&gt;
   &lt;br /&gt;
  TFT_drawVerticalLine(60,100,100,GREEN);   // Draw a vertical line&lt;br /&gt;
                                              // start: (60, 100) length: 100 color: green&lt;br /&gt;
                                         &lt;br /&gt;
  TFT_drawHorizontalLine(30,60,150,BLUE);   //Draw a horizontal line&lt;br /&gt;
                                              //start: (30, 60), high: 150, color: blue&lt;br /&gt;
&lt;br /&gt;
  delay(500);&lt;br /&gt;
  cmpt++;&lt;br /&gt;
  &lt;br /&gt;
   &lt;br /&gt;
  if (cmpt &amp;amp; 0x01)  digitalWrite(RED_LED,HIGH); else  digitalWrite(RED_LED,LOW);&lt;br /&gt;
  //Serial.println(&amp;quot;Bonjour&amp;quot;);&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  if(mousecam_frame_capture(frame)==0) {&lt;br /&gt;
//*********** Gestion écran *************&lt;br /&gt;
    //SPI.begin();&lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV8);&lt;br /&gt;
  SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  //Serial.begin(9600);&lt;br /&gt;
    TFT_TFTinit();&lt;br /&gt;
    TFT_backlight_on();     // turn on the background light &lt;br /&gt;
  //TFT_fillScreen(0, 240, 0,320, GREEN);&lt;br /&gt;
    for (int j=0; j&amp;lt;=32; j++){&lt;br /&gt;
      for (int i=0;i&amp;lt;32;i++) {&lt;br /&gt;
        gris =frame[j+32*i]+ (frame[j+32*i] &amp;lt;&amp;lt; 6) + (frame[j+32*i]&amp;lt;&amp;lt;11) ;&lt;br /&gt;
        TFT_fillRectangle(7*i,9*j, 5, 7, gris); &lt;br /&gt;
        //TFT_fillCircle(7.5*i,9*j, 4,  gris);&lt;br /&gt;
       &lt;br /&gt;
      } // for  &lt;br /&gt;
    } // for&lt;br /&gt;
  } //  if(mousecam_frame_capture(frame)==0)&lt;br /&gt;
  delay(10000); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_sendCMD(uint8_t index)&lt;br /&gt;
{&lt;br /&gt;
  /*&lt;br /&gt;
  PORTC &amp;amp;= 0xF7; // CD low&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS = Low&lt;br /&gt;
  SPI_transfer(index);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS = high&lt;br /&gt;
  */&lt;br /&gt;
   // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(31,LOW);&lt;br /&gt;
   //SSEL = CS = P3.6 = 13&lt;br /&gt;
   digitalWrite(13,LOW);&lt;br /&gt;
   SPI.transfer(index);&lt;br /&gt;
   digitalWrite(13,HIGH);  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_WRITE_DATA(uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
  /*&lt;br /&gt;
  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS = Low&lt;br /&gt;
  SPI_transfer(data);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS = High&lt;br /&gt;
*/  &lt;br /&gt;
   digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
   SPI.transfer(data);&lt;br /&gt;
   digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_sendData(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t data1 = data&amp;gt;&amp;gt;8;&lt;br /&gt;
  uint8_t data2 = data&amp;amp;0xff;&lt;br /&gt;
/*  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS =Low&lt;br /&gt;
  SPI_transfer(data1);&lt;br /&gt;
  SPI_transfer(data2);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
*/&lt;br /&gt;
   digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
   SPI.transfer(data1);&lt;br /&gt;
   SPI.transfer(data2);&lt;br /&gt;
   digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_WRITE_Package(uint16_t *data, uint8_t howmany)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t  data1 = 0;&lt;br /&gt;
  uint8_t   data2 = 0;&lt;br /&gt;
/*&lt;br /&gt;
  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  uint8_t count=0;&lt;br /&gt;
  for(count=0;count&amp;lt;howmany;count++)&lt;br /&gt;
  {&lt;br /&gt;
      data1 = data[count]&amp;gt;&amp;gt;8;&lt;br /&gt;
      data2 = data[count]&amp;amp;0xff;&lt;br /&gt;
      SPI_transfer(data1);&lt;br /&gt;
      SPI_transfer(data2);&lt;br /&gt;
  }&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS&lt;br /&gt;
  */&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  uint8_t count=0;&lt;br /&gt;
  for(count=0;count&amp;lt;howmany;count++)&lt;br /&gt;
  {&lt;br /&gt;
      data1 = data[count]&amp;gt;&amp;gt;8;&lt;br /&gt;
      data2 = data[count]&amp;amp;0xff;&lt;br /&gt;
      SPI.transfer(data1);&lt;br /&gt;
      SPI.transfer(data2);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_backlight_on(void)&lt;br /&gt;
{&lt;br /&gt;
  //PORTC |= 0x20;  &lt;br /&gt;
  digitalWrite(2,HIGH); //led = = P6.0 = 2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_backlight_off(void)&lt;br /&gt;
{&lt;br /&gt;
  //PORTC &amp;amp;= 0xDF;//LED off&lt;br /&gt;
  digitalWrite(2,LOW); //led = = P6.0 = 2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_Read_Register(uint8_t Addr, uint8_t xParameter)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
  /*&lt;br /&gt;
  TFT_sendCMD(0xd9);                                                   &lt;br /&gt;
  TFT_WRITE_DATA(0x10+xParameter);&lt;br /&gt;
  PORTC &amp;amp;= 0xF7; // CD low                                   &lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  SPI_transfer(Addr);&lt;br /&gt;
  PORTC |= 0x08; // CD high&lt;br /&gt;
  data = SPI_transfer(0);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  */&lt;br /&gt;
  TFT_sendCMD(0xd9);                                                    /* ext command                */&lt;br /&gt;
  TFT_WRITE_DATA(0x10+xParameter);&lt;br /&gt;
  digitalWrite(31,LOW); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  SPI.transfer(Addr);&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  data = SPI.transfer(0);&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_TFTinit(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
    // PORTC &amp;amp;= 0xF7; // CD low&lt;br /&gt;
  digitalWrite(31,LOW); // CD = P3.7 = 31&lt;br /&gt;
  //PORTC &amp;amp;= 0xDF;//LED off&lt;br /&gt;
  digitalWrite(2,LOW); //led = = P6.0 = 2&lt;br /&gt;
  //PORTC &amp;amp;= 0xEF; // RST low&lt;br /&gt;
  digitalWrite(17,LOW); // RST = P5.7 = 17&lt;br /&gt;
      // b3=CPOL, b2=CPHA, b1=SPR1 b0=SPR0&lt;br /&gt;
      //SPCR &amp;amp;= ~((1&amp;lt;&amp;lt;CPOL) | (1&amp;lt;&amp;lt;CPHA)); // mode 0&lt;br /&gt;
      //SPCR |= (1&amp;lt;&amp;lt;SPR1); // poids faible division = 2&lt;br /&gt;
      //SPSR |= (1 &amp;lt;&amp;lt; 1); // poids fort division = 8&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
  SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV16);&lt;br /&gt;
  //SPI_transfer(0);  // Strawman transfer, fixes USCI issue on G2553&lt;br /&gt;
  SPI.transfer(0);&lt;br /&gt;
  //    PORTC |= 0x04; // SSEL=CS high ????&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  //    PORTC |= 0x08; // CD high&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  //    PORTC |= 3;  // DEBUG ou cela bloque-t-il ?&lt;br /&gt;
  uint8_t i=0, TFTDriver=0;&lt;br /&gt;
&lt;br /&gt;
  //PORTC &amp;amp;= 0xEF; // RST low&lt;br /&gt;
  digitalWrite(17,LOW); // RST = P5.7 = 17&lt;br /&gt;
  delay(10);&lt;br /&gt;
  //PORTC |= 0x10; // RST high&lt;br /&gt;
  digitalWrite(17,HIGH); // RST = P5.7 = 17&lt;br /&gt;
&lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
      TFTDriver = TFT_readID();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xCB);  &lt;br /&gt;
  TFT_WRITE_DATA(0x39);&lt;br /&gt;
  TFT_WRITE_DATA(0x2C);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x34);&lt;br /&gt;
  TFT_WRITE_DATA(0x02);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xCF);  &lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0XC1);&lt;br /&gt;
  TFT_WRITE_DATA(0X30);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xE8);  &lt;br /&gt;
  TFT_WRITE_DATA(0x85);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x78);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xEA);  &lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xED);  &lt;br /&gt;
  TFT_WRITE_DATA(0x64);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0X12);&lt;br /&gt;
  TFT_WRITE_DATA(0X81);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xF7);  &lt;br /&gt;
  TFT_WRITE_DATA(0x20);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC0);    //Power control&lt;br /&gt;
  TFT_WRITE_DATA(0x23);   //VRH[5:0]&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC1);    //Power control&lt;br /&gt;
  TFT_WRITE_DATA(0x10);   //SAP[2:0];BT[3:0]&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC5);    //VCM control&lt;br /&gt;
  TFT_WRITE_DATA(0x3e);   //Contrast&lt;br /&gt;
  TFT_WRITE_DATA(0x28);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC7);    //VCM control2&lt;br /&gt;
  TFT_WRITE_DATA(0x86); //--&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x36);    // Memory Access Control&lt;br /&gt;
  TFT_WRITE_DATA(0x48);   //C8  //48 68绔栧睆//28 E8 妯睆&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x3A);    &lt;br /&gt;
  TFT_WRITE_DATA(0x55);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xB1);    &lt;br /&gt;
  TFT_WRITE_DATA(0x00);  &lt;br /&gt;
  TFT_WRITE_DATA(0x13);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xB6);    // Display Function Control&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x82);&lt;br /&gt;
  TFT_WRITE_DATA(0x27);  &lt;br /&gt;
 &lt;br /&gt;
  TFT_sendCMD(0xF2);    // 3Gamma Function Disable&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x26);    //Gamma curve selected&lt;br /&gt;
  TFT_WRITE_DATA(0x01);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xE0);    //Set Gamma&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0x2B);&lt;br /&gt;
  TFT_WRITE_DATA(0x0C);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x4E);&lt;br /&gt;
  TFT_WRITE_DATA(0xF1);&lt;br /&gt;
  TFT_WRITE_DATA(0x37);&lt;br /&gt;
  TFT_WRITE_DATA(0x07);&lt;br /&gt;
  TFT_WRITE_DATA(0x10);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x09);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0XE1);    //Set Gamma&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x14);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0x11);&lt;br /&gt;
  TFT_WRITE_DATA(0x07);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0xC1);&lt;br /&gt;
  TFT_WRITE_DATA(0x48);&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
  TFT_WRITE_DATA(0x0C);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0x36);&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x11);    //Exit Sleep&lt;br /&gt;
  delay(120);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x29);  //Display on&lt;br /&gt;
  TFT_sendCMD(0x2c);   &lt;br /&gt;
  TFT_fillScreen2();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_readID(void)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i=0;&lt;br /&gt;
  uint8_t data[3] ;&lt;br /&gt;
  uint8_t ID[3] = {0x00, 0x93, 0x41};&lt;br /&gt;
  uint8_t ToF=1;&lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
      data[i]=TFT_Read_Register(0xd3,i+1);&lt;br /&gt;
      if(data[i] != ID[i])&lt;br /&gt;
      {&lt;br /&gt;
          ToF=0;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  return ToF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setCol(uint16_t StartCol,uint16_t EndCol)&lt;br /&gt;
{&lt;br /&gt;
  TFT_sendCMD(0x2A);                                                    /* Column Command address     */&lt;br /&gt;
  TFT_sendData(StartCol);&lt;br /&gt;
  TFT_sendData(EndCol);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setPage(uint16_t StartPage,uint16_t EndPage)&lt;br /&gt;
{&lt;br /&gt;
  TFT_sendCMD(0x2B);                                                    /* Column Command address     */&lt;br /&gt;
  TFT_sendData(StartPage);&lt;br /&gt;
  TFT_sendData(EndPage);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillScreen(uint16_t XL, uint16_t XR, uint16_t YU, uint16_t YD, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  unsigned long  XY=0;&lt;br /&gt;
  unsigned long i=0;&lt;br /&gt;
&lt;br /&gt;
  if(XL &amp;gt; XR)&lt;br /&gt;
  {&lt;br /&gt;
      XL = XL^XR;&lt;br /&gt;
      XR = XL^XR;&lt;br /&gt;
      XL = XL^XR;&lt;br /&gt;
  }&lt;br /&gt;
  if(YU &amp;gt; YD)&lt;br /&gt;
  {&lt;br /&gt;
      YU = YU^YD;&lt;br /&gt;
      YD = YU^YD;&lt;br /&gt;
      YU = YU^YD;&lt;br /&gt;
  }&lt;br /&gt;
//*********** a redefinir la fonction constrain !!!!!!!!!!!!!!!!!!&lt;br /&gt;
  //XL = constrain(XL, MIN_X,MAX_X);&lt;br /&gt;
  //XR = constrain(XR, MIN_X,MAX_X);&lt;br /&gt;
  //YU = constrain(YU, MIN_Y,MAX_Y);&lt;br /&gt;
  //YD = constrain(YD, MIN_Y,MAX_Y);&lt;br /&gt;
&lt;br /&gt;
  XY = (XR-XL+1);&lt;br /&gt;
  XY = XY*(YD-YU+1);&lt;br /&gt;
&lt;br /&gt;
  TFT_setCol(XL,XR);&lt;br /&gt;
  TFT_setPage(YU, YD);&lt;br /&gt;
  TFT_sendCMD(0x2c);                                                /* start to write to display ra */&lt;br /&gt;
                                                                      /* m                          */&lt;br /&gt;
  //PORTC |= 0x08; // CD high&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
&lt;br /&gt;
  uint8_t Hcolor = color&amp;gt;&amp;gt;8;&lt;br /&gt;
  uint8_t Lcolor = color&amp;amp;0xff;&lt;br /&gt;
  for(i=0; i &amp;lt; XY; i++)&lt;br /&gt;
  {&lt;br /&gt;
      SPI.transfer(Hcolor);&lt;br /&gt;
      SPI.transfer(Lcolor);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillScreen2(void)&lt;br /&gt;
{&lt;br /&gt;
  uint16_t i;&lt;br /&gt;
  TFT_setCol(0, 239);&lt;br /&gt;
  TFT_setPage(0, 319);&lt;br /&gt;
  TFT_sendCMD(0x2c);                                                /* start to write to display ra */&lt;br /&gt;
                                                                      /* m                          */&lt;br /&gt;
  //PORTC |= 0x08; // CD high&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  for(i=0; i&amp;lt;38400; i++)&lt;br /&gt;
  {&lt;br /&gt;
    /* SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);*/&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
  }&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_setXY(uint16_t poX, uint16_t poY)&lt;br /&gt;
{&lt;br /&gt;
  TFT_setCol(poX, poX);&lt;br /&gt;
  TFT_setPage(poY, poY);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setPixel(uint16_t poX, uint16_t poY,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_setXY(poX, poY);&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawChar( uint8_t ascii, uint16_t poX, uint16_t poY,uint16_t size, uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  //fillRectangle(poX, poY, poX+FONT_X*size, poY+FONT_Y*size, BLACK);&lt;br /&gt;
  int i;&lt;br /&gt;
  uint8_t f;&lt;br /&gt;
&lt;br /&gt;
  if((ascii&amp;gt;=32)&amp;amp;&amp;amp;(ascii&amp;lt;=127))&lt;br /&gt;
  {&lt;br /&gt;
      ;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
      ascii = '?'-32;&lt;br /&gt;
  }&lt;br /&gt;
  for (i =0; i&amp;lt;FONT_X; i++ ) {&lt;br /&gt;
      uint8_t temp = simpleFont[ascii-0x20][i];&lt;br /&gt;
      for(f=0;f&amp;lt;8;f++)&lt;br /&gt;
      {&lt;br /&gt;
          if((temp&amp;gt;&amp;gt;f)&amp;amp;0x01)&lt;br /&gt;
          {&lt;br /&gt;
              TFT_fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);&lt;br /&gt;
          }&lt;br /&gt;
    else&lt;br /&gt;
  TFT_fillRectangle(poX+i*size, poY+f*size, size, size, bgcolor);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawString(char *string,uint16_t poX, uint16_t poY, uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  while(*string)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar(*string, poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      *string++;&lt;br /&gt;
&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);&lt;br /&gt;
void TFT_fillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_fillScreen(poX, poX+length, poY, poY+width, color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  TFT_drawHorizontalLine( uint16_t poX, uint16_t poY,&lt;br /&gt;
uint16_t length,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  TFT_setCol(poX,poX + length);&lt;br /&gt;
  TFT_setPage(poY,poY);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
  for(i=0; i&amp;lt;length; i++)&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int abs(int data) {&lt;br /&gt;
  if (data &amp;gt; 0) return data; else return -data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  int x = x1-x0;&lt;br /&gt;
  int y = y1-y0;&lt;br /&gt;
  int dx = abs(x), sx = x0&amp;lt;x1 ? 1 : -1;&lt;br /&gt;
  int dy = -abs(y), sy = y0&amp;lt;y1 ? 1 : -1;&lt;br /&gt;
  int err = dx+dy, e2;                                              /* error value e_xy           */&lt;br /&gt;
  for (;;){                                                         /* loop                       */&lt;br /&gt;
      TFT_setPixel(x0,y0,color);&lt;br /&gt;
      e2 = 2*err;&lt;br /&gt;
      if (e2 &amp;gt;= dy) {                                               /* e_xy+e_x &amp;gt; 0               */&lt;br /&gt;
          if (x0 == x1) break;&lt;br /&gt;
          err += dy; x0 += sx;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;lt;= dx) {                                               /* e_xy+e_y &amp;lt; 0               */&lt;br /&gt;
          if (y0 == y1) break;&lt;br /&gt;
          err += dx; y0 += sy;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawVerticalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  TFT_setCol(poX,poX);&lt;br /&gt;
  TFT_setPage(poY,poY+length);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
  for(i=0; i&amp;lt;length; i++)&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_drawHorizontalLine(poX, poY, length, color);&lt;br /&gt;
  TFT_drawHorizontalLine(poX, poY+width, length, color);&lt;br /&gt;
  TFT_drawVerticalLine(poX, poY, width,color);&lt;br /&gt;
  TFT_drawVerticalLine(poX + length, poY, width,color);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawCircle(int poX, int poY, int r,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int x = -r, y = 0, err = 2-2*r, e2;&lt;br /&gt;
  do {&lt;br /&gt;
      TFT_setPixel(poX-x, poY+y,color);&lt;br /&gt;
      TFT_setPixel(poX+x, poY+y,color);&lt;br /&gt;
      TFT_setPixel(poX+x, poY-y,color);&lt;br /&gt;
      TFT_setPixel(poX-x, poY-y,color);&lt;br /&gt;
      e2 = err;&lt;br /&gt;
      if (e2 &amp;lt;= y) {&lt;br /&gt;
          err += ++y*2+1;&lt;br /&gt;
          if (-x == y &amp;amp;&amp;amp; e2 &amp;lt;= x) e2 = 0;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;gt; x) err += ++x*2+1;&lt;br /&gt;
  } while (x &amp;lt;= 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillCircle(int poX, int poY, int r,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int x = -r, y = 0, err = 2-2*r, e2;&lt;br /&gt;
  do {&lt;br /&gt;
&lt;br /&gt;
      TFT_drawVerticalLine(poX-x, poY-y, 2*y, color);&lt;br /&gt;
      TFT_drawVerticalLine(poX+x, poY-y, 2*y, color);&lt;br /&gt;
&lt;br /&gt;
      e2 = err;&lt;br /&gt;
      if (e2 &amp;lt;= y) {&lt;br /&gt;
          err += ++y*2+1;&lt;br /&gt;
          if (-x == y &amp;amp;&amp;amp; e2 &amp;lt;= x) e2 = 0;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;gt; x) err += ++x*2+1;&lt;br /&gt;
  } while (x &amp;lt;= 0);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawTraingle( int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_drawLine(poX1, poY1, poX2, poY2,color);&lt;br /&gt;
  TFT_drawLine(poX1, poY1, poX3, poY3,color);&lt;br /&gt;
  TFT_drawLine(poX2, poY2, poX3, poY3,color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_drawNumber(long long_num,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t char_buffer[10] = &amp;quot;&amp;quot;;&lt;br /&gt;
  uint8_t i = 0;&lt;br /&gt;
  uint8_t f = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (long_num &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
      f=1;&lt;br /&gt;
      TFT_drawChar('-',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      long_num = -long_num;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  else if (long_num == 0)&lt;br /&gt;
  {&lt;br /&gt;
      f=1;&lt;br /&gt;
      TFT_drawChar('0',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      return f;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  while (long_num &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
      char_buffer[i++] = long_num % 10;&lt;br /&gt;
      long_num /= 10;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  f = f+i;&lt;br /&gt;
  for(; i &amp;gt; 0; i--)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('0'+ char_buffer[i - 1],poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_drawFloat(float floatNumber,uint8_t decimal,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  uint16_t temp=0;&lt;br /&gt;
  float decy=0.0;&lt;br /&gt;
  float rounding = 0.5;&lt;br /&gt;
  uint8_t f=0;&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
  if(floatNumber&amp;lt;0.0)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('-',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      floatNumber = -floatNumber;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      f =1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i=0; i&amp;lt;decimal; ++i)&lt;br /&gt;
  {&lt;br /&gt;
      rounding /= 10.0;&lt;br /&gt;
  }&lt;br /&gt;
  floatNumber += rounding;&lt;br /&gt;
&lt;br /&gt;
  temp = (uint16_t)floatNumber;&lt;br /&gt;
  uint8_t howlong=TFT_drawNumber(temp,poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
  f += howlong;&lt;br /&gt;
  if((poX+8*size*howlong) &amp;lt; MAX_X)&lt;br /&gt;
  {&lt;br /&gt;
      poX+=FONT_SPACE*size*howlong;                                 /* Move cursor right          */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if(decimal&amp;gt;0)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('.',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      f +=1;&lt;br /&gt;
  }&lt;br /&gt;
  decy = floatNumber-temp;                                          /* decimal part,  4           */&lt;br /&gt;
  for(i=0;i&amp;lt;decimal;i++)                                   &lt;br /&gt;
  {&lt;br /&gt;
      decy *=10;                                                    /* for the next decimal       */&lt;br /&gt;
      temp = decy;                                                  /* get the decimal            */&lt;br /&gt;
      TFT_drawNumber(temp,poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      floatNumber = -floatNumber;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      decy -= temp;&lt;br /&gt;
  }&lt;br /&gt;
  f +=decimal;&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mousecam_reset()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_RESET,HIGH);&lt;br /&gt;
  delay(1); // reset pulse &amp;gt;10us&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_RESET,LOW);&lt;br /&gt;
  delay(35); // 35ms from reset to functional&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int mousecam_init()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(PIN_MOUSECAM_RESET,OUTPUT);&lt;br /&gt;
  pinMode(PIN_MOUSECAM_CS,OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  mousecam_reset();&lt;br /&gt;
  &lt;br /&gt;
  int pid = mousecam_read_reg(ADNS3080_PRODUCT_ID);&lt;br /&gt;
  if(pid != ADNS3080_PRODUCT_ID_VAL)&lt;br /&gt;
    return -1;&lt;br /&gt;
&lt;br /&gt;
  // turn on sensitive mode&lt;br /&gt;
  mousecam_write_reg(ADNS3080_CONFIGURATION_BITS, 0x19);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mousecam_write_reg(int reg, int val)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(reg | 0x80);&lt;br /&gt;
  SPI.transfer(val);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH);&lt;br /&gt;
  delayMicroseconds(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int mousecam_read_reg(int reg)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(reg);&lt;br /&gt;
  delayMicroseconds(75);&lt;br /&gt;
  int ret = SPI.transfer(0xff);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(1);&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mousecam_read_motion(struct MD *p)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(ADNS3080_MOTION_BURST);&lt;br /&gt;
  delayMicroseconds(75);&lt;br /&gt;
  p-&amp;gt;motion =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;dx =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;dy =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;squal =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;shutter =  SPI.transfer(0xff)&amp;lt;&amp;lt;8;&lt;br /&gt;
  p-&amp;gt;shutter |=  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;max_pix =  SPI.transfer(0xff);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// pdata must point to an array of size ADNS3080_PIXELS_X x ADNS3080_PIXELS_Y&lt;br /&gt;
// you must call mousecam_reset() after this if you want to go back to normal operation&lt;br /&gt;
int mousecam_frame_capture(byte *pdata)&lt;br /&gt;
{&lt;br /&gt;
  mousecam_write_reg(ADNS3080_FRAME_CAPTURE,0x83);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  &lt;br /&gt;
  SPI.transfer(ADNS3080_PIXEL_BURST);&lt;br /&gt;
  delayMicroseconds(50);&lt;br /&gt;
  &lt;br /&gt;
  int pix;&lt;br /&gt;
  byte started = 0;&lt;br /&gt;
  int count;&lt;br /&gt;
  int timeout = 0;&lt;br /&gt;
  int ret = 0;&lt;br /&gt;
  for(count = 0; count &amp;lt; ADNS3080_PIXELS_X * ADNS3080_PIXELS_Y; )&lt;br /&gt;
  {&lt;br /&gt;
    pix = SPI.transfer(0xff);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    if(started==0)&lt;br /&gt;
    {&lt;br /&gt;
      if(pix&amp;amp;0x40)&lt;br /&gt;
        started = 1;&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        timeout++;&lt;br /&gt;
        if(timeout==100)&lt;br /&gt;
        {&lt;br /&gt;
          ret = -1;&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if(started==1)&lt;br /&gt;
    {&lt;br /&gt;
      pdata[count++] = (pix &amp;amp; 0x3f)&amp;lt;&amp;lt;2; // scale to normal grayscale byte range&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(14);&lt;br /&gt;
  &lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Robotique mobile : Coupe de France des IUT GEII 2020 =&lt;br /&gt;
Il s'agit donc de préparer un robot pour la Coupe de France des IUT GEII 2020. Pour voir de quoi il s'agit, vous pouvez regarder [http://www.festivalrobotiquecachan.fr/edition-2019/coupe-de-france-des-iut-geii-2019/ la version 2019 ICI].&lt;br /&gt;
&lt;br /&gt;
Le règlement 2020 est disponible. Il a été validé lors de la réunion du 17 octobre 2019 à Cachan par l'ensemble des participant :&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1JnPi6Ug5wbRR7LcKigHnS9gUkkDZYa6v/view?usp=sharing Reglement 2020]&lt;br /&gt;
&lt;br /&gt;
Les principales nouveautés pour 2020 sont :&lt;br /&gt;
&lt;br /&gt;
*Les étudiants de Licence Pro ont le droit de participer.&lt;br /&gt;
&lt;br /&gt;
*Plus besoin d'être au filet pour marquer des points. Les robots doivent toujours crever un ballon pour valider leur score, mais il n'est plus nécessaire d'être dans la bande du filet pour marquer, il suffit juste que le robot soit arrêté, où que se soit, et qu'il ne bouge plus pour avoir le droit de crever le ballon. En revanche, le faire au filet rapporte 3 points supplémentaires.&lt;br /&gt;
&lt;br /&gt;
*La base mobile du robot (châssis, moteurs, transmissions, roues et batterie) n'est plus obligatoire, elle est juste recommandée, mais on peut utiliser tout type de moteur, châssis, roue, transmission ou batterie à condition qu'ils respectent les contraintes du règlement :&lt;br /&gt;
*Pas plus de 24V de tension dans le robot.&lt;br /&gt;
*Pas plus de 2 roues motrices.&lt;br /&gt;
*Le seul contact entre les roues motrices et le sol doit obligatoirement être un joint torique de référence Oring 133610.&lt;br /&gt;
*Pas de batteries Lithium Polymère, ou Lithium Cobalt (voir tous les détails concernant les batteries en technologie Lithium dans le règlement).&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
*[https://www.youtube.com/watch?v=JPPTRj0KWbg TB6612FNG H-Bridge Motor Controller - Better than L298N?]&lt;br /&gt;
*[https://fr.wikiversity.org/wiki/Micro_contr%C3%B4leurs_AVR/Travail_pratique/Utilisation_du_MPU9250 Utilisation du MPU9250 (9DOF)]&lt;br /&gt;
&lt;br /&gt;
=Projet robotique mobile : challenge GEII/GMP=&lt;br /&gt;
La réalisation de ce projet nécessitera deux binômes.&lt;br /&gt;
* un binôme s'occupera du déplacement et de ramener les cylindres dans notre camp&lt;br /&gt;
* l'autre binôme sera responsable de l'empilement des cylindres&lt;br /&gt;
Ce projet devra être complètement fonctionnel en fin de S3 à l'aide de deux télécommandes.&lt;br /&gt;
&lt;br /&gt;
Il sera poursuivi sur S4 avec comme objectif de le rendre autonome.&lt;br /&gt;
&lt;br /&gt;
{{Aide|Comment commencer ?}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous devez essayer de rédiger avec le plus de détail (pas forcément technique) un scénario décrivant l'exécution du challenge. Pour vous aider dans vos démarches, [[Media:Réglement_RM_V20.pdf|Le règlement 2020]] est consultable maintenant.&lt;br /&gt;
&lt;br /&gt;
{{finAide}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Indications : Utilisation d'un moteur pas à pas==&lt;br /&gt;
===Utilisation du shield CNC===&lt;br /&gt;
Ce [http://osoyoo.com/2017/04/07/arduino-uno-cnc-shield-v3-0-a4988/ shield CNC] est en principe dédié aux imprimantes 3D et notre version utilise la commande de puissance A4988. Nous utilisons la partie réservée à l'axe Y. Trois broches sont nécessaires :&lt;br /&gt;
* une broche pour choisir la direction de rotation (dirY dans notre code)&lt;br /&gt;
* une broche pour envoyer les impultions (pulseY dans notre code)&lt;br /&gt;
* unz broche pour valider le fonctionnement (stepperEN dans notre code)&lt;br /&gt;
Les positions de ces trois broches sont déterminées par le shield.&lt;br /&gt;
Voici le code Arduino correspondant :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const uint8_t dirY = 6;&lt;br /&gt;
const uint8_t pulseY=3;&lt;br /&gt;
const uint8_t stepperEN=8;&lt;br /&gt;
&lt;br /&gt;
uint8_t dir = 0;&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
 pinMode(dirY,OUTPUT);&lt;br /&gt;
 pinMode(pulseY,OUTPUT);&lt;br /&gt;
 pinMode(stepperEN,OUTPUT);&lt;br /&gt;
 digitalWrite(stepperEN,LOW);&lt;br /&gt;
 digitalWrite(dirY,dir);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  static uint16_t step=0;&lt;br /&gt;
  digitalWrite(pulseY,HIGH);&lt;br /&gt;
  digitalWrite(pulseY,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  step++;&lt;br /&gt;
  if (step&amp;gt;200) {&lt;br /&gt;
    step=0;&lt;br /&gt;
    dir ^= 1;&lt;br /&gt;
    digitalWrite(dirY,dir);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Il est possible de n'utiliser que la partie électronique de puissance A4988 seule et de faire un circuit pour le relier à un Arduino nano.&lt;br /&gt;
&lt;br /&gt;
Nous étudierons une autre possibilité avec un [https://www.instructables.com/id/Control-DC-and-stepper-motors-with-L298N-Dual-Moto/ L298N].&lt;br /&gt;
&lt;br /&gt;
===Étude du L298N===&lt;br /&gt;
&lt;br /&gt;
La carte [https://www.instructables.com/id/Control-DC-and-stepper-motors-with-L298N-Dual-Moto/ L298N et son utilisation est présentée ICI]. Il est donc facile de l'utiliser surtout associé à la [https://github.com/arduino-libraries/Stepper librairie Stepper (github)]. Le seul problème rencontré était dû au fait que la masse de l'Arduino et la masse du L298N n'étaient pas reliées.&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
*[https://fr.wikiversity.org/wiki/Micro_contr%C3%B4leurs_AVR/Travail_pratique/Utilisation_du_MPU9250 Utilisation du MPU9250 (9DOF)]&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ErB32019&amp;diff=14658</id>
		<title>Cours:ErB32019</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ErB32019&amp;diff=14658"/>
				<updated>2021-04-04T13:27:52Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Optical Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Projet GPS tracker=&lt;br /&gt;
Ce que l'on cherche à réaliser est décrit dans cette vidéo : [https://www.youtube.com/watch?v=D20uSl_JHrk Arduino GPS tracker and Google Maps Tutorial] ou ce cours de 49mn : [https://www.youtube.com/watch?v=OsMoowoB2Rg LESSON 22: Build an Arduino GPS Tracker]&lt;br /&gt;
&lt;br /&gt;
=Propeller clock=&lt;br /&gt;
Ce projet est donné depuis un certain nombre d'années et va continuer encore cette année. Il se fera avec des Leds et non plus a bandeau de leds numérique (WS2812 rgb leds). Voir la vidéo : [https://www.youtube.com/watch?v=HYtftl7_pO0 Arduino NANO Propeller LED Analog Clock]&lt;br /&gt;
&lt;br /&gt;
Vous pouvez trouver aussi [https://www.electronicshub.org/pov-display-using-arduino/ un document explicatif] avec un peu de code. Une autre technique utilisant un registre à décalage 74HC595 [https://ijireeice.com/wp-content/uploads/2014/12/IJIREEICE-15.pdf est présentée ICI].&lt;br /&gt;
&lt;br /&gt;
Il vous est possible de choisir une autre technologie que le microcontrôleur, à savoir le FPGA.&lt;br /&gt;
&lt;br /&gt;
=Optical Flow=&lt;br /&gt;
Ce projet peut concerner un ou deux binômes mais alors en concurrence. Autrement dit, s'il y a deux binômes il y a deux projets différents.&lt;br /&gt;
&lt;br /&gt;
Ce que l'on cherche à faire est présenté dans cette vidéo : [https://www.youtube.com/watch?v=8P_5KFCGcTg Arduino based pan-tilt optical flow tracking] Vous disposerez de &lt;br /&gt;
* tourelle pan/tilt et ses servomoteurs&lt;br /&gt;
* Optical Flow Sensor APM2.5 improve position hold accuracy Multicopter ADNS 3080&lt;br /&gt;
* Ecran 2,8'&lt;br /&gt;
* microcontrôleur ou FPGA au choix&lt;br /&gt;
&lt;br /&gt;
Du code pour lire le composant ADNS 3080 peut être trouvé sur gitHub :&lt;br /&gt;
* [https://github.com/Lauszus/ADNS3080 ADNS3080]&lt;br /&gt;
* [https://github.com/Neumi/OpticalFlowA3080ArduinoProcessing Optical Flow A3080 Arduino and Processing]&lt;br /&gt;
==Caractéristiques==&lt;br /&gt;
*&amp;lt;b&amp;gt;Caractéristiques&amp;lt;/b&amp;gt; : ce capteur est basé sur le capteur de souris ADNS3080 qui est un bon choix pour le flux optique. &lt;br /&gt;
*&amp;lt;b&amp;gt;Haute résolution :&amp;lt;/b&amp;gt; images 30x30 pixels, ce qui signifie qu'il peut avoir des fonctionnalités que les petites souris ne peuvent pas avoir.&lt;br /&gt;
*&amp;lt;b&amp;gt;Haute vitesse :&amp;lt;/b&amp;gt; taux de mise à jour de 2000 à 6400 images par seconde, ce qui contribue à de meilleures performances de faible luminosité que les autres capteurs de souris.&lt;br /&gt;
* Interface SPI, ce qui signifie qu'elle peut être interfacée à de nombreux micro-contrôleurs et coexistent avec d'autres capteurs.&lt;br /&gt;
* Destiné à s'interfacer avec un microcontrôleur 5V.&lt;br /&gt;
* Objectif de 8mm avec FOV de 11 degrés.&lt;br /&gt;
* Monture d'objectif Standard M12x0.5, ce qui signifie que vous pouvez remplacer l'objectif facilement.&lt;br /&gt;
&lt;br /&gt;
Instruction d'utilisation:&lt;br /&gt;
* Il fonctionne bien dans les environnements extérieurs éclairés.&lt;br /&gt;
* Il ne fonctionne pas bien avec les lumières fluorescentes (le clignotement perturbe le capteur).&lt;br /&gt;
* Il faut une surface non uniforme pour voir le mouvement (les tapis unis ne sont pas son ami). &lt;br /&gt;
&lt;br /&gt;
==Solution intermédiaire : optical flow et écran avec MSP432==&lt;br /&gt;
&amp;lt;source lang=arduino&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*************************&lt;br /&gt;
* Carte SD ----- Launchpad&lt;br /&gt;
* TM4C123G (ARM)&lt;br /&gt;
* GND ----------- GND&lt;br /&gt;
* +3.3 ---------- Vcc&lt;br /&gt;
* CS ------------ PB5 (PB_5)&lt;br /&gt;
* MOSI ---------- PB7 (PB_7)&lt;br /&gt;
* SCK ----------- PB4 (PB_4)&lt;br /&gt;
* MISO ---------- PB6 (PB_6)&lt;br /&gt;
*&lt;br /&gt;
**************************/ &lt;br /&gt;
&lt;br /&gt;
//#define PIN_SS        PB_5&lt;br /&gt;
#define PIN_MISO      14&lt;br /&gt;
#define PIN_MOSI      15&lt;br /&gt;
#define PIN_SCK       7&lt;br /&gt;
&lt;br /&gt;
#define PIN_MOUSECAM_RESET     17&lt;br /&gt;
#define PIN_MOUSECAM_CS        18&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PIXELS_X                 30&lt;br /&gt;
#define ADNS3080_PIXELS_Y                 30&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PRODUCT_ID            0x00&lt;br /&gt;
#define ADNS3080_REVISION_ID           0x01&lt;br /&gt;
#define ADNS3080_MOTION                0x02&lt;br /&gt;
#define ADNS3080_DELTA_X               0x03&lt;br /&gt;
#define ADNS3080_DELTA_Y               0x04&lt;br /&gt;
#define ADNS3080_SQUAL                 0x05&lt;br /&gt;
#define ADNS3080_PIXEL_SUM             0x06&lt;br /&gt;
#define ADNS3080_MAXIMUM_PIXEL         0x07&lt;br /&gt;
#define ADNS3080_CONFIGURATION_BITS    0x0a&lt;br /&gt;
#define ADNS3080_EXTENDED_CONFIG       0x0b&lt;br /&gt;
#define ADNS3080_DATA_OUT_LOWER        0x0c&lt;br /&gt;
#define ADNS3080_DATA_OUT_UPPER        0x0d&lt;br /&gt;
#define ADNS3080_SHUTTER_LOWER         0x0e&lt;br /&gt;
#define ADNS3080_SHUTTER_UPPER         0x0f&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_LOWER    0x10&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_UPPER    0x11&lt;br /&gt;
#define ADNS3080_MOTION_CLEAR          0x12&lt;br /&gt;
#define ADNS3080_FRAME_CAPTURE         0x13&lt;br /&gt;
#define ADNS3080_SROM_ENABLE           0x14&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MAX_BOUND_LOWER      0x19&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MAX_BOUND_UPPER      0x1a&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MIN_BOUND_LOWER      0x1b&lt;br /&gt;
#define ADNS3080_FRAME_PERIOD_MIN_BOUND_UPPER      0x1c&lt;br /&gt;
#define ADNS3080_SHUTTER_MAX_BOUND_LOWER           0x1e&lt;br /&gt;
#define ADNS3080_SHUTTER_MAX_BOUND_UPPER           0x1e&lt;br /&gt;
#define ADNS3080_SROM_ID               0x1f&lt;br /&gt;
#define ADNS3080_OBSERVATION           0x3d&lt;br /&gt;
#define ADNS3080_INVERSE_PRODUCT_ID    0x3f&lt;br /&gt;
#define ADNS3080_PIXEL_BURST           0x40&lt;br /&gt;
#define ADNS3080_MOTION_BURST          0x50&lt;br /&gt;
#define ADNS3080_SROM_LOAD             0x60&lt;br /&gt;
&lt;br /&gt;
#define ADNS3080_PRODUCT_ID_VAL        0x17&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Basic Colors&lt;br /&gt;
#define RED  0xf800&lt;br /&gt;
#define GREEN   0x07e0&lt;br /&gt;
#define BLUE  0x001f&lt;br /&gt;
#define BLACK   0x0000&lt;br /&gt;
#define YELLOW  0xffe0&lt;br /&gt;
#define WHITE   0xffff&lt;br /&gt;
&lt;br /&gt;
//Other Colors&lt;br /&gt;
#define CYAN  0x07ff  &lt;br /&gt;
#define BRIGHT_RED  0xf810  &lt;br /&gt;
#define GRAY1   0x8410  &lt;br /&gt;
#define GRAY2   0x4208  &lt;br /&gt;
&lt;br /&gt;
//TFT resolution 240*320&lt;br /&gt;
#define MIN_X   0&lt;br /&gt;
#define MIN_Y   0&lt;br /&gt;
#define MAX_X   239&lt;br /&gt;
#define MAX_Y   319&lt;br /&gt;
&lt;br /&gt;
#define FONT_SPACE 6&lt;br /&gt;
#define FONT_X 8&lt;br /&gt;
#define FONT_Y 8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t simpleFont[][8] =&lt;br /&gt;
{&lt;br /&gt;
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},&lt;br /&gt;
  {0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},&lt;br /&gt;
  {0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},&lt;br /&gt;
  {0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},&lt;br /&gt;
  {0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},&lt;br /&gt;
  {0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},&lt;br /&gt;
  {0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},&lt;br /&gt;
  {0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},&lt;br /&gt;
  {0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},&lt;br /&gt;
  {0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},&lt;br /&gt;
  {0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},&lt;br /&gt;
  {0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},&lt;br /&gt;
  {0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},&lt;br /&gt;
  {0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},&lt;br /&gt;
  {0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},&lt;br /&gt;
  {0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},&lt;br /&gt;
  {0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},&lt;br /&gt;
  {0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},&lt;br /&gt;
  {0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},&lt;br /&gt;
  {0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},&lt;br /&gt;
  {0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},&lt;br /&gt;
  {0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},&lt;br /&gt;
  {0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},&lt;br /&gt;
  {0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void TFT_sendCMD(uint8_t index);&lt;br /&gt;
void TFT_WRITE_DATA(uint8_t data);&lt;br /&gt;
void TFT_sendData(uint16_t data);&lt;br /&gt;
void TFT_WRITE_Package(uint16_t *data, uint8_t howmany);&lt;br /&gt;
void TFT_backlight_on(void);&lt;br /&gt;
void TFT_backlight_off(void);&lt;br /&gt;
uint8_t TFT_Read_Register(uint8_t Addr, uint8_t xParameter);&lt;br /&gt;
void TFT_TFTinit (void);&lt;br /&gt;
uint8_t TFT_readID(void);&lt;br /&gt;
void TFT_setCol(uint16_t StartCol,uint16_t EndCol);&lt;br /&gt;
void TFT_setPage(uint16_t StartPage,uint16_t EndPage);&lt;br /&gt;
void TFT_fillScreen(uint16_t XL, uint16_t XR, uint16_t YU, uint16_t YD, uint16_t color);&lt;br /&gt;
void TFT_fillScreen2(void);&lt;br /&gt;
void TFT_setXY(uint16_t poX, uint16_t poY);&lt;br /&gt;
void TFT_setPixel(uint16_t poX, uint16_t poY,uint16_t color);&lt;br /&gt;
void TFT_drawChar( uint8_t ascii, uint16_t poX, uint16_t poY,uint16_t size, uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
void TFT_drawString(char *string,uint16_t poX, uint16_t poY, uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
void TFT_fillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color);&lt;br /&gt;
void  TFT_drawHorizontalLine( uint16_t poX, uint16_t poY,uint16_t length,uint16_t color);&lt;br /&gt;
void TFT_drawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color);&lt;br /&gt;
void TFT_drawVerticalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color);&lt;br /&gt;
void TFT_drawRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width,uint16_t color);&lt;br /&gt;
void TFT_drawCircle(int poX, int poY, int r,uint16_t color);&lt;br /&gt;
void TFT_fillCircle(int poX, int poY, int r,uint16_t color);&lt;br /&gt;
void TFT_drawTraingle( int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, uint16_t color);&lt;br /&gt;
uint8_t TFT_drawNumber(long long_num,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
uint8_t TFT_drawFloat(float floatNumber,uint8_t decimal,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor);&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_transfer(uint8_t data);&lt;br /&gt;
void SPI_init();&lt;br /&gt;
&lt;br /&gt;
// CAMERA &lt;br /&gt;
void mousecam_reset();&lt;br /&gt;
int mousecam_init();&lt;br /&gt;
void mousecam_write_reg(int reg, int val);&lt;br /&gt;
int mousecam_read_reg(int reg);&lt;br /&gt;
&lt;br /&gt;
struct MD&lt;br /&gt;
{&lt;br /&gt;
 byte motion;&lt;br /&gt;
 char dx, dy;&lt;br /&gt;
 byte squal;&lt;br /&gt;
 word shutter;&lt;br /&gt;
 byte max_pix;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mousecam_read_motion(struct MD *p);&lt;br /&gt;
&lt;br /&gt;
// pdata must point to an array of size ADNS3080_PIXELS_X x ADNS3080_PIXELS_Y&lt;br /&gt;
// you must call mousecam_reset() after this if you want to go back to normal operation&lt;br /&gt;
int mousecam_frame_capture(byte *pdata);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
int main() {&lt;br /&gt;
  uint8_t i, t[4];&lt;br /&gt;
  uint16_t cmpt=0;&lt;br /&gt;
// init&lt;br /&gt;
//   SPI_init();&lt;br /&gt;
   &lt;br /&gt;
   TFT_TFTinit (); //init TFT library&lt;br /&gt;
   TFT_backlight_on();                          // turn on the background light&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('S',0,0,1,RED,BLACK);              // draw char: 'S', (0, 0), size: 1, color: RED&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',10,10,2,BLUE,BLACK);           // draw char: 'E', (10, 10), size: 2, color: BLUE&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',20,40,3,GREEN,BLACK);          // draw char: 'E', (20, 40), size: 3, color: GREEN&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('E',30,80,4,YELLOW,BLACK);         // draw char: 'E', (30, 80), size: 4, color: YELLOW&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawChar('D',40,120,4,YELLOW,BLACK);        // draw char: 'D', (40, 120), size: 4, color: YELLOW&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawString(&amp;quot;Hello&amp;quot;,0,180,3,CYAN,BLACK);     // draw string: &amp;quot;hello&amp;quot;, (0, 180), size: 3, color: CYAN&lt;br /&gt;
    &lt;br /&gt;
  TFT_drawString(&amp;quot;World!!&amp;quot;,60,220,4,WHITE,BLACK); // draw string: &amp;quot;world!!&amp;quot;, (80, 230), size: 4, color: WHITE&lt;br /&gt;
// loop&lt;br /&gt;
  while(1) {&lt;br /&gt;
                               &lt;br /&gt;
//  TFT_backlight_on();  &lt;br /&gt;
//  _delay_ms(1000);                         &lt;br /&gt;
//  TFT_backlight_off();  &lt;br /&gt;
//  _delay_ms(1000);&lt;br /&gt;
//  TFT_fillScreen(0, 239, 0, 319, GREEN);&lt;br /&gt;
  TFT_drawLine(0,0,239,319,RED);            //start: (0, 0) end: (239, 319), color : RED&lt;br /&gt;
   &lt;br /&gt;
  TFT_drawVerticalLine(60,100,100,GREEN);   // Draw a vertical line&lt;br /&gt;
                                              // start: (60, 100) length: 100 color: green&lt;br /&gt;
                                         &lt;br /&gt;
  TFT_drawHorizontalLine(30,60,150,BLUE);   //Draw a horizontal line&lt;br /&gt;
                                              //start: (30, 60), high: 150, color: blue&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  pinMode(31,OUTPUT); // P3.1 = 31 = DC&lt;br /&gt;
  pinMode(13,OUTPUT); //SSEL = CS = P3.6 = 18&lt;br /&gt;
  pinMode(2,OUTPUT); //led = = P6.0 = 2&lt;br /&gt;
  pinMode(17,OUTPUT);  // RST = P5.7 = 17&lt;br /&gt;
  pinMode(RED_LED,OUTPUT);&lt;br /&gt;
  pinMode(PIN_MISO,INPUT);&lt;br /&gt;
  pinMode(PIN_MOSI,OUTPUT);&lt;br /&gt;
  pinMode(PIN_SCK,OUTPUT);&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  byte frame[ADNS3080_PIXELS_X * ADNS3080_PIXELS_Y];&lt;br /&gt;
  uint8_t cmpt=0;&lt;br /&gt;
  uint16_t gris;&lt;br /&gt;
//*********************** gestion camera **********************&lt;br /&gt;
  &lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV32);&lt;br /&gt;
  SPI.setDataMode(SPI_MODE3);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  if(mousecam_init()==-1)&lt;br /&gt;
  {&lt;br /&gt;
    //Serial.println(&amp;quot;Mouse cam failed to init&amp;quot;);&lt;br /&gt;
    while(1);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  //  TFT_backlight_on();  &lt;br /&gt;
//  _delay_ms(1000);                         &lt;br /&gt;
//  TFT_backlight_off();  &lt;br /&gt;
//  _delay_ms(1000);&lt;br /&gt;
//  TFT_fillScreen(0, 239, 0, 319, GREEN);&lt;br /&gt;
/*&lt;br /&gt;
  TFT_drawLine(0,0,239,319,RED);            //start: (0, 0) end: (239, 319), color : RED&lt;br /&gt;
   &lt;br /&gt;
  TFT_drawVerticalLine(60,100,100,GREEN);   // Draw a vertical line&lt;br /&gt;
                                              // start: (60, 100) length: 100 color: green&lt;br /&gt;
                                         &lt;br /&gt;
  TFT_drawHorizontalLine(30,60,150,BLUE);   //Draw a horizontal line&lt;br /&gt;
                                              //start: (30, 60), high: 150, color: blue&lt;br /&gt;
&lt;br /&gt;
  delay(500);&lt;br /&gt;
  cmpt++;&lt;br /&gt;
  &lt;br /&gt;
   &lt;br /&gt;
  if (cmpt &amp;amp; 0x01)  digitalWrite(RED_LED,HIGH); else  digitalWrite(RED_LED,LOW);&lt;br /&gt;
  //Serial.println(&amp;quot;Bonjour&amp;quot;);&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  if(mousecam_frame_capture(frame)==0) {&lt;br /&gt;
//*********** Gestion écran *************&lt;br /&gt;
    //SPI.begin();&lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV8);&lt;br /&gt;
  SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  //Serial.begin(9600);&lt;br /&gt;
    TFT_TFTinit();&lt;br /&gt;
    TFT_backlight_on();     // turn on the background light &lt;br /&gt;
  //TFT_fillScreen(0, 240, 0,320, GREEN);&lt;br /&gt;
    for (int j=0; j&amp;lt;=32; j++){&lt;br /&gt;
      for (int i=0;i&amp;lt;32;i++) {&lt;br /&gt;
        gris =frame[j+32*i]+ (frame[j+32*i] &amp;lt;&amp;lt; 6) + (frame[j+32*i]&amp;lt;&amp;lt;11) ;&lt;br /&gt;
        TFT_fillRectangle(7*i,9*j, 5, 7, gris); &lt;br /&gt;
        //TFT_fillCircle(7.5*i,9*j, 4,  gris);&lt;br /&gt;
       &lt;br /&gt;
      } // for  &lt;br /&gt;
    } // for&lt;br /&gt;
  } //  if(mousecam_frame_capture(frame)==0)&lt;br /&gt;
  delay(10000); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_sendCMD(uint8_t index)&lt;br /&gt;
{&lt;br /&gt;
  /*&lt;br /&gt;
  PORTC &amp;amp;= 0xF7; // CD low&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS = Low&lt;br /&gt;
  SPI_transfer(index);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS = high&lt;br /&gt;
  */&lt;br /&gt;
   // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(31,LOW);&lt;br /&gt;
   //SSEL = CS = P3.6 = 13&lt;br /&gt;
   digitalWrite(13,LOW);&lt;br /&gt;
   SPI.transfer(index);&lt;br /&gt;
   digitalWrite(13,HIGH);  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_WRITE_DATA(uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
  /*&lt;br /&gt;
  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS = Low&lt;br /&gt;
  SPI_transfer(data);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS = High&lt;br /&gt;
*/  &lt;br /&gt;
   digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
   SPI.transfer(data);&lt;br /&gt;
   digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_sendData(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t data1 = data&amp;gt;&amp;gt;8;&lt;br /&gt;
  uint8_t data2 = data&amp;amp;0xff;&lt;br /&gt;
/*  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS =Low&lt;br /&gt;
  SPI_transfer(data1);&lt;br /&gt;
  SPI_transfer(data2);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
*/&lt;br /&gt;
   digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
   digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
   SPI.transfer(data1);&lt;br /&gt;
   SPI.transfer(data2);&lt;br /&gt;
   digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_WRITE_Package(uint16_t *data, uint8_t howmany)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t  data1 = 0;&lt;br /&gt;
  uint8_t   data2 = 0;&lt;br /&gt;
/*&lt;br /&gt;
  PORTC |= 0x08; // CD High&lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  uint8_t count=0;&lt;br /&gt;
  for(count=0;count&amp;lt;howmany;count++)&lt;br /&gt;
  {&lt;br /&gt;
      data1 = data[count]&amp;gt;&amp;gt;8;&lt;br /&gt;
      data2 = data[count]&amp;amp;0xff;&lt;br /&gt;
      SPI_transfer(data1);&lt;br /&gt;
      SPI_transfer(data2);&lt;br /&gt;
  }&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS&lt;br /&gt;
  */&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  uint8_t count=0;&lt;br /&gt;
  for(count=0;count&amp;lt;howmany;count++)&lt;br /&gt;
  {&lt;br /&gt;
      data1 = data[count]&amp;gt;&amp;gt;8;&lt;br /&gt;
      data2 = data[count]&amp;amp;0xff;&lt;br /&gt;
      SPI.transfer(data1);&lt;br /&gt;
      SPI.transfer(data2);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(13,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_backlight_on(void)&lt;br /&gt;
{&lt;br /&gt;
  //PORTC |= 0x20;  &lt;br /&gt;
  digitalWrite(2,HIGH); //led = = P6.0 = 2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_backlight_off(void)&lt;br /&gt;
{&lt;br /&gt;
  //PORTC &amp;amp;= 0xDF;//LED off&lt;br /&gt;
  digitalWrite(2,LOW); //led = = P6.0 = 2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_Read_Register(uint8_t Addr, uint8_t xParameter)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
  /*&lt;br /&gt;
  TFT_sendCMD(0xd9);                                                   &lt;br /&gt;
  TFT_WRITE_DATA(0x10+xParameter);&lt;br /&gt;
  PORTC &amp;amp;= 0xF7; // CD low                                   &lt;br /&gt;
  PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  SPI_transfer(Addr);&lt;br /&gt;
  PORTC |= 0x08; // CD high&lt;br /&gt;
  data = SPI_transfer(0);&lt;br /&gt;
  PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  */&lt;br /&gt;
  TFT_sendCMD(0xd9);                                                    /* ext command                */&lt;br /&gt;
  TFT_WRITE_DATA(0x10+xParameter);&lt;br /&gt;
  digitalWrite(31,LOW); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  SPI.transfer(Addr);&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  data = SPI.transfer(0);&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_TFTinit(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
    // PORTC &amp;amp;= 0xF7; // CD low&lt;br /&gt;
  digitalWrite(31,LOW); // CD = P3.7 = 31&lt;br /&gt;
  //PORTC &amp;amp;= 0xDF;//LED off&lt;br /&gt;
  digitalWrite(2,LOW); //led = = P6.0 = 2&lt;br /&gt;
  //PORTC &amp;amp;= 0xEF; // RST low&lt;br /&gt;
  digitalWrite(17,LOW); // RST = P5.7 = 17&lt;br /&gt;
      // b3=CPOL, b2=CPHA, b1=SPR1 b0=SPR0&lt;br /&gt;
      //SPCR &amp;amp;= ~((1&amp;lt;&amp;lt;CPOL) | (1&amp;lt;&amp;lt;CPHA)); // mode 0&lt;br /&gt;
      //SPCR |= (1&amp;lt;&amp;lt;SPR1); // poids faible division = 2&lt;br /&gt;
      //SPSR |= (1 &amp;lt;&amp;lt; 1); // poids fort division = 8&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
  SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
  SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV16);&lt;br /&gt;
  //SPI_transfer(0);  // Strawman transfer, fixes USCI issue on G2553&lt;br /&gt;
  SPI.transfer(0);&lt;br /&gt;
  //    PORTC |= 0x04; // SSEL=CS high ????&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  //    PORTC |= 0x08; // CD high&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  //    PORTC |= 3;  // DEBUG ou cela bloque-t-il ?&lt;br /&gt;
  uint8_t i=0, TFTDriver=0;&lt;br /&gt;
&lt;br /&gt;
  //PORTC &amp;amp;= 0xEF; // RST low&lt;br /&gt;
  digitalWrite(17,LOW); // RST = P5.7 = 17&lt;br /&gt;
  delay(10);&lt;br /&gt;
  //PORTC |= 0x10; // RST high&lt;br /&gt;
  digitalWrite(17,HIGH); // RST = P5.7 = 17&lt;br /&gt;
&lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
      TFTDriver = TFT_readID();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xCB);  &lt;br /&gt;
  TFT_WRITE_DATA(0x39);&lt;br /&gt;
  TFT_WRITE_DATA(0x2C);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x34);&lt;br /&gt;
  TFT_WRITE_DATA(0x02);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xCF);  &lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0XC1);&lt;br /&gt;
  TFT_WRITE_DATA(0X30);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xE8);  &lt;br /&gt;
  TFT_WRITE_DATA(0x85);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x78);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xEA);  &lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xED);  &lt;br /&gt;
  TFT_WRITE_DATA(0x64);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0X12);&lt;br /&gt;
  TFT_WRITE_DATA(0X81);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xF7);  &lt;br /&gt;
  TFT_WRITE_DATA(0x20);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC0);    //Power control&lt;br /&gt;
  TFT_WRITE_DATA(0x23);   //VRH[5:0]&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC1);    //Power control&lt;br /&gt;
  TFT_WRITE_DATA(0x10);   //SAP[2:0];BT[3:0]&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC5);    //VCM control&lt;br /&gt;
  TFT_WRITE_DATA(0x3e);   //Contrast&lt;br /&gt;
  TFT_WRITE_DATA(0x28);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xC7);    //VCM control2&lt;br /&gt;
  TFT_WRITE_DATA(0x86); //--&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x36);    // Memory Access Control&lt;br /&gt;
  TFT_WRITE_DATA(0x48);   //C8  //48 68绔栧睆//28 E8 妯睆&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x3A);    &lt;br /&gt;
  TFT_WRITE_DATA(0x55);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xB1);    &lt;br /&gt;
  TFT_WRITE_DATA(0x00);  &lt;br /&gt;
  TFT_WRITE_DATA(0x13);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xB6);    // Display Function Control&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x82);&lt;br /&gt;
  TFT_WRITE_DATA(0x27);  &lt;br /&gt;
 &lt;br /&gt;
  TFT_sendCMD(0xF2);    // 3Gamma Function Disable&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x26);    //Gamma curve selected&lt;br /&gt;
  TFT_WRITE_DATA(0x01);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0xE0);    //Set Gamma&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0x2B);&lt;br /&gt;
  TFT_WRITE_DATA(0x0C);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x4E);&lt;br /&gt;
  TFT_WRITE_DATA(0xF1);&lt;br /&gt;
  TFT_WRITE_DATA(0x37);&lt;br /&gt;
  TFT_WRITE_DATA(0x07);&lt;br /&gt;
  TFT_WRITE_DATA(0x10);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x09);&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0XE1);    //Set Gamma&lt;br /&gt;
  TFT_WRITE_DATA(0x00);&lt;br /&gt;
  TFT_WRITE_DATA(0x0E);&lt;br /&gt;
  TFT_WRITE_DATA(0x14);&lt;br /&gt;
  TFT_WRITE_DATA(0x03);&lt;br /&gt;
  TFT_WRITE_DATA(0x11);&lt;br /&gt;
  TFT_WRITE_DATA(0x07);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0xC1);&lt;br /&gt;
  TFT_WRITE_DATA(0x48);&lt;br /&gt;
  TFT_WRITE_DATA(0x08);&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
  TFT_WRITE_DATA(0x0C);&lt;br /&gt;
  TFT_WRITE_DATA(0x31);&lt;br /&gt;
  TFT_WRITE_DATA(0x36);&lt;br /&gt;
  TFT_WRITE_DATA(0x0F);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x11);    //Exit Sleep&lt;br /&gt;
  delay(120);&lt;br /&gt;
&lt;br /&gt;
  TFT_sendCMD(0x29);  //Display on&lt;br /&gt;
  TFT_sendCMD(0x2c);   &lt;br /&gt;
  TFT_fillScreen2();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_readID(void)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i=0;&lt;br /&gt;
  uint8_t data[3] ;&lt;br /&gt;
  uint8_t ID[3] = {0x00, 0x93, 0x41};&lt;br /&gt;
  uint8_t ToF=1;&lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
      data[i]=TFT_Read_Register(0xd3,i+1);&lt;br /&gt;
      if(data[i] != ID[i])&lt;br /&gt;
      {&lt;br /&gt;
          ToF=0;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  return ToF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setCol(uint16_t StartCol,uint16_t EndCol)&lt;br /&gt;
{&lt;br /&gt;
  TFT_sendCMD(0x2A);                                                    /* Column Command address     */&lt;br /&gt;
  TFT_sendData(StartCol);&lt;br /&gt;
  TFT_sendData(EndCol);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setPage(uint16_t StartPage,uint16_t EndPage)&lt;br /&gt;
{&lt;br /&gt;
  TFT_sendCMD(0x2B);                                                    /* Column Command address     */&lt;br /&gt;
  TFT_sendData(StartPage);&lt;br /&gt;
  TFT_sendData(EndPage);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillScreen(uint16_t XL, uint16_t XR, uint16_t YU, uint16_t YD, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  unsigned long  XY=0;&lt;br /&gt;
  unsigned long i=0;&lt;br /&gt;
&lt;br /&gt;
  if(XL &amp;gt; XR)&lt;br /&gt;
  {&lt;br /&gt;
      XL = XL^XR;&lt;br /&gt;
      XR = XL^XR;&lt;br /&gt;
      XL = XL^XR;&lt;br /&gt;
  }&lt;br /&gt;
  if(YU &amp;gt; YD)&lt;br /&gt;
  {&lt;br /&gt;
      YU = YU^YD;&lt;br /&gt;
      YD = YU^YD;&lt;br /&gt;
      YU = YU^YD;&lt;br /&gt;
  }&lt;br /&gt;
//*********** a redefinir la fonction constrain !!!!!!!!!!!!!!!!!!&lt;br /&gt;
  //XL = constrain(XL, MIN_X,MAX_X);&lt;br /&gt;
  //XR = constrain(XR, MIN_X,MAX_X);&lt;br /&gt;
  //YU = constrain(YU, MIN_Y,MAX_Y);&lt;br /&gt;
  //YD = constrain(YD, MIN_Y,MAX_Y);&lt;br /&gt;
&lt;br /&gt;
  XY = (XR-XL+1);&lt;br /&gt;
  XY = XY*(YD-YU+1);&lt;br /&gt;
&lt;br /&gt;
  TFT_setCol(XL,XR);&lt;br /&gt;
  TFT_setPage(YU, YD);&lt;br /&gt;
  TFT_sendCMD(0x2c);                                                /* start to write to display ra */&lt;br /&gt;
                                                                      /* m                          */&lt;br /&gt;
  //PORTC |= 0x08; // CD high&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
&lt;br /&gt;
  uint8_t Hcolor = color&amp;gt;&amp;gt;8;&lt;br /&gt;
  uint8_t Lcolor = color&amp;amp;0xff;&lt;br /&gt;
  for(i=0; i &amp;lt; XY; i++)&lt;br /&gt;
  {&lt;br /&gt;
      SPI.transfer(Hcolor);&lt;br /&gt;
      SPI.transfer(Lcolor);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillScreen2(void)&lt;br /&gt;
{&lt;br /&gt;
  uint16_t i;&lt;br /&gt;
  TFT_setCol(0, 239);&lt;br /&gt;
  TFT_setPage(0, 319);&lt;br /&gt;
  TFT_sendCMD(0x2c);                                                /* start to write to display ra */&lt;br /&gt;
                                                                      /* m                          */&lt;br /&gt;
  //PORTC |= 0x08; // CD high&lt;br /&gt;
  //PORTC &amp;amp;= 0xFB; // SSEL=CS low&lt;br /&gt;
  digitalWrite(31,HIGH); // CD = P3.7 = 31&lt;br /&gt;
  digitalWrite(13,LOW); //SSEL = CS = P3.6 = 13&lt;br /&gt;
  for(i=0; i&amp;lt;38400; i++)&lt;br /&gt;
  {&lt;br /&gt;
    /* SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);&lt;br /&gt;
      SPI_transfer(0);*/&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
      SPI.transfer(0);&lt;br /&gt;
  }&lt;br /&gt;
  //PORTC |= 0x04; // SSEL=CS high&lt;br /&gt;
  digitalWrite(13,HIGH); //SSEL = CS = P3.6 = 13&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void TFT_setXY(uint16_t poX, uint16_t poY)&lt;br /&gt;
{&lt;br /&gt;
  TFT_setCol(poX, poX);&lt;br /&gt;
  TFT_setPage(poY, poY);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_setPixel(uint16_t poX, uint16_t poY,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_setXY(poX, poY);&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawChar( uint8_t ascii, uint16_t poX, uint16_t poY,uint16_t size, uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  //fillRectangle(poX, poY, poX+FONT_X*size, poY+FONT_Y*size, BLACK);&lt;br /&gt;
  int i;&lt;br /&gt;
  uint8_t f;&lt;br /&gt;
&lt;br /&gt;
  if((ascii&amp;gt;=32)&amp;amp;&amp;amp;(ascii&amp;lt;=127))&lt;br /&gt;
  {&lt;br /&gt;
      ;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
      ascii = '?'-32;&lt;br /&gt;
  }&lt;br /&gt;
  for (i =0; i&amp;lt;FONT_X; i++ ) {&lt;br /&gt;
      uint8_t temp = simpleFont[ascii-0x20][i];&lt;br /&gt;
      for(f=0;f&amp;lt;8;f++)&lt;br /&gt;
      {&lt;br /&gt;
          if((temp&amp;gt;&amp;gt;f)&amp;amp;0x01)&lt;br /&gt;
          {&lt;br /&gt;
              TFT_fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);&lt;br /&gt;
          }&lt;br /&gt;
    else&lt;br /&gt;
  TFT_fillRectangle(poX+i*size, poY+f*size, size, size, bgcolor);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawString(char *string,uint16_t poX, uint16_t poY, uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  while(*string)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar(*string, poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      *string++;&lt;br /&gt;
&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);&lt;br /&gt;
void TFT_fillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_fillScreen(poX, poX+length, poY, poY+width, color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void  TFT_drawHorizontalLine( uint16_t poX, uint16_t poY,&lt;br /&gt;
uint16_t length,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  TFT_setCol(poX,poX + length);&lt;br /&gt;
  TFT_setPage(poY,poY);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
  for(i=0; i&amp;lt;length; i++)&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int abs(int data) {&lt;br /&gt;
  if (data &amp;gt; 0) return data; else return -data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  int x = x1-x0;&lt;br /&gt;
  int y = y1-y0;&lt;br /&gt;
  int dx = abs(x), sx = x0&amp;lt;x1 ? 1 : -1;&lt;br /&gt;
  int dy = -abs(y), sy = y0&amp;lt;y1 ? 1 : -1;&lt;br /&gt;
  int err = dx+dy, e2;                                              /* error value e_xy           */&lt;br /&gt;
  for (;;){                                                         /* loop                       */&lt;br /&gt;
      TFT_setPixel(x0,y0,color);&lt;br /&gt;
      e2 = 2*err;&lt;br /&gt;
      if (e2 &amp;gt;= dy) {                                               /* e_xy+e_x &amp;gt; 0               */&lt;br /&gt;
          if (x0 == x1) break;&lt;br /&gt;
          err += dy; x0 += sx;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;lt;= dx) {                                               /* e_xy+e_y &amp;lt; 0               */&lt;br /&gt;
          if (y0 == y1) break;&lt;br /&gt;
          err += dx; y0 += sy;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawVerticalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  TFT_setCol(poX,poX);&lt;br /&gt;
  TFT_setPage(poY,poY+length);&lt;br /&gt;
  TFT_sendCMD(0x2c);&lt;br /&gt;
  for(i=0; i&amp;lt;length; i++)&lt;br /&gt;
  TFT_sendData(color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_drawHorizontalLine(poX, poY, length, color);&lt;br /&gt;
  TFT_drawHorizontalLine(poX, poY+width, length, color);&lt;br /&gt;
  TFT_drawVerticalLine(poX, poY, width,color);&lt;br /&gt;
  TFT_drawVerticalLine(poX + length, poY, width,color);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawCircle(int poX, int poY, int r,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int x = -r, y = 0, err = 2-2*r, e2;&lt;br /&gt;
  do {&lt;br /&gt;
      TFT_setPixel(poX-x, poY+y,color);&lt;br /&gt;
      TFT_setPixel(poX+x, poY+y,color);&lt;br /&gt;
      TFT_setPixel(poX+x, poY-y,color);&lt;br /&gt;
      TFT_setPixel(poX-x, poY-y,color);&lt;br /&gt;
      e2 = err;&lt;br /&gt;
      if (e2 &amp;lt;= y) {&lt;br /&gt;
          err += ++y*2+1;&lt;br /&gt;
          if (-x == y &amp;amp;&amp;amp; e2 &amp;lt;= x) e2 = 0;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;gt; x) err += ++x*2+1;&lt;br /&gt;
  } while (x &amp;lt;= 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_fillCircle(int poX, int poY, int r,uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  int x = -r, y = 0, err = 2-2*r, e2;&lt;br /&gt;
  do {&lt;br /&gt;
&lt;br /&gt;
      TFT_drawVerticalLine(poX-x, poY-y, 2*y, color);&lt;br /&gt;
      TFT_drawVerticalLine(poX+x, poY-y, 2*y, color);&lt;br /&gt;
&lt;br /&gt;
      e2 = err;&lt;br /&gt;
      if (e2 &amp;lt;= y) {&lt;br /&gt;
          err += ++y*2+1;&lt;br /&gt;
          if (-x == y &amp;amp;&amp;amp; e2 &amp;lt;= x) e2 = 0;&lt;br /&gt;
      }&lt;br /&gt;
      if (e2 &amp;gt; x) err += ++x*2+1;&lt;br /&gt;
  } while (x &amp;lt;= 0);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TFT_drawTraingle( int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, uint16_t color)&lt;br /&gt;
{&lt;br /&gt;
  TFT_drawLine(poX1, poY1, poX2, poY2,color);&lt;br /&gt;
  TFT_drawLine(poX1, poY1, poX3, poY3,color);&lt;br /&gt;
  TFT_drawLine(poX2, poY2, poX3, poY3,color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_drawNumber(long long_num,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t char_buffer[10] = &amp;quot;&amp;quot;;&lt;br /&gt;
  uint8_t i = 0;&lt;br /&gt;
  uint8_t f = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (long_num &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
      f=1;&lt;br /&gt;
      TFT_drawChar('-',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      long_num = -long_num;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  else if (long_num == 0)&lt;br /&gt;
  {&lt;br /&gt;
      f=1;&lt;br /&gt;
      TFT_drawChar('0',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      return f;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX += FONT_SPACE*size;                                   /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  while (long_num &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
      char_buffer[i++] = long_num % 10;&lt;br /&gt;
      long_num /= 10;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  f = f+i;&lt;br /&gt;
  for(; i &amp;gt; 0; i--)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('0'+ char_buffer[i - 1],poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t TFT_drawFloat(float floatNumber,uint8_t decimal,uint16_t poX, uint16_t poY,uint16_t size,uint16_t fgcolor, uint16_t bgcolor)&lt;br /&gt;
{&lt;br /&gt;
  uint16_t temp=0;&lt;br /&gt;
  float decy=0.0;&lt;br /&gt;
  float rounding = 0.5;&lt;br /&gt;
  uint8_t f=0;&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
  if(floatNumber&amp;lt;0.0)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('-',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      floatNumber = -floatNumber;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      f =1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i=0; i&amp;lt;decimal; ++i)&lt;br /&gt;
  {&lt;br /&gt;
      rounding /= 10.0;&lt;br /&gt;
  }&lt;br /&gt;
  floatNumber += rounding;&lt;br /&gt;
&lt;br /&gt;
  temp = (uint16_t)floatNumber;&lt;br /&gt;
  uint8_t howlong=TFT_drawNumber(temp,poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
  f += howlong;&lt;br /&gt;
  if((poX+8*size*howlong) &amp;lt; MAX_X)&lt;br /&gt;
  {&lt;br /&gt;
      poX+=FONT_SPACE*size*howlong;                                 /* Move cursor right          */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if(decimal&amp;gt;0)&lt;br /&gt;
  {&lt;br /&gt;
      TFT_drawChar('.',poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      f +=1;&lt;br /&gt;
  }&lt;br /&gt;
  decy = floatNumber-temp;                                          /* decimal part,  4           */&lt;br /&gt;
  for(i=0;i&amp;lt;decimal;i++)                                   &lt;br /&gt;
  {&lt;br /&gt;
      decy *=10;                                                    /* for the next decimal       */&lt;br /&gt;
      temp = decy;                                                  /* get the decimal            */&lt;br /&gt;
      TFT_drawNumber(temp,poX, poY, size, fgcolor, bgcolor);&lt;br /&gt;
      floatNumber = -floatNumber;&lt;br /&gt;
      if(poX &amp;lt; MAX_X)&lt;br /&gt;
      {&lt;br /&gt;
          poX+=FONT_SPACE*size;                                     /* Move cursor right          */&lt;br /&gt;
      }&lt;br /&gt;
      decy -= temp;&lt;br /&gt;
  }&lt;br /&gt;
  f +=decimal;&lt;br /&gt;
  return f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mousecam_reset()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_RESET,HIGH);&lt;br /&gt;
  delay(1); // reset pulse &amp;gt;10us&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_RESET,LOW);&lt;br /&gt;
  delay(35); // 35ms from reset to functional&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int mousecam_init()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(PIN_MOUSECAM_RESET,OUTPUT);&lt;br /&gt;
  pinMode(PIN_MOUSECAM_CS,OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  mousecam_reset();&lt;br /&gt;
  &lt;br /&gt;
  int pid = mousecam_read_reg(ADNS3080_PRODUCT_ID);&lt;br /&gt;
  if(pid != ADNS3080_PRODUCT_ID_VAL)&lt;br /&gt;
    return -1;&lt;br /&gt;
&lt;br /&gt;
  // turn on sensitive mode&lt;br /&gt;
  mousecam_write_reg(ADNS3080_CONFIGURATION_BITS, 0x19);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mousecam_write_reg(int reg, int val)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(reg | 0x80);&lt;br /&gt;
  SPI.transfer(val);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH);&lt;br /&gt;
  delayMicroseconds(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int mousecam_read_reg(int reg)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(reg);&lt;br /&gt;
  delayMicroseconds(75);&lt;br /&gt;
  int ret = SPI.transfer(0xff);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(1);&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mousecam_read_motion(struct MD *p)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  SPI.transfer(ADNS3080_MOTION_BURST);&lt;br /&gt;
  delayMicroseconds(75);&lt;br /&gt;
  p-&amp;gt;motion =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;dx =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;dy =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;squal =  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;shutter =  SPI.transfer(0xff)&amp;lt;&amp;lt;8;&lt;br /&gt;
  p-&amp;gt;shutter |=  SPI.transfer(0xff);&lt;br /&gt;
  p-&amp;gt;max_pix =  SPI.transfer(0xff);&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// pdata must point to an array of size ADNS3080_PIXELS_X x ADNS3080_PIXELS_Y&lt;br /&gt;
// you must call mousecam_reset() after this if you want to go back to normal operation&lt;br /&gt;
int mousecam_frame_capture(byte *pdata)&lt;br /&gt;
{&lt;br /&gt;
  mousecam_write_reg(ADNS3080_FRAME_CAPTURE,0x83);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS, LOW);&lt;br /&gt;
  &lt;br /&gt;
  SPI.transfer(ADNS3080_PIXEL_BURST);&lt;br /&gt;
  delayMicroseconds(50);&lt;br /&gt;
  &lt;br /&gt;
  int pix;&lt;br /&gt;
  byte started = 0;&lt;br /&gt;
  int count;&lt;br /&gt;
  int timeout = 0;&lt;br /&gt;
  int ret = 0;&lt;br /&gt;
  for(count = 0; count &amp;lt; ADNS3080_PIXELS_X * ADNS3080_PIXELS_Y; )&lt;br /&gt;
  {&lt;br /&gt;
    pix = SPI.transfer(0xff);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    if(started==0)&lt;br /&gt;
    {&lt;br /&gt;
      if(pix&amp;amp;0x40)&lt;br /&gt;
        started = 1;&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        timeout++;&lt;br /&gt;
        if(timeout==100)&lt;br /&gt;
        {&lt;br /&gt;
          ret = -1;&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if(started==1)&lt;br /&gt;
    {&lt;br /&gt;
      pdata[count++] = (pix &amp;amp; 0x3f)&amp;lt;&amp;lt;2; // scale to normal grayscale byte range&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(PIN_MOUSECAM_CS,HIGH); &lt;br /&gt;
  delayMicroseconds(14);&lt;br /&gt;
  &lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Robotique mobile : Coupe de France des IUT GEII 2020 =&lt;br /&gt;
Il s'agit donc de préparer un robot pour la Coupe de France des IUT GEII 2020. Pour voir de quoi il s'agit, vous pouvez regarder [http://www.festivalrobotiquecachan.fr/edition-2019/coupe-de-france-des-iut-geii-2019/ la version 2019 ICI].&lt;br /&gt;
&lt;br /&gt;
Le règlement 2020 est disponible. Il a été validé lors de la réunion du 17 octobre 2019 à Cachan par l'ensemble des participant :&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1JnPi6Ug5wbRR7LcKigHnS9gUkkDZYa6v/view?usp=sharing Reglement 2020]&lt;br /&gt;
&lt;br /&gt;
Les principales nouveautés pour 2020 sont :&lt;br /&gt;
&lt;br /&gt;
*Les étudiants de Licence Pro ont le droit de participer.&lt;br /&gt;
&lt;br /&gt;
*Plus besoin d'être au filet pour marquer des points. Les robots doivent toujours crever un ballon pour valider leur score, mais il n'est plus nécessaire d'être dans la bande du filet pour marquer, il suffit juste que le robot soit arrêté, où que se soit, et qu'il ne bouge plus pour avoir le droit de crever le ballon. En revanche, le faire au filet rapporte 3 points supplémentaires.&lt;br /&gt;
&lt;br /&gt;
*La base mobile du robot (châssis, moteurs, transmissions, roues et batterie) n'est plus obligatoire, elle est juste recommandée, mais on peut utiliser tout type de moteur, châssis, roue, transmission ou batterie à condition qu'ils respectent les contraintes du règlement :&lt;br /&gt;
*Pas plus de 24V de tension dans le robot.&lt;br /&gt;
*Pas plus de 2 roues motrices.&lt;br /&gt;
*Le seul contact entre les roues motrices et le sol doit obligatoirement être un joint torique de référence Oring 133610.&lt;br /&gt;
*Pas de batteries Lithium Polymère, ou Lithium Cobalt (voir tous les détails concernant les batteries en technologie Lithium dans le règlement).&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
*[https://www.youtube.com/watch?v=JPPTRj0KWbg TB6612FNG H-Bridge Motor Controller - Better than L298N?]&lt;br /&gt;
*[https://fr.wikiversity.org/wiki/Micro_contr%C3%B4leurs_AVR/Travail_pratique/Utilisation_du_MPU9250 Utilisation du MPU9250 (9DOF)]&lt;br /&gt;
&lt;br /&gt;
=Projet robotique mobile : challenge GEII/GMP=&lt;br /&gt;
La réalisation de ce projet nécessitera deux binômes.&lt;br /&gt;
* un binôme s'occupera du déplacement et de ramener les cylindres dans notre camp&lt;br /&gt;
* l'autre binôme sera responsable de l'empilement des cylindres&lt;br /&gt;
Ce projet devra être complètement fonctionnel en fin de S3 à l'aide de deux télécommandes.&lt;br /&gt;
&lt;br /&gt;
Il sera poursuivi sur S4 avec comme objectif de le rendre autonome.&lt;br /&gt;
&lt;br /&gt;
{{Aide|Comment commencer ?}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous devez essayer de rédiger avec le plus de détail (pas forcément technique) un scénario décrivant l'exécution du challenge. Pour vous aider dans vos démarches, [[Media:Réglement_RM_V20.pdf|Le règlement 2020]] est consultable maintenant.&lt;br /&gt;
&lt;br /&gt;
{{finAide}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Indications : Utilisation d'un moteur pas à pas==&lt;br /&gt;
===Utilisation du shield CNC===&lt;br /&gt;
Ce [http://osoyoo.com/2017/04/07/arduino-uno-cnc-shield-v3-0-a4988/ shield CNC] est en principe dédié aux imprimantes 3D et notre version utilise la commande de puissance A4988. Nous utilisons la partie réservée à l'axe Y. Trois broches sont nécessaires :&lt;br /&gt;
* une broche pour choisir la direction de rotation (dirY dans notre code)&lt;br /&gt;
* une broche pour envoyer les impultions (pulseY dans notre code)&lt;br /&gt;
* unz broche pour valider le fonctionnement (stepperEN dans notre code)&lt;br /&gt;
Les positions de ces trois broches sont déterminées par le shield.&lt;br /&gt;
Voici le code Arduino correspondant :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const uint8_t dirY = 6;&lt;br /&gt;
const uint8_t pulseY=3;&lt;br /&gt;
const uint8_t stepperEN=8;&lt;br /&gt;
&lt;br /&gt;
uint8_t dir = 0;&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
 pinMode(dirY,OUTPUT);&lt;br /&gt;
 pinMode(pulseY,OUTPUT);&lt;br /&gt;
 pinMode(stepperEN,OUTPUT);&lt;br /&gt;
 digitalWrite(stepperEN,LOW);&lt;br /&gt;
 digitalWrite(dirY,dir);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  static uint16_t step=0;&lt;br /&gt;
  digitalWrite(pulseY,HIGH);&lt;br /&gt;
  digitalWrite(pulseY,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  step++;&lt;br /&gt;
  if (step&amp;gt;200) {&lt;br /&gt;
    step=0;&lt;br /&gt;
    dir ^= 1;&lt;br /&gt;
    digitalWrite(dirY,dir);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Il est possible de n'utiliser que la partie électronique de puissance A4988 seule et de faire un circuit pour le relier à un Arduino nano.&lt;br /&gt;
&lt;br /&gt;
Nous étudierons une autre possibilité avec un [https://www.instructables.com/id/Control-DC-and-stepper-motors-with-L298N-Dual-Moto/ L298N].&lt;br /&gt;
&lt;br /&gt;
===Étude du L298N===&lt;br /&gt;
&lt;br /&gt;
La carte [https://www.instructables.com/id/Control-DC-and-stepper-motors-with-L298N-Dual-Moto/ L298N et son utilisation est présentée ICI]. Il est donc facile de l'utiliser surtout associé à la [https://github.com/arduino-libraries/Stepper librairie Stepper (github)]. Le seul problème rencontré était dû au fait que la masse de l'Arduino et la masse du L298N n'étaient pas reliées.&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
*[https://fr.wikiversity.org/wiki/Micro_contr%C3%B4leurs_AVR/Travail_pratique/Utilisation_du_MPU9250 Utilisation du MPU9250 (9DOF)]&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13692</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13692"/>
				<updated>2020-10-02T09:32:17Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(3));                     &lt;br /&gt;
END arch_add4;&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout); -- câblé mais inutile dans XS3&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13691</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13691"/>
				<updated>2020-10-02T09:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(3));                     &lt;br /&gt;
END arch_add4;&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= '1' XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= '0' XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout); -- câblé mais inutile dans XS3&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13690</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13690"/>
				<updated>2020-10-02T09:11:28Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 2/10/20&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(3));                     &lt;br /&gt;
END arch_add4;&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= B(2) XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= B(3) XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout);&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13689</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13689"/>
				<updated>2020-10-02T09:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(3));                     &lt;br /&gt;
END arch_add4;&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= B(2) XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= B(3) XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout);&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13688</id>
		<title>Cours:TP M1102 TP 3 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_3_Corr&amp;diff=13688"/>
				<updated>2020-10-02T08:52:45Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP 3=&lt;br /&gt;
==Exercice 1==&lt;br /&gt;
===Question 1===&lt;br /&gt;
La table de vérité donnée dans wikipédia est :&lt;br /&gt;
{| class=&amp;quot;wikitable centre&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | A&lt;br /&gt;
! scope=col | B&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | S&lt;br /&gt;
! scope=col | C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||0||1||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||0||1||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||0||'''1'''||'''0'''&lt;br /&gt;
|-&lt;br /&gt;
||1||0||1||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||0||'''0'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous allons la modifier légèrement pour ses entrées et sorties : les 3 entrées sont regroupées et les 2 sorties sont aussi regroupées ensemble&lt;br /&gt;
&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' :&lt;br /&gt;
Nous avons aussi volontairement changé l'ordre ses entrées et des sorties.Il est préférable d'avoir les sorties dans ce sens pour avoir le poids fort des deux bits de sortie à gauche. Pour les entrées c'est moins important.&lt;br /&gt;
&lt;br /&gt;
Voici le fichier VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--vérifié OK le 2/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le fichier de contraintes associé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
e[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
e[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
e[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
s[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
s[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Il faut déjà définir les entrées et sorties de notre problème, autrement dit définir l'entité. Parmi les diverses solutions possibles, nous allons choisir &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'on compare au schéma de l'énoncé :&lt;br /&gt;
&lt;br /&gt;
[[File:Ripplecarryadder.png|centre|Additionneur à propagation de retenue.]]&lt;br /&gt;
&lt;br /&gt;
on impose ainsi les correspondances suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Schéma''' &amp;lt;-&amp;gt; '''VHDL'''&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Entrée&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; Cin&lt;br /&gt;
* A&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(3)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(2)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(1)&lt;br /&gt;
* A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; A(0)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(3)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(2)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(1)&lt;br /&gt;
* B&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; B(0)&lt;br /&gt;
* R&amp;lt;sub&amp;gt;Sortie&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(4)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(3)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(2)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(1)&lt;br /&gt;
* S&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;lt;-&amp;gt; S(0)&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY add4 IS&lt;br /&gt;
PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
      S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
END add4;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_add4 of add4 IS&lt;br /&gt;
&lt;br /&gt;
  COMPONENT add1bit IS PORT(&lt;br /&gt;
    e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
    s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
  END COMPONENT add1bit;&lt;br /&gt;
&lt;br /&gt;
  SIGNAL R1, R2, R3 : std_logic; --fils internes non nommés dans le schéma : R1 à droite&lt;br /&gt;
BEGIN&lt;br /&gt;
  i0: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; Cin,&lt;br /&gt;
                 e(1) =&amp;gt; B(0),&lt;br /&gt;
                 e(0) =&amp;gt; A(0),&lt;br /&gt;
                 S(1) =&amp;gt; R1,&lt;br /&gt;
                 S(0) =&amp;gt; S(0)); --Il n'y a aucune ambiguité pour VHDL ici&lt;br /&gt;
  i1: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R1,&lt;br /&gt;
                 e(1) =&amp;gt; B(1),&lt;br /&gt;
                 e(0) =&amp;gt; A(1),&lt;br /&gt;
                 S(1) =&amp;gt; R2,&lt;br /&gt;
                 S(0) =&amp;gt; S(1));&lt;br /&gt;
  i2: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R2,&lt;br /&gt;
                 e(1) =&amp;gt; B(2),&lt;br /&gt;
                 e(0) =&amp;gt; A(2),&lt;br /&gt;
                 S(1) =&amp;gt; R3,&lt;br /&gt;
                 S(0) =&amp;gt; S(2));&lt;br /&gt;
  i3: add1bit PORT MAP(&lt;br /&gt;
                 e(2) =&amp;gt; R3,&lt;br /&gt;
                 e(1) =&amp;gt; B(3),&lt;br /&gt;
                 e(0) =&amp;gt; A(3),&lt;br /&gt;
                 S(1) =&amp;gt; S(4),&lt;br /&gt;
                 S(0) =&amp;gt; S(1));                     &lt;br /&gt;
END arch_add4&lt;br /&gt;
&lt;br /&gt;
--******** Composant à câbler *********&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
ENTITY add1bit IS PORT(&lt;br /&gt;
  e : in std_logic_vector(2 downto 0); -- Cin, B, A&lt;br /&gt;
  s : out std_logic_vector(1 downto 0)); -- Cout, S&lt;br /&gt;
END add1bit;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch of add1bit IS &lt;br /&gt;
BEGIN&lt;br /&gt;
  with e select&lt;br /&gt;
    S &amp;lt;= &amp;quot;00&amp;quot; when &amp;quot;000&amp;quot;, --0+0+0=00&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;001&amp;quot;, --0+0+1=01&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;010&amp;quot;, --0+1+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;011&amp;quot;, --0+1+1=10&lt;br /&gt;
         &amp;quot;01&amp;quot; when &amp;quot;100&amp;quot;, --1+0+0=01&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;101&amp;quot;, --1+0+1=10&lt;br /&gt;
         &amp;quot;10&amp;quot; when &amp;quot;110&amp;quot;, --1+1+0=10&lt;br /&gt;
         &amp;quot;11&amp;quot; when others;--1+1+1=11&lt;br /&gt;
END arch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de contraintes peut être simpllifié à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Il n'est pas inutile de comprendre ce que fait le schéma de l'énoncé, en particulier la présence des OU EXCLUSIFs.&lt;br /&gt;
&lt;br /&gt;
*Passer du binaire au code EXCESS-3 revient à ajouter 3, d'où la présence de l'additionneur avec les entrées (B3,B2,B1,B0) fixées à (GND,GND,Vcc,Vcc) c'est à dire (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire 3. C'est vrai que l'on passe à travers des OU EXCLUSIFs mais si vous mettez le '''Cin Global à 0 les OU EXCLUSIFS sont équivalents à des fils simples''' !!!!&lt;br /&gt;
* Si vous mettez le Cin Global à 1, les OU EXCLUSIFS sont équivalents à des inverseurs logiques ce qui rentre donc dans (B3,B2,B1,B0) est (0,0,1,1)&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; c'est à dire le complément bit à bit de 3&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; + la retenue Cin = 1. On fait donc un complément logique bit à bit auquel on ajoute un et cela s'appelle un complément à deux qui revient à faire une soustraction.&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude la résolution du problème passe par la définition des entrées/sorties c'est à dire de l'entité. On vous propose donc l'entité suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
&lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4 : S(4)&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc le code VHDL global :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE; &lt;br /&gt;
use IEEE.std_logic_1164.all; &lt;br /&gt;
--use IEEE.std_logic_arith.all; &lt;br /&gt;
--use IEEE.STD_LOGIC_UNSIGNED.all;&lt;br /&gt;
 &lt;br /&gt;
ENTITY XS3Reversible IS&lt;br /&gt;
PORT (E : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
      Cin : IN STD_LOGIC; --retenue pour choix du sens de codage&lt;br /&gt;
      Cout : OUT STD_LOGIC; -- il y a une retenue en sortie de add4&lt;br /&gt;
      s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); &lt;br /&gt;
END XS3Reversible;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_XS3Reversible OF XS3Reversible IS&lt;br /&gt;
--Question 2 de l'exercice 1&lt;br /&gt;
  COMPONENT add4 IS&lt;br /&gt;
  PORT (A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
        Cin : IN STD_LOGIC; --retenue entrée dans le schéma&lt;br /&gt;
        S : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --retenue en S(4)&lt;br /&gt;
  END COMPONENT add4;&lt;br /&gt;
-- fils internes entre les sorties des ou exclusifs et les entrées B(i) de l'additionneur&lt;br /&gt;
  SIGNAL s_B : STD_LOGIC_VECTOR(3 DOWNTO 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Fabrication des fils internes avec les OU EXCLUSIFs&lt;br /&gt;
  s_B(0) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(1) &amp;lt;= B(0) XOR Cin;&lt;br /&gt;
  s_B(2) &amp;lt;= B(2) XOR Cin;&lt;br /&gt;
  s_B(3) &amp;lt;= B(3) XOR Cin;&lt;br /&gt;
  -- cablage du 7483 = add4&lt;br /&gt;
  i0: add4 PORT MAP(&lt;br /&gt;
              A =&amp;gt; E,&lt;br /&gt;
              B =&amp;gt; s_B,&lt;br /&gt;
              Cin =&amp;gt; Cin,&lt;br /&gt;
              S(3 DOWNTO 0) =&amp;gt; S,&lt;br /&gt;
              S(4) =&amp;gt; Cout);&lt;br /&gt;
END arch_XS3Reversible;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auquel vous ajoutez votre code de l'exercice 1 (question 2) ou le code plus compact de l'énoncé qui a la même entité.&lt;br /&gt;
&lt;br /&gt;
Le fichier de contrainte peut être simplifié à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
E[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
E[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
E[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
E[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cin,Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
S[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
S[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
S[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
Cout,Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
===Première partie===&lt;br /&gt;
Le comparateur très simplifié est donné maintenant :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity COMPM4_exo3 is &lt;br /&gt;
port(&lt;br /&gt;
    GT  : out std_logic;&lt;br /&gt;
    LT  : out std_logic;&lt;br /&gt;
&lt;br /&gt;
    A  : in std_logic_vector(3 downto 0);&lt;br /&gt;
    B  : in std_logic_vector(3 downto 0);&lt;br /&gt;
  );&lt;br /&gt;
end COMPM4_exo3;&lt;br /&gt;
&lt;br /&gt;
architecture COMPM4_exo3_V of COMPM4_exo3 is &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
   GT &amp;lt;= '1' when (A &amp;gt; B ) else '0';&lt;br /&gt;
   LT &amp;lt;= '1' when (A &amp;lt; B) else '0';&lt;br /&gt;
     &lt;br /&gt;
end COMPM4_exo3_V;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce comparateur peut être essayé tout seul avec le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
A[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
A[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
A[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
A[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[0],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[1],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[2],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
B[3],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
GT,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
LT,Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Deuxième partie===&lt;br /&gt;
; Table de vérité du comparateur à 9&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|Entrées||colspan=&amp;quot;1&amp;quot;|Sorties&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''A3'''||'''A2'''||'''A1'''||'''A0'''||'''GT'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||0||0 &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||0||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|0||1||1||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||0||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||0||1||0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||0||1||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||0||1||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||0||1&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|1||1||1||1||1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le programme VHDL est donc :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
  with A select&lt;br /&gt;
    GT &amp;lt;= '1' WHEN &amp;quot;1010&amp;quot;|&amp;quot;1011&amp;quot;|&amp;quot;1100&amp;quot;|&amp;quot;1101&amp;quot;|&amp;quot;1110&amp;quot;|&amp;quot;1111&amp;quot;,&lt;br /&gt;
          '0' WHEN OTHERS;&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant pour l'équation simplifiée, on remplit le tableau de Karnaugh :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Table de Karnaugh&lt;br /&gt;
!S&lt;br /&gt;
!A1 A0&lt;br /&gt;
!00&lt;br /&gt;
!01&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
|- style = &amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|A3 A2&lt;br /&gt;
|    \&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|00&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|01&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ce tableau de Karnaugh donne l'équation simplifiée :&lt;br /&gt;
GT = A3.A2 + A3.A1&lt;br /&gt;
&lt;br /&gt;
Soit en VHDL :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library ieee;&lt;br /&gt;
use ieee.std_logic_1164.all;&lt;br /&gt;
--use ieee.std_logic_arith.all;&lt;br /&gt;
--use ieee.std_logic_unsigned.all;&lt;br /&gt;
&lt;br /&gt;
entity comp9 is port(&lt;br /&gt;
  A : in std_logic_vector(3 downto 0); -- 8 entrées pour deux digits en entree&lt;br /&gt;
  GT out std_logic); -- deux digits de 7 segments en sortie&lt;br /&gt;
end exo4a;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE behavior OF comp9 IS&lt;br /&gt;
  &lt;br /&gt;
BEGIN&lt;br /&gt;
   GT &amp;lt;= (A(3) AND A(2)) OR (A(3) AND A(1));&lt;br /&gt;
END behavior;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
La synthèse en MUX n'a pas beaucoup d'intérêt avec les FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui voudraient s'y lancer, nous vous rappelons que le principe est le suivant :&lt;br /&gt;
*On câble les entrées sur les entrées de sélections (ici &amp;quot;sel&amp;quot;)&lt;br /&gt;
*on met les 1 et 0 sur les entrées 8 entrées du multiplexeur dans l'ordre de la table de vérité si nos poids sur &amp;quot;sel&amp;quot; ont été choisi dans le même ordre que le table de vérité.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la&lt;br /&gt;
; Table de vérité&lt;br /&gt;
:{| border cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;150&amp;quot;&lt;br /&gt;
|- style = &amp;quot;background:#b3e2d1;text-align:center&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot;|Entrées||colspan=&amp;quot;2&amp;quot;|Sorties &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|'''e(2)=C&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;'''||'''e(1)=B'''||'''e(0)=A'''||'''S(1)=C&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;'''||'''S(0)=S'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||0||'''0'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||0||1||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||0||1||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||0||'''0'''||'''1'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||0||1||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||0||'''1'''||'''0'''&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||1||1||1||'''1'''||'''1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
sera réalisé en câblant e(2) sur sel(2), e(1) sur sel(1) et e(0) sur sel(0) pour les deux multiplexeurs (ben oui il y a deux sorties donc deux multiplexeurs).&lt;br /&gt;
&lt;br /&gt;
Alors la première colonne S(1) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) tandis que la deuxième colonne S(0) de la table de vérité ira dans l'ordre sur e(0),e(1),...,e(7) du deuxième mux.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13687</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13687"/>
				<updated>2020-10-01T15:54:34Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
Il est simple de réaliser un compteur/décompteur avec des LPM. Si on veut le faire en VHDL, cela a été fait avec un compteur/décompteur décimal en exercice 4 du TP 5.&lt;br /&gt;
&lt;br /&gt;
Ainsi, &lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	     if EN='1' then&lt;br /&gt;
	       if du='1' then&lt;br /&gt;
	         if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	         end if;&lt;br /&gt;
		    else &lt;br /&gt;
	         if cmpt=&amp;quot;0000&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;1001&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt - 1;&lt;br /&gt;
	         end if;	&lt;br /&gt;
          end if;&lt;br /&gt;
        end if;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
doit se simplifier en :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if(rising_edge(Clock)) then&lt;br /&gt;
        if EN='1' then&lt;br /&gt;
          if du='1' then&lt;br /&gt;
            cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
          else&lt;br /&gt;
            cmpt &amp;lt;= cmpt - 1;	&lt;br /&gt;
          end if; --if du='1'&lt;br /&gt;
        end if; --if EN='1'&lt;br /&gt;
     end if;-- if(rising_edge(Clock))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
si on retire la gestion du reset. La gestion du '''EN''' pourrait elle aussi être retirée.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13686</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13686"/>
				<updated>2020-10-01T15:53:06Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
Il est simple de réaliser un compteur/décompteur avec des LPM. Si on veut le faire en VHDL, cela a été fait avec un compteur/décompteur décimal en exercice 4 du TP 5.&lt;br /&gt;
&lt;br /&gt;
Ainsi, &lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if Reset='1' then&lt;br /&gt;
         cmpt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      elsif(rising_edge(Clock)) then&lt;br /&gt;
 	     if EN='1' then&lt;br /&gt;
	       if du='1' then&lt;br /&gt;
	         if cmpt=&amp;quot;1001&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;0000&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
	         end if;&lt;br /&gt;
		    else &lt;br /&gt;
	         if cmpt=&amp;quot;0000&amp;quot; then&lt;br /&gt;
	           cmpt&amp;lt;=&amp;quot;1001&amp;quot;;&lt;br /&gt;
	         else&lt;br /&gt;
	           cmpt &amp;lt;= cmpt - 1;&lt;br /&gt;
	         end if;	&lt;br /&gt;
          end if;&lt;br /&gt;
        end if;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
doit se simplifier en :&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
      if(rising_edge(Clock)) then&lt;br /&gt;
        if EN='1' then&lt;br /&gt;
          if du='1' then&lt;br /&gt;
            cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
          else&lt;br /&gt;
            cmpt &amp;lt;= cmpt - 1;	&lt;br /&gt;
          end if; --if du='1'&lt;br /&gt;
        end if; --if EN='1'&lt;br /&gt;
     end if;-- if(rising_edge(Clock))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
si on retire la gestion du reset.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13685</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13685"/>
				<updated>2020-10-01T15:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
Il est simple de réaliser un compteur/décompteur avec des LPM. Si on veut le faire en VHDL, cela a été fait avec un compteur/décompteur décimal en exercice 4 du TP 5.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13684</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13684"/>
				<updated>2020-10-01T15:46:10Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 et 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 4===&lt;br /&gt;
Il est simple de réalise un compteur/décompteur avec des LPM. Si on veut le faire en VHDL, cela a été fait avec un compteur/décompteur décimal en exercice 4 du TP 5.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13683</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13683"/>
				<updated>2020-10-01T15:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Il y a 9 valeurs possibles pour les sorties : 0,1,2,3,4,5,6,7,8 leds allumées. On doit donc choisir un bis d'adresse de 4 bits. Cela revient donc à utiliser le même type de mémoire que ce que l'on a utilisé jusqu'à présent :&lt;br /&gt;
&amp;lt;source lang = VHDL&amp;gt;&lt;br /&gt;
lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8, -- 8 bits de données&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4) -- 4 bits de bus d'adresse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2 et 3===&lt;br /&gt;
On a plutôt utilisé un compteur qui compte de 0 à 15 et on préfère doubler quelques affichage. Cela revient à peu près à ne pas tenir compte du poids faible. A peu près car ce n'est pas vrai pour 0 et pour 8. Voici donc le contenu de la mémoire :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 00;&lt;br /&gt;
0001  : 01;&lt;br /&gt;
0002  : 01;&lt;br /&gt;
0003  : 03;&lt;br /&gt;
0004  : 03;&lt;br /&gt;
0005  : 07;&lt;br /&gt;
0006  : 07;&lt;br /&gt;
0007  : 0f;&lt;br /&gt;
0008  : 0f;&lt;br /&gt;
0009  : 1f;&lt;br /&gt;
000a  : 1f;&lt;br /&gt;
000b  : 3f;&lt;br /&gt;
000c  : 3f;&lt;br /&gt;
000d  : 7f;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voici le programme VHDL correspondant :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--testé OK le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13682</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13682"/>
				<updated>2020-10-01T15:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13681</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13681"/>
				<updated>2020-10-01T15:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 30/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13680</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13680"/>
				<updated>2020-10-01T14:08:56Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corrigé accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13679</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13679"/>
				<updated>2020-10-01T14:08:13Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corriger accessible tout le temps et présente dans l'énoncé.&lt;br /&gt;
&lt;br /&gt;
Gilles Millon m'a proposé une autre solution. Je ne sais plus s'il l'a réalisée en pratique, mais si c'est le cas il peut la mettre ici.&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13678</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13678"/>
				<updated>2020-10-01T14:05:29Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Vous n'avez qu'à changer le fichier de contraintes pour que les sorties se fassent sur les leds. '''ATTENTION''' cependant la taille de le sortie sur 7 segments est à adpter pour les 8 leds.&lt;br /&gt;
&lt;br /&gt;
Le contenu de la mémoire est à changer aussi.&lt;br /&gt;
&lt;br /&gt;
===Question 3===&lt;br /&gt;
Cette question dispose de son corriger accessible tout le temps et présente dans l'énoncé.&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13677</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13677"/>
				<updated>2020-10-01T14:01:34Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13676</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13676"/>
				<updated>2020-10-01T14:00:58Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier VHDL est&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- Testé 0K le 1/10/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
--LIBRARY lpm;&lt;br /&gt;
--USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
-- compteur 4 bits&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
-- compteur 24 bits pour l'horloge lente&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end COMPONENT rams_21a;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : rams_21a PORT MAP (&lt;br /&gt;
		  clk =&amp;gt; s_clk_slow,&lt;br /&gt;
		  en =&amp;gt; '1',&lt;br /&gt;
		  addr =&amp;gt; s_transcod,&lt;br /&gt;
		  data(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
-- ROMs Using Block RAM Resources. &lt;br /&gt;
-- VHDL code for a ROM with registered output (template 1) &lt;br /&gt;
-- &lt;br /&gt;
library ieee; &lt;br /&gt;
use ieee.std_logic_1164.all; &lt;br /&gt;
use ieee.std_logic_unsigned.all; &lt;br /&gt;
entity rams_21a is &lt;br /&gt;
    port (clk : in std_logic; &lt;br /&gt;
           en    : in std_logic; &lt;br /&gt;
           addr : in std_logic_vector(3 downto 0); &lt;br /&gt;
           data : out std_logic_vector(7 downto 0)); &lt;br /&gt;
end rams_21a; &lt;br /&gt;
architecture syn of rams_21a is &lt;br /&gt;
  type rom_type is array (0 to 15) of std_logic_vector (7 downto 0);&lt;br /&gt;
 -- contenu de la ROM &lt;br /&gt;
  signal ROM : rom_type:= &lt;br /&gt;
    (X&amp;quot;40&amp;quot;, X&amp;quot;79&amp;quot;, X&amp;quot;24&amp;quot;, X&amp;quot;30&amp;quot;, X&amp;quot;19&amp;quot;, X&amp;quot;12&amp;quot;, &lt;br /&gt;
     X&amp;quot;02&amp;quot;, X&amp;quot;78&amp;quot;, X&amp;quot;00&amp;quot;, X&amp;quot;10&amp;quot;, X&amp;quot;08&amp;quot;, X&amp;quot;03&amp;quot;, &lt;br /&gt;
     X&amp;quot;46&amp;quot;, X&amp;quot;21&amp;quot;, X&amp;quot;06&amp;quot;, X&amp;quot;0E&amp;quot;); &lt;br /&gt;
begin &lt;br /&gt;
    process (clk) &lt;br /&gt;
    begin &lt;br /&gt;
        if (clk'event and clk = '1') then &lt;br /&gt;
             if (en = '1') then &lt;br /&gt;
                  data &amp;lt;= ROM(conv_integer(addr)); &lt;br /&gt;
             end if; &lt;br /&gt;
         end if; &lt;br /&gt;
    end process; &lt;br /&gt;
end syn;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13675</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13675"/>
				<updated>2020-10-01T13:53:24Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;br /&gt;
&lt;br /&gt;
Mais le rapport de compilation donne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits       0 / 1,677,312 ( 0 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ce qui indique que le compilateur n'a pas utilisé de mémoire interne pour réaliser cette mémoire !&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13674</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13674"/>
				<updated>2020-10-01T13:46:50Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Pour trouver le nom du fichier mif et son chemin&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13673</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13673"/>
				<updated>2020-10-01T13:30:37Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
===Question 1===&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13672</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13672"/>
				<updated>2020-10-01T13:30:23Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
==Question 1==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13671</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13671"/>
				<updated>2020-10-01T13:17:07Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13670</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13670"/>
				<updated>2020-09-30T16:05:57Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Exercice 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus (fichier .mif) finisse dans un mémoire interne du FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13669</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13669"/>
				<updated>2020-09-30T16:04:51Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13668</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13668"/>
				<updated>2020-09-30T16:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fait que l'ensemble des données ci-dessus finisse dans un mémoire interne au FPGA est indiqué dans le rapport de compilation (Compilation Report) sous la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Total memory bits    128 / 1,677,312 ( &amp;lt; 1 % )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cela vous précise que vous n'utilisez même pas 1% de la mémoire disponible dans votre FPGA.&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13667</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13667"/>
				<updated>2020-09-30T15:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Information supplémentaire sur les LPM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
--Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notez aussi comme le code est devenu compact.&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13666</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13666"/>
				<updated>2020-09-30T15:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Information supplémentaire sur les LPM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. Notez que &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13665</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13665"/>
				<updated>2020-09-30T15:47:49Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Information supplémentaire sur les LPM===&lt;br /&gt;
Nous donnons pour information l'ensemble de la question 2 entièrement réalisé avec des compteurs '''LPM'''. &amp;lt;big&amp;gt;'''Ceci est réalisé dans les règles de l'art'''&amp;lt;/big&amp;gt; : la même horloge est utilisée par les deux compteurs et la mémoire.&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire et les deux compteurs&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_eno : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  -- compteur 24 bits&lt;br /&gt;
  ic1: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 24&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            eq(0) =&amp;gt; s_eno); -- pas possible avec :(2^24 - 1) = 16777215&lt;br /&gt;
&lt;br /&gt;
  -- compteur 4 bits&lt;br /&gt;
  ic2: lpm_counter GENERIC MAP (&lt;br /&gt;
            LPM_WIDTH =&amp;gt; 4&lt;br /&gt;
  )&lt;br /&gt;
  PORT MAP (CLOCK =&amp;gt; clk_50,&lt;br /&gt;
            cnt_en =&amp;gt; s_eno,&lt;br /&gt;
            q =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; clk_50,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13664</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13664"/>
				<updated>2020-09-30T13:38:55Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13663</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13663"/>
				<updated>2020-09-30T13:38:23Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13662</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13662"/>
				<updated>2020-09-30T13:37:11Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 04;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 04;&lt;br /&gt;
0005  : 02;&lt;br /&gt;
0006  : 01;&lt;br /&gt;
0007  : 02;&lt;br /&gt;
0008  : 04;&lt;br /&gt;
0009  : 08;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 20;&lt;br /&gt;
000c  : 40;&lt;br /&gt;
000d  : 80;&lt;br /&gt;
000e  : 40;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13661</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13661"/>
				<updated>2020-09-30T13:32:31Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Question 2===&lt;br /&gt;
Seul le fichier .mif est à changer :&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13660</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13660"/>
				<updated>2020-09-30T13:31:26Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
-- testé 0K le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et enfin le nouveau fichier .mif est :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 01;&lt;br /&gt;
0001  : 02;&lt;br /&gt;
0002  : 04;&lt;br /&gt;
0003  : 08;&lt;br /&gt;
0004  : 10;&lt;br /&gt;
0005  : 20;&lt;br /&gt;
0006  : 40;&lt;br /&gt;
0007  : 80;&lt;br /&gt;
0008  : 40;&lt;br /&gt;
0009  : 20;&lt;br /&gt;
000a  : 10;&lt;br /&gt;
000b  : 08;&lt;br /&gt;
000c  : 04;&lt;br /&gt;
000d  : 02;&lt;br /&gt;
000e  : 01;&lt;br /&gt;
000f  : ff;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13659</id>
		<title>Cours:TP M1102 TP 6 Corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TP_M1102_TP_6_Corr&amp;diff=13659"/>
				<updated>2020-09-30T13:23:41Z</updated>
		
		<summary type="html">&lt;p&gt;SergeMoutou : /* Question 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=TP6=&lt;br /&gt;
==Exercice 1 : le réveil==&lt;br /&gt;
Il n'y a pas grand chose à dire sur la correction à part que l'on n'utilise pas l'horloge 50 MHz directement mais le 3Hz que l'on sait fabriquer depuis le tp 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY tp6 IS PORT (&lt;br /&gt;
  clk, key, trip : IN std_logic;&lt;br /&gt;
  Led0: OUT std_logic);&lt;br /&gt;
END tp6;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_tp6 OF tp6 IS&lt;br /&gt;
-- les composants :&lt;br /&gt;
COMPONENT SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END COMPONENT cmpt24bits;&lt;br /&gt;
-- LE FIL INTENE&lt;br /&gt;
SIGNAL s_horloge_lente : std_logic;&lt;br /&gt;
BEGIN&lt;br /&gt;
  i1 : cmpt24bits PORT MAP(&lt;br /&gt;
      clk_50MHz =&amp;gt; clk,&lt;br /&gt;
      clk_slow =&amp;gt; s_horloge_lente);&lt;br /&gt;
	 &lt;br /&gt;
  i2 : SequSonnerie PORT MAP (&lt;br /&gt;
         clock =&amp;gt; s_horloge_lente,&lt;br /&gt;
			Key =&amp;gt; Key,&lt;br /&gt;
			Trip =&amp;gt; Trip,&lt;br /&gt;
			ena =&amp;gt; '1',&lt;br /&gt;
         Ring =&amp;gt; led0);&lt;br /&gt;
END arch_tp6;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
ENTITY SequSonnerie IS&lt;br /&gt;
  PORT(                  &lt;br /&gt;
        clock,Key,Trip,ena :IN std_logic;&lt;br /&gt;
        Ring :OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
ARCHITECTURE arch_SequSonnerie  OF SequSonnerie IS&lt;br /&gt;
  TYPE typetat IS (Armed, Off, Ringing); &lt;br /&gt;
  SIGNAL etatp, etatf : typetat;&lt;br /&gt;
  BEGIN&lt;br /&gt;
-- partie séquentielle&lt;br /&gt;
    PROCESS (clock) BEGIN  -- 1er process&lt;br /&gt;
	 IF Clock ='1' AND Clock'EVENT THEN&lt;br /&gt;
	   IF ena = '1' then&lt;br /&gt;
            etatp &amp;lt;= etatf;&lt;br /&gt;
		END IF;&lt;br /&gt;
     END IF;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
    PROCESS(etatp) BEGIN --2eme process&lt;br /&gt;
        CASE etatp IS&lt;br /&gt;
             WHEN Off =&amp;gt; IF key ='1' THEN etatf &amp;lt;= Armed; &lt;br /&gt;
                         ELSE etatf &amp;lt;= Off;&lt;br /&gt;
                      END IF;  &lt;br /&gt;
             WHEN Armed =&amp;gt; IF Key = '0' THEN &lt;br /&gt;
                            etatf &amp;lt;= Off;&lt;br /&gt;
	                   ELSIF Trip ='1' THEN &lt;br /&gt;
                             etatf &amp;lt;= Ringing;&lt;br /&gt;
	                   ELSE etatf &amp;lt;= Armed;&lt;br /&gt;
	                  END IF; &lt;br /&gt;
             WHEN Ringing =&amp;gt; IF Key ='0' THEN &lt;br /&gt;
                                 etatf &amp;lt;= Off; &lt;br /&gt;
                            ELSE etatf &amp;lt;= Ringing;&lt;br /&gt;
			    END IF; &lt;br /&gt;
	        END CASE;&lt;br /&gt;
    END PROCESS;&lt;br /&gt;
-- partie combinatoire&lt;br /&gt;
   Ring &amp;lt;= '1' WHEN etatp=Ringing ELSE&lt;br /&gt;
           '0';&lt;br /&gt;
END arch_SequSonnerie;&lt;br /&gt;
&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le fichier de contraintes associé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 2==&lt;br /&gt;
Voici le programme corrigé :&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
-- Vérifié OK le 29/09/20&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(6 downto 0));&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q(6 downto 0) =&amp;gt; hex0&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous donnons maintenant le fichier mif :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 40;&lt;br /&gt;
0001  : 79;&lt;br /&gt;
0002  : 24;&lt;br /&gt;
0003  : 30;&lt;br /&gt;
0004  : 19;&lt;br /&gt;
0005  : 12;&lt;br /&gt;
0006  : 02;&lt;br /&gt;
0007  : 78;&lt;br /&gt;
0008  : 00;&lt;br /&gt;
0009  : 10;&lt;br /&gt;
000a  : 08;&lt;br /&gt;
000b  : 03;&lt;br /&gt;
000c  : 46;&lt;br /&gt;
000d  : 21;&lt;br /&gt;
000e  : 06;&lt;br /&gt;
000f  : 0e;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Ce fichier mif doit s'appeler TP6exo2.mif et se trouver dans le répertoire du projet !'''&amp;lt;/big&amp;gt; Ce qui décide de cela est la ligne&lt;br /&gt;
&amp;lt;source lang=vhdl&amp;gt;&lt;br /&gt;
LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dans l'instanciation de la mémoire. Ceci peut naturellement être changé.&lt;br /&gt;
&lt;br /&gt;
Vient maintenant le fichier de contraintes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
Key,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,,&lt;br /&gt;
Trip,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
LED0,Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D15,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 3==&lt;br /&gt;
Seul le fichier .mif est à changer par rapport à l'exercice 2. Voici le nouveau contenu :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPTH = 16;&lt;br /&gt;
WIDTH = 8;&lt;br /&gt;
&lt;br /&gt;
ADDRESS_RADIX = HEX;&lt;br /&gt;
DATA_RADIX = HEX;&lt;br /&gt;
CONTENT&lt;br /&gt;
  BEGIN&lt;br /&gt;
[0..0f]   :  0;&lt;br /&gt;
0000  : 03;&lt;br /&gt;
0001  : 23;&lt;br /&gt;
0002  : 2b;&lt;br /&gt;
0003  : 71;&lt;br /&gt;
0004  : 23;&lt;br /&gt;
0005  : 63;&lt;br /&gt;
0006  : 2f;&lt;br /&gt;
0007  : 7f;&lt;br /&gt;
0008  : 08;&lt;br /&gt;
0009  : 7f;&lt;br /&gt;
000a  : 07;&lt;br /&gt;
000b  : 23;&lt;br /&gt;
000c  : 63;&lt;br /&gt;
000d  : 12;&lt;br /&gt;
000e  : 7f;&lt;br /&gt;
000f  : 7f;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 4==&lt;br /&gt;
===Question 1===&lt;br /&gt;
Le fichier VHDL est changé de manière très mineure par rapport à celui de l'exercice 2. Les sorties s'appellent toujours HEX0 sont sur 8 bits maintenant et sont maintenant destinées aux leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=VHDL&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
-- pour la mémoire&lt;br /&gt;
LIBRARY lpm;&lt;br /&gt;
USE lpm.lpm_components.ALL;&lt;br /&gt;
&lt;br /&gt;
entity tp6 is port(&lt;br /&gt;
  clk_50 : in std_logic;&lt;br /&gt;
  hex0 : out std_logic_vector(7 downto 0)); -- changé pour exercice 4&lt;br /&gt;
end tp6;&lt;br /&gt;
&lt;br /&gt;
architecture arch_top of tp6 is&lt;br /&gt;
COMPONENT cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
       cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
COMPONENT cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC;&lt;br /&gt;
    clk_slow : OUT STD_LOGIC);&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
  SIGNAL s_clk_slow : std_logic;&lt;br /&gt;
  SIGNAL s_transcod : std_logic_vector(3 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  lent: cmpt24bits port map(&lt;br /&gt;
           clk_50MHz =&amp;gt; clk_50,&lt;br /&gt;
           clk_slow =&amp;gt; s_clk_slow);&lt;br /&gt;
  cmpt: cmpt4bits port map(&lt;br /&gt;
           clk =&amp;gt; s_clk_slow,&lt;br /&gt;
           cnt =&amp;gt; s_transcod);&lt;br /&gt;
  ic3 : lpm_rom GENERIC MAP (&lt;br /&gt;
                LPM_ADDRESS_CONTROL =&amp;gt; &amp;quot;UNREGISTERED&amp;quot;,&lt;br /&gt;
                LPM_FILE =&amp;gt; &amp;quot;TP6exo2.mif&amp;quot;,&lt;br /&gt;
		LPM_WIDTH =&amp;gt; 8,&lt;br /&gt;
		LPM_WIDTHAD =&amp;gt; 4)&lt;br /&gt;
		PORT MAP (&lt;br /&gt;
		  outclock =&amp;gt; s_clk_slow,&lt;br /&gt;
		  address =&amp;gt; s_transcod,&lt;br /&gt;
		  q =&amp;gt; hex0 -- changé pour exercice 4&lt;br /&gt;
		  );&lt;br /&gt;
end arch_top;&lt;br /&gt;
-- horloge lente 3 Hz&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt24bits IS&lt;br /&gt;
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée&lt;br /&gt;
    clk_slow : OUT STD_LOGIC); -- une seule sortie&lt;br /&gt;
END cmpt24bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(23 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk_50MHz) begin&lt;br /&gt;
    if rising_edge(clk_50MHz) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  clk_slow &amp;lt;= cmpt(23);  -- partie combinatoire de construction de l'horloge lente&lt;br /&gt;
END arch_cmpt24bits;&lt;br /&gt;
&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use ieee.std_logic_arith.all;&lt;br /&gt;
use ieee.std_logic_unsigned.all;&lt;br /&gt;
ENTITY cmpt4bits IS&lt;br /&gt;
  PORT(clk : IN STD_LOGIC;&lt;br /&gt;
    cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));&lt;br /&gt;
END cmpt4bits;&lt;br /&gt;
 &lt;br /&gt;
ARCHITECTURE arch_cmpt4bits OF cmpt4bits IS&lt;br /&gt;
  signal cmpt : std_logic_vector(3 downto 0);&lt;br /&gt;
BEGIN&lt;br /&gt;
  process(clk) begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      cmpt &amp;lt;= cmpt + 1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  cnt &amp;lt;= cmpt;  &lt;br /&gt;
END arch_cmpt4bits;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nouveau fichier de contrainte est :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation&lt;br /&gt;
&lt;br /&gt;
clk_50,Input,PIN_P11,,,,3.3-V LVTTL,,,,,&lt;br /&gt;
&lt;br /&gt;
HEX0[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
HEX0[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exercice 5==&lt;br /&gt;
&lt;br /&gt;
==Exercice 6==&lt;/div&gt;</summary>
		<author><name>SergeMoutou</name></author>	</entry>

	</feed>