It’s that time again. I’m clearing out my quotes section on Facebook to make way for the new ones I’m sure to amass in 2008.
“Now cracks a noble heart. Good night, sweet prince,
And flights of angels sing thee to thy rest!” – William Shakespeare; Hamlet Act V, scene ii
“The greatest risk in life is life – it has 100% chance of causing death.” – Unknown
“My memory is nearly gone, but I remember two things, that I am a great sinner, and that Christ is a great Saviour.” – John Newton
“There is nothing left to do but get drunk.” – Franklin Pierce, 14th President of the United States
“I have guidelines for my personal cell phone use while operating a vehicle. The guidelines say I can call back an awesome girl while monitoring the horizon for things that do not fit under the car.” – Matt Matteson, http://dlzip.com/wordpress/2007/11/06/come-play/
“If tyranny and oppression come to this land, it will be in the guise of fighting a foreign enemy.” – James Madison
“Oh, then it inverts! Isn’t that cute!” – Ryan
“Look, Ryan’s making cute circuits!” – Amanda
“I may not have gone where I intended to go, but I think I have ended up where I needed to be.” – Douglas Adams
“In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.” – Douglas Adams, Restaurant at the End of the Universe
“If you judge people, you have no time to love them.” – Mother Theresa
“The biggest problem with communication is the illusion that it has occurred.” – Alan Mulally
“Progress is made by lazy men looking for easier ways to do things.” – Robert A. Heinlein
“The greatest trick the Devil ever pulled was convincing the world that he didn’t exist.” – Verbal, “The Usual Suspects”
“It’s Not A Decision. It’s an IQ Test”. – VC Josh Kopelman on MySpace v. Facebook
“Mysteries require judgments and the assessment of uncertainty.” – Malcom Gladwell
“It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure. Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter.” – Nathaniel Borenstein
“Dear God,”
“Yes, my child?”
“I would like to file a bug report”
-XKCD (http://xkcd.com/c258.html)
“No matter where you go, there you are.” – Buckaroo Banzai
“…brick by brick like a Lego shit-house…” – Michael Hood, blatherWatch
“Ah, the things we could do if we didn’t have to waste time sleeping and eating… What an annoyance!” – Brian Layman, TheCodeCave.com
To copy homework with no understanding of how to do it. Typically accomplished in the 10 minutes before said homework is due.
Originates from the Colorado School of Mines, where cold spiking is so revered that every year they award a prize for the best spiker.
Hey Jeremy! Let me cold spike your thermo or I’ll beat you bloody.
by Spjorkster Mar 10, 2005
A couple thoughts: I don’t know who “Spjorkster” is. I don’t cold spike; it’s stupid and I rather not turn in the homework. The term has been around since at least 2005, that’s amazing.
So now the project. The object reads:
The objective of this take-home project is to design and implement an electronic combination lock. The combination lock is to have a start-up combination code of 1-2-3-4 that MUST be changed immediately upon first-time activation. Furthermore, if the new combination code has three numbers all the same then an error message is to be sent and a different code has to be entered as the combination. Each number in the four-number combination code is to be an eight-bit vector.
The requirements are thus:
The combination lock design MUST be implemented as a state machine (using VHDL), with a minimum of three states: open, lock, set_combo. More that three states may be used (may or may not require greater than 3 states). The outputs should include a lock signal, indicating that the lock is currently locked, an open signal indicating that the lock is currently unlocked. The data inputs are to include the combination code (for when setting a new unlock code.) Additional there is to be a mechanism for resetting the entire circuit. Plus your design is to handle the succession of three wrong guesses at the combination by going into a security mode in which the initial code (1-2-3-4) followed by the entry of the correct code is required to unlock the lock. In your simulation waveforms, you MUST display the state variable (this will display the states traversed in setting, locking and unlocking the combination) along with the inputs and outputs.
There must also be at least four cases in which the combination is incorrect and at least three cases in which the combination is correct. And there is to be a string of three consecutive wrong attempts to unlock putting the circuit in the the security mode in which the initial code (1-2-3-4) immediately followed by the entry of the correct code is required to unlock the lock Remember to include in your report all schematics and/or VHDL code, simulation waveforms and state diagram/table.
Doing this all in VHDL isn’t as painful as I thought, but it was still very painful. I think the only thing I hated programing more so far was threaded tasks in Java. The idea of using states is somewhat similar, but not the same functionally.
Here’s the plan in a nutshell:
Yes, I did that state diagram. Isn’t it pretty?
Here’s the code:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY combinationLock IS
PORT( Clock, Reset : IN STD_LOGIC; -- use positive logic for the reset
w : IN STD_LOGIC_VECTOR (1 DOWNTO 0); -- user action: 00 is no action; 01 is action; 11 is lock
a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- digit a input
b : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- digit b input
c : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- digit c input
d : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- digit d input
aCode : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0); -- code of the first digit
bCode : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0); -- code of the second digit
cCode : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0); -- code of the third digit
dCode : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0); -- code of the fourth digit
unlockAttempt : BUFFER STD_LOGIC_VECTOR (1 DOWNTO 0); -- to keep track of how many attmpts have been made to unlock
isLock : OUT STD_LOGIC; -- is the safe locked
isError : OUT STD_LOGIC); -- is there error -- both lights on indicate in combo setting mode!
END combinationLock;
ARCHITECTURE Behavior OF combinationLock IS
TYPE State_type IS(SET_COMBO, LOCK_OPEN, LOCK_SECURE, SECURITY_MODE);
SIGNAL y : State_type;
BEGIN
PROCESS( Reset, Clock)
BEGIN
IF Reset = '1' THEN
aCode <= CONV_STD_LOGIC_VECTOR(1,8);
bCode <= CONV_STD_LOGIC_VECTOR(2,8);
cCode <= CONV_STD_LOGIC_VECTOR(3,8);
dCode <= CONV_STD_LOGIC_VECTOR(4,8);
y <= SET_COMBO;
ELSIF (Clock'EVENT AND Clock = '1') THEN
CASE y IS
WHEN SET_COMBO =>
IF (w(1) = '0' AND w(0) = '0') THEN
y <= SET_COMBO;
ELSIF (w(1) = '0' AND w(0) = '1') THEN
IF ( ( (a = b) AND (b = c) ) OR ( (a = c) AND (c = d) ) OR ( (a = b) AND (b = d) ) OR ( (b = c) AND (c = d) ) )THEN -- three numbers are repeated -- -----
isError <= '1';
y <= SET_COMBO;
ELSE -- program new code
aCode <= a;
bCode <= b;
cCode <= c;
dCode <= d;
isError <= '0';
y <= LOCK_OPEN;
END IF;
END IF;
WHEN LOCK_OPEN =>
isLock <= '0';
unlockAttempt <= CONV_STD_LOGIC_VECTOR(0,2); -- reset the security lockout
IF (w(1) = '0' AND w(0) = '0') THEN
y <= LOCK_OPEN;
ELSIF (w(1) = '0' AND w(0) = '1') THEN
y <= SET_COMBO;
ELSIF (w(1) = '1' AND w(0) = '1') THEN
y <= LOCK_SECURE;
END IF;
WHEN LOCK_SECURE =>
isLock <= '1'; -- set the lock indicator
isError <= '0'; -- clear all errors because it's locked now
IF (w(1) = '0' AND w(0) = '0') THEN
y <= LOCK_SECURE;
ELSIF ( w(1) = '0' AND w(0) = '1') THEN
IF (unlockAttempt = CONV_STD_LOGIC_VECTOR(0,2) ) THEN
IF (a = aCode AND b = bCode AND c = cCode AND d = dCode) THEN
y <= LOCK_OPEN;
ELSE
unlockAttempt <= CONV_STD_LOGIC_VECTOR(1,2);
y <= LOCK_SECURE;
END IF;
ELSIF (unlockAttempt = CONV_STD_LOGIC_VECTOR(1,2) ) THEN
IF (a = aCode AND b = bCode AND c = cCode AND d = dCode) THEN
y <= LOCK_OPEN;
ELSE
unlockAttempt <= CONV_STD_LOGIC_VECTOR(2,2);
y <= LOCK_SECURE;
END IF;
ELSIF (unlockAttempt = CONV_STD_LOGIC_VECTOR(2,2) ) THEN
IF (a = aCode AND b = bCode AND c = cCode AND d = dCode) THEN
y <= LOCK_OPEN;
ELSE
unlockAttempt <= CONV_STD_LOGIC_VECTOR(3,2);
y <= SECURITY_MODE;
END IF;
ELSIF (unlockAttempt = CONV_STD_LOGIC_VECTOR(3,2)) THEN
y <= SECURITY_MODE;
END IF;
END IF;
WHEN SECURITY_MODE =>
IF (w(1) = '0' AND w(0) = '0') THEN
y <= SECURITY_MODE;
ELSIF (w(1) = '0' AND w(0) = '1') THEN
IF(a = CONV_STD_LOGIC_VECTOR(1,8) AND b = CONV_STD_LOGIC_VECTOR(2,8) AND c = CONV_STD_LOGIC_VECTOR(3,8) AND d = CONV_STD_LOGIC_VECTOR(4,8)) THEN
unlockAttempt <= CONV_STD_LOGIC_VECTOR(2,2);
y <= LOCK_SECURE;
END IF;
END IF;
END CASE;
END IF;
END PROCESS;
END Behavior;
In all states (except Reset, which isn’t defined as typical state), ’00’ is used to stay within the state. ’01’ is used as an action key and ’11’ is used to lock the device (as noted with comments within the VHDL code). isError is ‘1’ when a user has entered a new invalid combination (any combination with where 3 digits are the same). Security Mode is entered when three unsuccessful attempts have been made to unlock the device. When this happens, the Security Mode-state is entered and the user must enter ‘1 2 3 4’. When this happens, the user is sent back to the Lock Secure-state and is granted one try before being kicked back to the Security Mode-state. However, if the attempt is correct, the user is sent to the Lock Open-state where they can change the combination or lock the device again.
Here’s the schematic:
…and the waveforms, which shows that it does indeed work:
Note: realACode, realBCode, realCCode, realDCode, realUnlock[1] and realUnlock[0] are debugging variables used to ensure that the device is working properly during testing. real*Code is used to display the stored combination code and realUnlock[*] is used to count how many attempts have been tried to unlock the device.
All in all, pretty cool. Minus the nine hours or so it took to do it.
Megan Meier, who had trouble controlling her weight and was self-conscious about it, was thrilled when a 16-year-old hottie calling himself Josh Evans approached her online one day and asked to be added to her MySpace friends list. The two became fast friends, though they never met in person. Then one day Evans turned on Meier and began sending her hateful messages. His negative comments grew in intensity and left Megan feeling deeply wounded. Already prone to depression and low self-esteem, she took the attacks on her worth to heart and hung hanged herself.
Okay, sad and tragic. Girl meets boy, girl falls in love with boy, and perhaps in series of events somewhat similar to Romeo and Juliet, girl takes her own life. Here’s where things get down right creepy.
Six weeks after Megan died, on a Saturday morning, a neighbor down the street, a different neighbor, one they didn’t know well, called and insisted that they meet that morning at a counselor’s office in northern O’Fallon.
…
She told the Meiers that Josh Evans was created by adults, a family on their block. These adults, she told the Meiers, were the parents of Megan’s former girlfriend, the one with whom she had a falling out.
…
According to Tina, Megan had gone on vacations with this family. They knew how she struggled with depression, that she took medication.
Like I said, the end would be surprising. Interestingly enough, no criminal charges are going to be filed. The St. Charles Journal decided not to publish the names of the persons involved for safety reasons, however some bloggers have been able to out at least one of the people involved based on information within the article. You should really read the entire article because it is well written.
Thanks to Amanda for the original heads on up this.