Initial commit
This commit is contained in:
		
							
								
								
									
										129
									
								
								Libs/RS232_test/hdl/uvmRs232Driver_sim.vhd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Libs/RS232_test/hdl/uvmRs232Driver_sim.vhd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| LIBRARY std; | ||||
|   USE std.TEXTIO.all; | ||||
| LIBRARY Common_test; | ||||
|   USE Common_test.testUtils.all; | ||||
|  | ||||
| ARCHITECTURE RTL OF uvmRs232Driver IS | ||||
|                                                                    -- parameters | ||||
|   signal baudRate_int: real; | ||||
|   signal baudPeriod, characterPeriod: time; | ||||
|   constant uartDataBitNb: positive := 9; | ||||
|   constant maxStringLength: positive := driverTransaction'length; | ||||
|                                                                    -- Tx signals | ||||
|   signal outString : string(1 to maxStringLength); | ||||
|   signal sendString: std_uLogic := '0'; | ||||
|   signal outChar: character; | ||||
|   signal sendChar: std_ulogic := '0'; | ||||
|   signal sendParity, parityInit: std_ulogic := '0'; | ||||
|                                                                         -- debug | ||||
|   signal outChar_debug: unsigned(uartDataBitNb-1 downto 0); | ||||
|  | ||||
|  | ||||
| BEGIN | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                         -- interpret transaction | ||||
|   interpretTransaction: process | ||||
|     variable myLine : line; | ||||
|     variable commandPart : line; | ||||
|     variable baudRate_nat : natural; | ||||
|     file dataFile : text; | ||||
|     variable dataLine : line; | ||||
|   begin | ||||
|     wait on driverTransaction; | ||||
|     write(myLine, driverTransaction); | ||||
|     rm_side_separators(myLine); | ||||
|     read_first(myLine, commandPart); | ||||
|     if commandPart.all = "uart_baud" then | ||||
|       read(myLine, baudRate_nat); | ||||
|       baudRate_int <= real(baudRate_nat); | ||||
|     elsif commandPart.all = "uart_parity" then | ||||
|       sendParity <= '0'; | ||||
|       parityInit <= '0'; | ||||
|       if myLine.all = "even" then | ||||
|         sendParity <= '1'; | ||||
|       elsif myLine.all = "odd" then | ||||
|         sendParity <= '1'; | ||||
|         parityInit <= '1'; | ||||
|       end if; | ||||
|     elsif commandPart.all = "uart_send" then | ||||
|       outString <= pad(myLine.all, outString'length); | ||||
|       sendString <= '1', '0' after 1 ns; | ||||
|     elsif commandPart.all = "uart_send_file" then | ||||
|       file_open(dataFile, "$SIMULATION_DIR/" & myLine.all, read_mode); | ||||
|       while not endFile(dataFile) loop | ||||
|         readLine(dataFile, dataLine); | ||||
| --print(dataLine.all); | ||||
|         outString <= pad(dataLine.all, outString'length); | ||||
|         sendString <= '1', '0' after 1 ns; | ||||
|         wait for (dataLine'length+8) * characterPeriod; | ||||
|       end loop; | ||||
|       file_close(dataFile); | ||||
|     end if; | ||||
|     deallocate(myLine); | ||||
|   end process interpretTransaction; | ||||
|  | ||||
|   baudRate <= baudRate_int; | ||||
|   baudPeriod <= 1.0/baudRate_int * 1 sec; | ||||
|   characterPeriod <= 15*baudPeriod; | ||||
|  | ||||
|   --============================================================================ | ||||
|                                                       -- send string on RxD line | ||||
|   uartSendString: process | ||||
|     variable outStringRight: natural; | ||||
|   begin | ||||
|                                                              -- wait for command | ||||
|     sendChar <= '0'; | ||||
|     wait until rising_edge(sendString); | ||||
|                                                            -- find string length | ||||
|     outStringRight := outString'right; | ||||
|     while outString(outStringRight) = ' ' loop | ||||
|       outStringRight := outStringRight-1; | ||||
|     end loop; | ||||
|                                                               -- send characters | ||||
|     for index in outString'left to outStringRight loop | ||||
|       outChar <= outString(index); | ||||
| --print(sprintf("%2X", character'pos(outChar))); | ||||
|       sendChar <= '1', '0' after 1 ns; | ||||
|       wait for characterPeriod; | ||||
|     end loop; | ||||
|                                                          -- send carriage return | ||||
|     outChar <= cr; | ||||
|     sendChar <= '1', '0' after 1 ns; | ||||
|     wait for characterPeriod; | ||||
|  | ||||
|   end process uartSendString; | ||||
|  | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                    -- send character on RxD line | ||||
|   uartSendChar: process | ||||
|     variable outChar_unsigned: unsigned(uartDataBitNb-1 downto 0); | ||||
|   begin | ||||
|                                                              -- wait for trigger | ||||
|     RxD <= '1'; | ||||
|     wait until rising_edge(sendChar); | ||||
|                                                  -- transform char to bit vector | ||||
|     outChar_unsigned := to_unsigned( | ||||
|       character'pos(outChar), | ||||
|       outChar_unsigned'length | ||||
|     ); | ||||
|     outChar_unsigned(outChar_unsigned'high) := '1'; | ||||
|     if sendParity = '1' then | ||||
|       outChar_unsigned(outChar_unsigned'high) := parityInit; | ||||
|       for index in uartDataBitNb-2 downto 0 loop | ||||
|         outChar_unsigned(outChar_unsigned'high) | ||||
|           := outChar_unsigned(outChar_unsigned'high) | ||||
|           xor outChar_unsigned(index); | ||||
|       end loop; | ||||
|     end if; | ||||
|     outChar_debug <= outChar_unsigned; | ||||
|                                                                -- send start bit | ||||
|     RxD <= '0'; | ||||
|     wait for baudPeriod; | ||||
|                                                                -- send data bits | ||||
|     for index in outChar_unsigned'reverse_range loop | ||||
|       RxD <= outChar_unsigned(index); | ||||
|       wait for baudPeriod; | ||||
|     end loop; | ||||
|   end process uartSendChar; | ||||
|  | ||||
| END ARCHITECTURE RTL; | ||||
		Reference in New Issue
	
	Block a user