Difference between revisions of "FPGA Transmitter"

From UConn PAN
Jump to navigation Jump to search
m
 
m
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
== (001) Transmit "I" ==
+
= (1X1) Transmitter =
  
This is a simple state.  It loads to the CP2200/1 a packet containing an ASCII "I" in the first byte and padding (any value) in all remaining bytes (minimum size of data is 46 bytes, so there needs to be 45 bytes of padding). After the transmission is complete, the block writes a 010 to the state register.
+
The Transmitter is responsible for compiling report packets for sending to the PC. As discussed [[Ethernet packets#"S" packet: status report|elsewhere]], the output packets from the digital boards come in "S" and "D" varieties corresponding to "status" - data from sensor chips, and "DAC values" respectively. The selection between these packet types is articulated via the middle bit of the state value: 101 corresponds to S-packet and 111 corresponds to D-packet. After composing the packet and ordering its transmission via the interface with the Ethernet Controller chip (EC), the module yields control to the [[FPGA_Idler|Idler]] to await the next request from the PC.
  
inputs
+
Since the time required to compose a packet by this module is about the same as the time to receive a minimum-length packet, the Transmitter temporarily disables the EC's Receiver Interface.
* ''Clk'': clock
 
* ''/Rst'': asynchronous, active-low reset
 
* ''State'': 3-bit state value
 
  
internal signals
 
* ''S_En'': state enable, ''S_En'' <= not ''St(2)'' and ''St(1)'' and not ''St(0)''
 
* ''Go'': when ''S_En'' goes high ''Go'' pulses for one cycle
 
  
blocks
+
== Programming Details  ==
* '''Transmitter'''
+
 
** Loads an ASCII "I" (0x49, 0100 1001) to the transmitter 46 times (the first value must be "I" and the rest are garbage, so padding with "I" is simplest) to fill in a complete packet (accounts for any register incrementing or other loading control necessary).
+
The natural design approach for this dual-purpose block (sending two very different packets) is to perform the general preparations for transmission including the transmissions buffer pointer settings and packet header composition and then pass control to one of the two child modules that append the appropriate data to the packet depending on the packet type. As such, the Transmitter is enabled when the state value bits 2 and 0 are high and in due course pulses its child modules, ''DPAcket'' and ''SPacket'' with a "Go" signal selected by the state bit 1.
** inputs
+
 
*** ''Clk'': clock
+
The major complication in our approach to packet composition is the limited auto-write (easy sequential write) interface of the transmission buffer of the CP220X chips. Upon a transmission failure the auto-write interface is disabled, forcing the controller to switch to random access mode. We resolved, in our design, to just use the latter approach. This mode requires setting the 16-bit buffer address pointer and then writing the desired 8-bit value. Thus, every byte required three write operations. These operations have been aggregated into the ''RAwrToAddr'' (Random Access WRite TO ADDRess) module to abstract this complication from the higher-level Transmitter block. One feature of this modules is that it remembers the address of the last byte written and can be told to advance by itself to the next address by writing '1' to the MSB of its address bus. The caveat to using this feature is that the module must only be instantiated once and its control lines must be passed to the children. In this way, the simplicity of the auto-write interface is, in some sense, restored.
*** ''/Rst'': asynchronous, active-low reset
+
 
*** ''Go'': pulse to begin sending
+
The child S/D modules are passed the relevant subset of Transmitter's external buses. They essentially count through the addresses of the appropriate data registers and pass the data into the transmit buffer of the EC in 2-byte words. As elsewhere transmissions of this type are done by ''RAwr2BtoAddr'' module which latches the 2-byte input and uses ''RAwrToAddr'' to write the two sequential bytes using the random-access method.  
*** ''Inc'': ''Done'' signal from transceiver; initiates next sending
+
 
** outputs
+
 
*** ''TxRx_A'': ''A_in'' signal to transceiver
+
=== Ports ===
*** ''TxRx_D'': ''D_in'' signal to transceiver
+
 
*** ''TxRx_R/W'': ''R/W'' signal to transceiver; tied to write (zero)
+
* ''Clk'': [in] clock
*** ''TxRx_Go'': ''Go'' signal to transceiver
+
* ''Rst: [in] asynchronous reset
*** ''Done'': pulses for one cycle; connects to state register as an enable line
+
 
*** ''New_St'': new state to load into state register; goes to 010 when ''Done'' is high
+
 
 +
[[FPGA_Registers#State_Register|State Register]] Control Lines
 +
* ''state_En'': [out] state register enable (write) signal
 +
* ''state_D'': [out] (3-bit) state register input
 +
* ''state_Q'': [in] (3-bit) state register output
 +
 
 +
 
 +
* ''LocStamp'': [in] 8-bit board location value as hard-coded into the board's slot
 +
 
 +
 
 +
[[FPGA_Registers#MAC_Register|MAC Address Register]] Control Lines
 +
* ''MACregs_A'': [out] byte address (4-bit)
 +
* ''MACregs_Q'': [in] 8-bit value
 +
 
 +
 
 +
[[FPGA_Registers#Temperature Register|Temperature]], [[FPGA_Registers#ADC Registers|ADC]] and [[FPGA_Registers#DAC Registers|DAC]] register control lines
 +
* ''TempReg_Q'': [in] 16-bit (pre-padded 10-bit) Temperature register value
 +
* ''ADCReg_Addr'': [out] 3-bit ADC register address
 +
* ''ADCReg_Q'': [in] 16-bit (pre-padded 12-bit) ADC register value
 +
* ''DACReg_Addr'': [out] 5-bit DAC register address bus
 +
* ''DACReg_Q'': [in] 16-bit (pre-padded 14-bit) DAC register value
 +
 
 +
 
 +
[[FPGA_Transceiver|Transceiver]] Control Lines
 +
* ''TxRx_Go'': [out] "Go" signal to read/write an EC control register byte
 +
* ''TxRx_RiW'': [out] active-high read, active-low write flag
 +
* ''TxRx_Aout'': [out] EC control register address (8-bit)
 +
* ''TxRx_Dout'': [out] EC control register write value
 +
* ''TxRx_Done'': [in] "Done" signal from [[FPGA_Transceiver|Transceiver]]

Latest revision as of 06:31, 5 November 2009

(1X1) Transmitter

The Transmitter is responsible for compiling report packets for sending to the PC. As discussed elsewhere, the output packets from the digital boards come in "S" and "D" varieties corresponding to "status" - data from sensor chips, and "DAC values" respectively. The selection between these packet types is articulated via the middle bit of the state value: 101 corresponds to S-packet and 111 corresponds to D-packet. After composing the packet and ordering its transmission via the interface with the Ethernet Controller chip (EC), the module yields control to the Idler to await the next request from the PC.

Since the time required to compose a packet by this module is about the same as the time to receive a minimum-length packet, the Transmitter temporarily disables the EC's Receiver Interface.


Programming Details

The natural design approach for this dual-purpose block (sending two very different packets) is to perform the general preparations for transmission including the transmissions buffer pointer settings and packet header composition and then pass control to one of the two child modules that append the appropriate data to the packet depending on the packet type. As such, the Transmitter is enabled when the state value bits 2 and 0 are high and in due course pulses its child modules, DPAcket and SPacket with a "Go" signal selected by the state bit 1.

The major complication in our approach to packet composition is the limited auto-write (easy sequential write) interface of the transmission buffer of the CP220X chips. Upon a transmission failure the auto-write interface is disabled, forcing the controller to switch to random access mode. We resolved, in our design, to just use the latter approach. This mode requires setting the 16-bit buffer address pointer and then writing the desired 8-bit value. Thus, every byte required three write operations. These operations have been aggregated into the RAwrToAddr (Random Access WRite TO ADDRess) module to abstract this complication from the higher-level Transmitter block. One feature of this modules is that it remembers the address of the last byte written and can be told to advance by itself to the next address by writing '1' to the MSB of its address bus. The caveat to using this feature is that the module must only be instantiated once and its control lines must be passed to the children. In this way, the simplicity of the auto-write interface is, in some sense, restored.

The child S/D modules are passed the relevant subset of Transmitter's external buses. They essentially count through the addresses of the appropriate data registers and pass the data into the transmit buffer of the EC in 2-byte words. As elsewhere transmissions of this type are done by RAwr2BtoAddr module which latches the 2-byte input and uses RAwrToAddr to write the two sequential bytes using the random-access method.


Ports

  • Clk: [in] clock
  • Rst: [in] asynchronous reset


State Register Control Lines

  • state_En: [out] state register enable (write) signal
  • state_D: [out] (3-bit) state register input
  • state_Q: [in] (3-bit) state register output


  • LocStamp: [in] 8-bit board location value as hard-coded into the board's slot


MAC Address Register Control Lines

  • MACregs_A: [out] byte address (4-bit)
  • MACregs_Q: [in] 8-bit value


Temperature, ADC and DAC register control lines

  • TempReg_Q: [in] 16-bit (pre-padded 10-bit) Temperature register value
  • ADCReg_Addr: [out] 3-bit ADC register address
  • ADCReg_Q: [in] 16-bit (pre-padded 12-bit) ADC register value
  • DACReg_Addr: [out] 5-bit DAC register address bus
  • DACReg_Q: [in] 16-bit (pre-padded 14-bit) DAC register value


Transceiver Control Lines

  • TxRx_Go: [out] "Go" signal to read/write an EC control register byte
  • TxRx_RiW: [out] active-high read, active-low write flag
  • TxRx_Aout: [out] EC control register address (8-bit)
  • TxRx_Dout: [out] EC control register write value
  • TxRx_Done: [in] "Done" signal from Transceiver