Archived
1
0

Initial commit

This commit is contained in:
github-classroom[bot]
2024-02-23 13:01:05 +00:00
committed by GitHub
commit d212040c30
1914 changed files with 1290006 additions and 0 deletions

View File

@ -0,0 +1,479 @@
LIBRARY Common_test;
USE Common_test.testUtils.all;
ARCHITECTURE test OF ahbBeamer_tester IS
-- reset and clock
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
signal clock_int: std_uLogic := '1';
signal reset_int: std_uLogic;
-- test information
signal testSeparator : string(1 to 80) := (others => '-');
signal errorTopSeparator : string(1 to 80) := (others => '#');
signal bottomSeparator : string(1 to 80) := (others => '.');
signal indentation : string(1 to 2) := (others => ' ');
signal noteInformation : string(1 to 9) := (others => ' ');
signal errorInformation : string(1 to 10) := (others => ' ');
signal failureInformation : string(1 to 12) := (others => ' ');
signal testInformation : string(1 to 50) := (others => ' ');
-- register definition
constant controlRegisterAddress: natural := 0;
constant controlRun: natural := 2#001#;
constant controlUpdatePattern: natural := 2#010#;
constant controlInterpolateLinear: natural := 2#100#;
constant speedRegisterAddress: natural := 1;
constant xFifoRegisterAddress: natural := 2;
constant yFifoRegisterAddress: natural := 3;
signal updatePeriod: natural := 1;
signal patternLength: natural := 32;
-- AMBA bus access
constant registerWriteDelay: time := 4*clockPeriod;
signal registerAddress: natural;
signal registerDataOut, registerDataIn: integer;
signal registerWrite: std_uLogic;
signal registerRead: std_uLogic;
-- UART access
constant baudPeriodNb: positive := 4;
signal uartData: integer;
signal uartSend: std_uLogic;
-- functions
function clearBits (word, bits : natural) return natural is
variable andMask: unsigned(hRData'range);
begin
andMask := not(to_unsigned(bits, hRData'length));
return to_integer(to_unsigned(word, hRData'length) and andMask);
end clearBits;
BEGIN
------------------------------------------------------------------------------
-- reset and clock
reset_int <= '1', '0' after 2*clockPeriod;
hReset_n <= not(reset_int);
reset <= reset_int;
clock_int <= not clock_int after clockPeriod/2;
hClk <= transport clock_int after clockPeriod*9.0/10.0;
clock <= transport clock_int after clockPeriod*9.0/10.0;
------------------------------------------------------------------------------
-- test sequence
testSequence: process
begin
selSinCos <= '0';
registerAddress <= 0;
registerDataOut <= 0;
registerWrite <= '0';
registerRead <= '0';
uartSend <= '0';
wait for 100 ns;
print(cr & cr & cr & cr);
----------------------------------------------------------------------------
-- test control register
wait for 1 us - now;
testInformation <= pad("Testing control register", testInformation'length);
wait for 0 ns;
print(testSeparator & cr & testInformation);
-- set control register bits
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= controlRun + controlUpdatePattern + controlInterpolateLinear;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- readback control register
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerRead <= '1', '0' after clockPeriod;
wait for 3*clockPeriod;
assert(registerDataIn = controlRun + controlUpdatePattern + controlInterpolateLinear)
report "Control register write / readback error"
severity error;
wait for registerWriteDelay;
-- stop running and pattern update
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerRead <= '1', '0' after clockPeriod;
wait for 3*clockPeriod;
registerDataOut <= clearBits(registerDataIn, controlRun + controlUpdatePattern);
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
----------------------------------------------------------------------------
-- test speed register
wait for 2 us - now;
testInformation <= pad("Testing speed register", testInformation'length);
wait for 0 ns;
print(testSeparator & cr & testInformation);
-- set speed count value
wait until rising_edge(clock_int);
registerAddress <= speedRegisterAddress;
registerDataOut <= updatePeriod;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- readback speed count
wait until rising_edge(clock_int);
registerAddress <= speedRegisterAddress;
registerRead <= '1', '0' after clockPeriod;
wait for 3*clockPeriod;
assert(registerDataIn = updatePeriod)
report "Speed register write / readback error"
severity error;
wait for registerWriteDelay;
----------------------------------------------------------------------------
-- write sinewave data points to RAM
wait for 3 us - now;
testInformation <= pad("Writing sinewaves to RAM", testInformation'length);
wait for 0 ns;
print(testSeparator & cr & testInformation);
-- start pattern update
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= controlUpdatePattern;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- write X FIFO values
wait until rising_edge(clock_int);
registerAddress <= xFifoRegisterAddress;
registerDataOut <= 16#0000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7FFF#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#0000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7FFF#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for 10*registerWriteDelay;
-- write Y FIFO values
wait until rising_edge(clock_int);
registerAddress <= yFifoRegisterAddress;
registerDataOut <= 16#7FFF#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#0000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7FFF#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#0000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#18F9#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#30FB#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#471C#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#5A82#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#6A6D#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7641#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7D89#;
registerWrite <= '1', '0' after clockPeriod;
wait for 10*registerWriteDelay;
-- end pattern update
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= 0;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
----------------------------------------------------------------------------
-- playing waveforms
wait for 7 us - now;
testInformation <= pad("Playing waveforms", testInformation'length);
wait for 0 ns;
print(testSeparator & cr & testInformation);
-- start run
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= controlRun + patternLength * 2**(hWData'length-patternAddressBitNb);
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- run for some time
wait for 250 us - now;
-- stop run
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= 0;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
----------------------------------------------------------------------------
-- play data points to RAM for overflow
wait for 300 us - now;
testInformation <= pad(
"Writing waveform to RAM for overflow", testInformation'length
);
wait for 0 ns;
print(testSeparator & cr & testInformation);
-- start pattern update
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= controlUpdatePattern;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- write X FIFO values
wait until rising_edge(clock_int);
registerAddress <= xFifoRegisterAddress;
registerDataOut <= 16#4000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for 10*registerWriteDelay;
-- write Y FIFO values
wait until rising_edge(clock_int);
registerAddress <= yFifoRegisterAddress;
registerDataOut <= -16#4000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
registerDataOut <= -16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for 10*registerWriteDelay;
-- end pattern update and start run
patternLength <= 4;
wait until rising_edge(clock_int);
registerAddress <= controlRegisterAddress;
registerDataOut <= controlRun + patternLength * 2**(hWData'length-patternAddressBitNb);
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
-- set lower speed execution
updatePeriod <= 9;
wait until rising_edge(clock_int);
registerAddress <= speedRegisterAddress;
registerDataOut <= updatePeriod;
registerWrite <= '1', '0' after clockPeriod;
wait for registerWriteDelay;
----------------------------------------------------------------------------
-- sin/cos debug mode
wait for 700 us - now;
testInformation <= pad("Drawing debug mode circle", testInformation'length);
wait for 0 ns;
print(testSeparator & cr & testInformation);
selSinCos <= '1';
----------------------------------------------------------------------------
-- stop simulation
wait for 1 ms - now;
assert false
report "End" & cr & " --> " &
"End of simulation"
severity failure;
end process testSequence;
------------------------------------------------------------------------------
-- AMBA bus access
busAccess: process
variable writeAccess: boolean;
variable hRData01: std_ulogic_vector(hRData'range);
begin
hAddr <= (others => '-');
hWData <= (others => '-');
hTrans <= transIdle;
hSel <= '0';
hWrite <= '0';
wait on registerWrite, registerRead;
writeAccess := false;
if rising_edge(registerWrite) then
writeAccess := true;
end if;
-- phase 1: address and controls
wait until rising_edge(clock_int);
hAddr <= to_unsigned(registerAddress, hAddr'length);
hTrans <= transNonSeq;
hSel <= '1';
if writeAccess then
hWrite <= '1';
end if;
-- phase 2: data
wait until rising_edge(clock_int);
hAddr <= (others => '-');
hTrans <= transIdle;
hSel <= '0';
hWrite <= '0';
if writeAccess then
hWData <= std_uLogic_vector(to_signed(registerDataOut, hWData'length));
else
wait until falling_edge(clock_int);
hRData01 := hRData;
for index in hRData01'range loop
if (hRData01(index) /= '0') and (hRData01(index) /= '1') then
hRData01(index) := '0';
end if;
end loop;
registerDataIn <= to_integer(unsigned(hRData01));
end if;
wait until rising_edge(clock_int);
end process;
END ARCHITECTURE test;

View File

@ -0,0 +1,294 @@
ARCHITECTURE test OF beamerSoc_tester IS
-- clock and reset
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
signal sClock: std_uLogic := '1';
signal sReset: std_uLogic := '1';
-- register definition
constant beamerBaseAddress: natural := 16#20#;
constant beamerControlRegisterAddress: natural := beamerBaseAddress + 0;
constant beamerControlRun: natural := 2#001#;
constant beamerControlUpdatePattern: natural := 2#010#;
constant beamerControlInterpolateLinear: natural := 2#100#;
constant beamerControlsizeBase: natural := 16#80#;
constant beamerSpeedRegisterAddress: natural := beamerBaseAddress + 1;
constant beamerXFifoRegisterAddress: natural := beamerBaseAddress + 2;
constant beamerYFifoRegisterAddress: natural := beamerBaseAddress + 3;
-- microprocessor bus access
constant registerWriteDelay: time := 4*clockPeriod;
signal registerAddress: natural;
signal registerDataOut, registerDataIn: integer;
signal registerWrite, registerRead, registerDone: std_uLogic;
-- UART access
-- constant uartFrequency: real := 115200.0;
constant uartDataBitNb: positive := 8;
constant uartFrequency: real := 1.0E6;
constant uartPeriod: time := (1.0/uartFrequency) * 1 sec;
constant uartDataSpan: time := 10*uartPeriod;
constant uartWriteReplySpan: time := 5*uartDataSpan;
constant uartReadReplySpan: time := 10*uartDataSpan;
signal uartRxData, uartTxData: integer;
signal uartSend, uartDone: std_uLogic;
signal uartTxShiftRegister: unsigned(2*uartDataBitNb-1 downto 0);
signal uartTxDataWord: integer;
BEGIN
------------------------------------------------------------------------------
-- clock and reset
sClock <= not sClock after clockPeriod/2;
clock <= transport sClock after clockPeriod*9/10;
reset <= '1', '0' after 2*clockPeriod;
------------------------------------------------------------------------------
-- test sequence
process
begin
io <= (others => 'Z');
selSinCos <= '0';
wait for 1 ns;
assert false
report cr & cr & cr & cr &
"----------------------------------------" &
"----------------------------------------" &
"----------------------------------------"
severity note;
----------------------------------------------------------------------------
-- initialization by microprocessor
wait for 100 ns - now;
assert false
report "Init" & cr & " --> " &
"Letting the microprocessor initialize the peripherals"
severity note;
----------------------------------------------------------------------------
-- test GPIOs
wait for 400 ns - now;
assert false
report "GPIOs" & cr & " --> " &
"Testing the GPIOs"
severity note;
io(7 downto 4) <= x"5";
wait for 1 ns;
assert io = x"5A"
report "GPIO error"
severity error;
----------------------------------------------------------------------------
-- set speed count value
wait for 3*uartPeriod - now;
assert false
report "Beamer init" & cr & " --> " &
"Setting drawing speed"
severity note;
registerAddress <= beamerSpeedRegisterAddress;
registerDataOut <= 2;
--registerAddress <= 16#1234#;
--registerDataOut <= 16#5678#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- start updating pattern
assert false
report "Beamer init" & cr & " --> " &
"Writing y-pattern to beamer RAM"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerDataOut <= beamerControlUpdatePattern;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- write y-FIFO
registerAddress <= beamerYFifoRegisterAddress;
registerDataOut <= -16#4000# + 16#10000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= -16#7000# + 16#10000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- start run
assert false
report "Beamer play" & cr & " --> " &
"Launching pattern drawing (setting pattern size and run flag)"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerDataOut <= beamerControlRun + beamerControlsizeBase * 4;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- readback control register
assert false
report "Beamer test" & cr & " --> " &
"Reading back control register"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerRead <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartReadReplySpan;
assert uartTxDataWord = beamerControlRun + beamerControlsizeBase * 4
report "Beamer register readback error"
severity error;
----------------------------------------------------------------------------
-- stop simulation
wait for 1.5 ms - now;
assert false
report "End" & cr & " --> " &
"End of simulation"
severity failure;
end process;
--============================================================================
-- microprocessor bus access
busAccess: process
variable writeAccess: boolean;
-- variable packetId: natural := 0;
variable packetId: natural := 16#1D#;
variable checksum: natural;
begin
registerDone <= '1';
uartSend <= '0';
uartRxData <= 16#AA#;
wait on registerWrite, registerRead;
registerDone <= '0';
writeAccess := false;
if registerWrite = '1' then
writeAccess := true;
end if;
-- send header
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := uartRxData;
-- send packet id
uartRxData <= packetId;
packetId := (packetId + 1) mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send command
if writeAccess then
uartRxData <= 16#03#;
else
uartRxData <= 16#04#;
end if;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data length
if writeAccess then
uartRxData <= 4;
else
uartRxData <= 2;
end if;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send addresss low
uartRxData <= registerAddress mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send addresss high
uartRxData <= registerAddress / 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data low
if writeAccess then
uartRxData <= registerDataOut mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data high
uartRxData <= registerDataOut / 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
end if;
-- send checksum
uartRxData <= checksum;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
end process;
------------------------------------------------------------------------------
-- UART access
sendByte: process
variable serialData: unsigned(7 downto 0);
begin
-- send stop bit
uartDone <= '1';
RxD <= '1';
-- get new word
wait until rising_edge(uartSend);
uartDone <= '0';
serialData := to_unsigned(uartRxData, serialData'length);
-- send start bit
RxD <= '0';
wait for uartPeriod;
-- send data bits
for index in serialData'reverse_range loop
RxD <= serialData(index);
wait for uartPeriod;
end loop;
-- send stop bits
RxD <= '1';
wait for 4*uartPeriod;
end process sendByte;
------------------------------------------------------------------------------
-- UART access
receiveByte: process
variable serialData: unsigned(uartDataBitNb-1 downto 0);
begin
-- wait for stat bit
wait until falling_edge(TxD);
-- jump to middle of first data bit
wait for 1.5 * uartPeriod;
-- read data bits
for index in serialData'reverse_range loop
if Is_X(TxD) then
serialData(index) := '0';
else
serialData(index) := TxD;
end if;
wait for uartPeriod;
end loop;
-- write data to signal
uartTxData <= to_integer(serialData);
uartTxDataWord <= to_integer(uartTxShiftRegister);
uartTxShiftRegister <= shift_right(uartTxShiftRegister, serialData'length);
uartTxShiftRegister(
uartTxShiftRegister'high downto
uartTxShiftRegister'high-serialData'length+1
) <= serialData;
end process receiveByte;
END ARCHITECTURE test;

View File

@ -0,0 +1,9 @@
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
PACKAGE beamerTest_pck IS
function trim_X (arg : signed) return signed;
END beamerTest_pck;

View File

@ -0,0 +1,16 @@
PACKAGE BODY beamerTest_pck IS
function trim_X (arg : signed) return signed is
variable returnVal : signed(arg'range);
begin
for i in arg'range loop
case arg(i) is
when '0' | 'L' => returnVal(i) := '0';
when '1' | 'H' => returnVal(i) := '1';
when others => returnVal(i) := '0';
end case;
end loop;
return returnVal;
end trim_X;
END beamerTest_pck;

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_93

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom ahb@beamer_tb/struct.bd
DEFAULT_ARCHITECTURE atom struct
TOP_MARKER atom 1

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom test
DEFAULT_FILE atom ahbBeamer_tester_test.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom struct
DEFAULT_FILE atom beamer@periph@blanking_tb/struct.bd

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom beamer@soc_tb/struct.bd
DEFAULT_ARCHITECTURE atom struct
TOP_MARKER atom 1

View File

@ -0,0 +1,2 @@
DEFAULT_FILE atom beamerSoc_tester_test.vhd
DEFAULT_ARCHITECTURE atom test

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,988 @@
DocumentHdrVersion "1.1"
Header (DocumentHdr
packageRefs [
(PackageRef
library "ieee"
unitName "std_logic_1164"
itemName "all"
)
(PackageRef
library "ieee"
unitName "numeric_std"
itemName "all"
)
]
)
version "15.1"
appVersion "2002.1a (Build 22)"
model (Symbol
VExpander (VariableExpander
vvMap [
(vvPair
variable " "
value " "
)
(vvPair
variable "HDLDir"
value "D:\\Users\\ELN_labs\\VHDL_gen"
)
(vvPair
variable "SideDataDesignDir"
value "U:\\SEm_curves\\Test\\waveform@gen_tester\\interface.info"
)
(vvPair
variable "SideDataUserDir"
value "U:\\SEm_curves\\Test\\waveform@gen_tester\\interface.user"
)
(vvPair
variable "SourceDir"
value "U:\\SEm_curves\\Test"
)
(vvPair
variable "appl"
value "HDL Designer - Pro"
)
(vvPair
variable "d"
value "U:\\SEm_curves\\Test\\waveform@gen_tester"
)
(vvPair
variable "d_logical"
value "U:\\SEm_curves\\Test\\waveformGen_tester"
)
(vvPair
variable "date"
value "06/09/08"
)
(vvPair
variable "day"
value "Mon"
)
(vvPair
variable "day_long"
value "Monday"
)
(vvPair
variable "dd"
value "09"
)
(vvPair
variable "ext"
value "<TBD>"
)
(vvPair
variable "f"
value "interface"
)
(vvPair
variable "f_logical"
value "interface"
)
(vvPair
variable "group"
value "UNKNOWN"
)
(vvPair
variable "host"
value "WE1647"
)
(vvPair
variable "library"
value "Curves_test"
)
(vvPair
variable "library_downstream_ModelSim"
value "D:\\Users\\ELN_labs\\VHDL_comp"
)
(vvPair
variable "mm"
value "06"
)
(vvPair
variable "month"
value "Jun"
)
(vvPair
variable "month_long"
value "June"
)
(vvPair
variable "p"
value "U:\\SEm_curves\\Test\\waveform@gen_tester\\interface"
)
(vvPair
variable "p_logical"
value "U:\\SEm_curves\\Test\\waveformGen_tester\\interface"
)
(vvPair
variable "series"
value "HDL Designer Series"
)
(vvPair
variable "time"
value "17:30:05"
)
(vvPair
variable "unit"
value "waveformGen_tester"
)
(vvPair
variable "user"
value "cof"
)
(vvPair
variable "version"
value "2002.1a (Build 22)"
)
(vvPair
variable "view"
value "interface"
)
(vvPair
variable "year"
value "2008"
)
(vvPair
variable "yy"
value "08"
)
]
)
uid 66,0
optionalChildren [
*1 (SymbolBody
uid 8,0
optionalChildren [
*2 (CptPort
uid 107,0
ps "OnEdgeStrategy"
shape (Triangle
uid 108,0
va (VaSet
vasetType 1
fg "0,65535,0"
)
xt "28625,5250,29375,6000"
)
n "clock"
t "std_ulogic"
m 1
o 3
r 1
d 0
s 0
sf 1
tg (CPTG
uid 109,0
ps "CptPortTextPlaceStrategy"
stg "RightVerticalLayoutStrategy"
f (Text
uid 110,0
ro 270
va (VaSet
font "Verdana,9,0"
)
xt "28400,7000,29600,9700"
st "clock"
ju 2
blo "29400,7000"
tm "CptPortNameMgr"
)
)
dt (MLText
uid 111,0
va (VaSet
font "Courier New,8,0"
)
xt "44000,2000,59500,2800"
st "clock : OUT std_ulogic ;
"
)
)
*3 (CptPort
uid 112,0
ps "OnEdgeStrategy"
shape (Triangle
uid 113,0
va (VaSet
vasetType 1
fg "0,65535,0"
)
xt "26625,5250,27375,6000"
)
n "en"
t "std_ulogic"
m 1
o 4
r 2
d 0
s 0
sf 1
tg (CPTG
uid 114,0
ps "CptPortTextPlaceStrategy"
stg "RightVerticalLayoutStrategy"
f (Text
uid 115,0
ro 270
va (VaSet
font "Verdana,9,0"
)
xt "26400,7000,27600,8200"
st "en"
ju 2
blo "27400,7000"
tm "CptPortNameMgr"
)
)
dt (MLText
uid 116,0
va (VaSet
font "Courier New,8,0"
)
xt "44000,2800,59500,3600"
st "en : OUT std_ulogic ;
"
)
)
*4 (CptPort
uid 117,0
ps "OnEdgeStrategy"
shape (Triangle
uid 118,0
va (VaSet
vasetType 1
fg "0,65535,0"
)
xt "30625,5250,31375,6000"
)
n "reset"
t "std_ulogic"
m 1
o 2
r 3
d 0
s 0
sf 1
tg (CPTG
uid 119,0
ps "CptPortTextPlaceStrategy"
stg "RightVerticalLayoutStrategy"
f (Text
uid 120,0
ro 270
va (VaSet
font "Verdana,9,0"
)
xt "30400,7000,31600,9600"
st "reset"
ju 2
blo "31400,7000"
tm "CptPortNameMgr"
)
)
dt (MLText
uid 121,0
va (VaSet
font "Courier New,8,0"
)
xt "44000,3600,59500,4400"
st "reset : OUT std_ulogic ;
"
)
)
*5 (CptPort
uid 122,0
ps "OnEdgeStrategy"
shape (Triangle
uid 123,0
va (VaSet
vasetType 1
fg "0,65535,0"
)
xt "22625,5250,23375,6000"
)
n "step"
t "unsigned"
b "(bitNb-1 DOWNTO 0)"
m 1
o 3
r 4
d 0
s 0
sf 1
tg (CPTG
uid 124,0
ps "CptPortTextPlaceStrategy"
stg "RightVerticalLayoutStrategy"
f (Text
uid 125,0
ro 270
va (VaSet
font "Verdana,9,0"
)
xt "22400,7000,23600,17400"
st "step : (bitNb-1:0)"
ju 2
blo "23400,7000"
tm "CptPortNameMgr"
)
)
dt (MLText
uid 126,0
va (VaSet
font "Courier New,8,0"
)
xt "44000,4400,67000,5200"
st "step : OUT unsigned (bitNb-1 DOWNTO 0)
"
)
)
]
shape (Rectangle
uid 9,0
va (VaSet
vasetType 1
fg "0,65535,0"
lineColor "0,32896,0"
lineWidth 2
)
xt "15000,6000,67000,14000"
)
oxt "15000,6000,66000,14000"
biTextGroup (BiTextGroup
uid 10,0
ps "CenterOffsetStrategy"
stg "VerticalLayoutStrategy"
first (Text
uid 11,0
va (VaSet
font "Verdana,9,1"
)
xt "35050,8800,42250,10000"
st "Curves_test"
blo "35050,9800"
)
second (Text
uid 12,0
va (VaSet
font "Verdana,9,1"
)
xt "35050,10000,46950,11200"
st "waveformGen_tester"
blo "35050,11000"
)
)
gi *6 (GenericInterface
uid 13,0
ps "CenterOffsetStrategy"
matrix (Matrix
uid 14,0
text (MLText
uid 15,0
va (VaSet
font "Courier New,8,0"
)
xt "16000,6000,27500,8400"
st "Generic Declarations
bitNb positive 16
"
)
header "Generic Declarations"
)
elements [
(GiElement
name "bitNb"
type "positive"
value "16"
)
]
)
portInstanceVisAsIs 1
portInstanceVis (PortSigDisplay
)
)
*7 (Grouping
uid 16,0
optionalChildren [
*8 (CommentText
uid 18,0
shape (Rectangle
uid 19,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "36000,48000,53000,49000"
)
oxt "18000,70000,35000,71000"
text (MLText
uid 20,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "36200,48000,45500,49000"
st "
by %user on %dd %month %year"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 17000
)
position 1
ignorePrefs 1
)
*9 (CommentText
uid 21,0
shape (Rectangle
uid 22,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "53000,44000,57000,45000"
)
oxt "35000,66000,39000,67000"
text (MLText
uid 23,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "53200,44000,55800,45000"
st "
Project:"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 4000
)
position 1
ignorePrefs 1
)
*10 (CommentText
uid 24,0
shape (Rectangle
uid 25,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "36000,46000,53000,47000"
)
oxt "18000,68000,35000,69000"
text (MLText
uid 26,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "36200,46000,46200,47000"
st "
<enter diagram title here>"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 17000
)
position 1
ignorePrefs 1
)
*11 (CommentText
uid 27,0
shape (Rectangle
uid 28,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "32000,46000,36000,47000"
)
oxt "14000,68000,18000,69000"
text (MLText
uid 29,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "32200,46000,33900,47000"
st "
Title:"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 4000
)
position 1
ignorePrefs 1
)
*12 (CommentText
uid 30,0
shape (Rectangle
uid 31,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "53000,45000,73000,49000"
)
oxt "35000,67000,55000,71000"
text (MLText
uid 32,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "53200,45200,62400,46200"
st "
<enter comments here>"
tm "CommentText"
wrapOption 3
visibleHeight 4000
visibleWidth 20000
)
ignorePrefs 1
)
*13 (CommentText
uid 33,0
shape (Rectangle
uid 34,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "57000,44000,73000,45000"
)
oxt "39000,66000,55000,67000"
text (MLText
uid 35,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "57200,44000,67300,45000"
st "
<enter project name here>"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 16000
)
position 1
ignorePrefs 1
)
*14 (CommentText
uid 36,0
shape (Rectangle
uid 37,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "32000,44000,53000,46000"
)
oxt "14000,66000,35000,68000"
text (MLText
uid 38,0
va (VaSet
fg "32768,0,0"
)
xt "39150,44500,45850,45500"
st "
<company name>"
ju 0
tm "CommentText"
wrapOption 3
visibleHeight 2000
visibleWidth 21000
)
position 1
ignorePrefs 1
)
*15 (CommentText
uid 39,0
shape (Rectangle
uid 40,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "32000,47000,36000,48000"
)
oxt "14000,69000,18000,70000"
text (MLText
uid 41,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "32200,47000,33900,48000"
st "
Path:"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 4000
)
position 1
ignorePrefs 1
)
*16 (CommentText
uid 42,0
shape (Rectangle
uid 43,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "32000,48000,36000,49000"
)
oxt "14000,70000,18000,71000"
text (MLText
uid 44,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "32200,48000,34500,49000"
st "
Edited:"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 4000
)
position 1
ignorePrefs 1
)
*17 (CommentText
uid 45,0
shape (Rectangle
uid 46,0
sl 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
)
xt "36000,47000,53000,48000"
)
oxt "18000,69000,35000,70000"
text (MLText
uid 47,0
va (VaSet
fg "0,0,32768"
bg "0,0,32768"
)
xt "36200,47000,51900,48000"
st "
%library/%unit/%view"
tm "CommentText"
wrapOption 3
visibleHeight 1000
visibleWidth 17000
)
position 1
ignorePrefs 1
)
]
shape (GroupingShape
uid 17,0
va (VaSet
vasetType 1
fg "65535,65535,65535"
lineStyle 2
lineWidth 2
)
xt "32000,44000,73000,49000"
)
oxt "14000,66000,55000,71000"
)
]
LanguageMgr "VhdlLangMgr"
bg "65535,65535,65535"
grid (Grid
origin "0,0"
isVisible 1
isActive 1
xSpacing 1000
xySpacing 1000
xShown 1
yShown 1
color "26368,26368,26368"
)
packageList *18 (PackageList
uid 48,0
stg "VerticalLayoutStrategy"
textVec [
*19 (Text
uid 49,0
va (VaSet
font "arial,8,1"
)
xt "0,0,5400,1000"
st "Package List"
blo "0,800"
)
*20 (MLText
uid 50,0
va (VaSet
)
xt "0,1000,11300,4000"
st "LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.ALL;"
tm "PackageList"
)
]
)
windowSize "0,0,895,750"
viewArea "0,0,0,0"
cachedDiagramExtent "0,0,0,0"
pageBreakOrigin "0,0"
defaultCommentText (CommentText
shape (Rectangle
layer 0
va (VaSet
vasetType 1
fg "65280,65280,46080"
lineColor "0,0,32768"
)
xt "0,0,15000,5000"
)
text (MLText
va (VaSet
fg "0,0,32768"
font "Courier New,9,0"
)
xt "200,200,2200,1400"
st "
Text"
tm "CommentText"
wrapOption 3
visibleHeight 4600
visibleWidth 14600
)
)
defaultPanel (Panel
shape (RectFrame
va (VaSet
vasetType 1
fg "65535,65535,65535"
lineColor "32768,0,0"
lineWidth 2
)
xt "0,0,20000,20000"
)
title (TextAssociate
ps "TopLeftStrategy"
text (Text
va (VaSet
font "Verdana,9,1"
)
xt "1000,1000,4400,2200"
st "Panel0"
blo "1000,2000"
tm "PanelText"
)
)
)
parentViewRef (DesignUnitViewRef
libraryName "Curves_test"
duName "waveformGen_tb"
viewName "struct.bd"
)
defaultSymbolBody (SymbolBody
shape (Rectangle
va (VaSet
vasetType 1
fg "0,65535,0"
lineColor "0,32896,0"
lineWidth 2
)
xt "15000,6000,35000,26000"
)
biTextGroup (BiTextGroup
ps "CenterOffsetStrategy"
stg "VerticalLayoutStrategy"
first (Text
va (VaSet
font "Verdana,9,1"
)
xt "22600,14800,27400,16000"
st "<library>"
blo "22600,15800"
)
second (Text
va (VaSet
font "Verdana,9,1"
)
xt "22600,16000,25900,17200"
st "<cell>"
blo "22600,17000"
)
)
gi *21 (GenericInterface
ps "CenterOffsetStrategy"
matrix (Matrix
text (MLText
va (VaSet
isHidden 1
font "Courier New,8,0"
)
xt "0,12000,0,12000"
)
header "Generic Declarations"
)
elements [
]
)
portInstanceVisAsIs 1
portInstanceVis (PortSigDisplay
)
)
defaultCptPort (CptPort
ps "OnEdgeStrategy"
shape (Triangle
ro 90
va (VaSet
vasetType 1
fg "0,65535,0"
)
xt "0,0,750,750"
)
n "In0"
t "std_logic_vector"
b "(15 DOWNTO 0)"
o 0
r 0
d 0
s 0
sf 1
tg (CPTG
ps "CptPortTextPlaceStrategy"
stg "VerticalLayoutStrategy"
f (Text
va (VaSet
font "Verdana,9,0"
)
xt "0,750,1800,1950"
st "In0"
blo "0,1750"
tm "CptPortNameMgr"
)
)
dt (MLText
va (VaSet
font "Courier New,8,0"
)
)
)
defaultCptPortBuffer (CptPort
ps "OnEdgeStrategy"
shape (Diamond
va (VaSet
vasetType 1
fg "65535,65535,65535"
bg "0,0,0"
)
xt "0,0,750,750"
)
n "Buffer0"
t "std_logic_vector"
b "(15 DOWNTO 0)"
m 3
o 0
r 0
d 0
s 0
sf 1
tg (CPTG
ps "CptPortTextPlaceStrategy"
stg "VerticalLayoutStrategy"
f (Text
va (VaSet
font "Verdana,9,0"
)
xt "0,750,3600,1950"
st "Buffer0"
blo "0,1750"
tm "CptPortNameMgr"
)
)
dt (MLText
va (VaSet
font "Courier New,8,0"
)
)
)
DeclarativeBlock *22 (SymDeclBlock
uid 1,0
stg "SymDeclLayoutStrategy"
declLabel (Text
uid 2,0
va (VaSet
font "Arial,8,1"
)
xt "42000,0,47400,1000"
st "Declarations"
blo "42000,800"
)
portLabel (Text
uid 3,0
va (VaSet
font "Arial,8,1"
)
xt "42000,1000,44300,2000"
st "Ports:"
blo "42000,1800"
)
externalLabel (Text
uid 4,0
va (VaSet
font "Arial,8,1"
)
xt "42000,5200,44000,6200"
st "User:"
blo "42000,6000"
)
internalLabel (Text
uid 6,0
va (VaSet
isHidden 1
font "Arial,8,1"
)
xt "42000,0,47800,1000"
st "Internal User:"
blo "42000,800"
)
externalText (MLText
uid 5,0
va (VaSet
font "Courier New,8,0"
)
xt "44000,6200,44000,6200"
tm "SyDeclarativeTextMgr"
)
internalText (MLText
uid 7,0
va (VaSet
isHidden 1
font "Courier New,8,0"
)
xt "42000,0,42000,0"
tm "SyDeclarativeTextMgr"
)
)
lastUid 126,0
)