Shift register in VHDL - Time & Space Complexity
We want to understand how the time to run a shift register changes as its size grows.
How does the number of steps grow when we increase the number of bits in the register?
Analyze the time complexity of the following code snippet.
process(clk)
begin
if rising_edge(clk) then
shift_reg <= shift_reg(shift_reg'length-2 downto 0) & data_in;
end if;
end process;
This code shifts all bits in the register to the left by one and inserts a new bit at the right on each clock.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Moving each bit one position to the left inside the shift register.
- How many times: This happens once every clock cycle, affecting all bits in the register.
As the register size grows, the number of bits moved each clock grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 9 bit moves per clock |
| 100 | 99 bit moves per clock |
| 1000 | 999 bit moves per clock |
Pattern observation: The work grows directly with the number of bits in the register.
Time Complexity: O(n)
This means the time to shift grows in a straight line as the register gets bigger.
[X] Wrong: "Shifting bits happens instantly no matter the register size."
[OK] Correct: Each bit must move one step, so more bits mean more work and more time.
Understanding how operations grow with input size helps you explain hardware behavior clearly and shows you think about efficiency.
"What if we used parallel loading instead of shifting? How would the time complexity change?"
Practice
shift register in VHDL?Solution
Step 1: Understand the function of a shift register
A shift register moves bits through a series of flip-flops, shifting data on each clock pulse.Step 2: Compare options with the function
Only To move bits step by step on each clock pulse describes moving bits step by step on clock pulses, which matches the shift register's purpose.Final Answer:
To move bits step by step on each clock pulse -> Option BQuick Check:
Shift register = bit shifting [OK]
- Confusing shift register with memory storage
- Thinking it performs arithmetic
- Assuming it generates random data
Solution
Step 1: Understand VHDL signal declaration for vectors
In VHDL,std_logic_vectoris used for bit vectors, and ranges are usually declared withdowntofor descending indexes.Step 2: Check each option
signal shift_reg : std_logic_vector(3 downto 0); usesstd_logic_vector(3 downto 0), which is correct for a 4-bit vector. signal shift_reg : integer range 0 to 3; uses integer, which is incorrect. signal shift_reg : bit_vector(0 to 4); usesbit_vectorbut with wrong range size (0 to 4 is 5 bits). signal shift_reg : std_logic_vector(0 to 4); usesstd_logic_vectorbut with wrong range size (0 to 4 is 5 bits).Final Answer:
signal shift_reg : std_logic_vector(3 downto 0); -> Option DQuick Check:
std_logic_vector with downto for 4 bits = signal shift_reg : std_logic_vector(3 downto 0); [OK]
- Using integer instead of vector type
- Incorrect vector range size
- Confusing bit_vector with std_logic_vector
shift_reg after two rising clock edges if the input data_in is '1' and initial shift_reg is "0000"?process(clk)
begin
if rising_edge(clk) then
shift_reg <= data_in & shift_reg(3 downto 1);
end if;
end process;Solution
Step 1: Understand the shift operation
On each rising clock edge, the new bitdata_in('1') is shifted into the leftmost bit, and the rest of the bits shift right by one.Step 2: Calculate after first clock edge
Initialshift_reg= "0000".
After first clock: shift_reg = '1' & "000" = "1000".Step 3: Calculate after second clock edge
Now shift_reg = "1000".
After second clock: shift_reg = '1' & "100" = "1100".Final Answer:
"1100" -> Option CQuick Check:
Shift left with input '1' twice = "1100" [OK]
- Not shifting bits correctly
- Confusing bit order in concatenation
- Forgetting initial value
process(clk)
begin
if clk = '1' then
shift_reg <= data_in & shift_reg(3 downto 1);
end if;
end process;Solution
Step 1: Check clock condition
The process usesif clk = '1' thenwhich triggers whenever clk is high, not just on rising edge.Step 2: Correct clock edge detection
Proper edge detection in VHDL usesif rising_edge(clk) thento trigger only on the clock's rising edge.Final Answer:
Incorrect clock edge detection -> Option AQuick Check:
Use rising_edge(clk) for clock triggers [OK]
- Using clk = '1' instead of rising_edge(clk)
- Ignoring reset signal importance
- Confusing signal assignment operators
Solution
Step 1: Identify asynchronous reset
An asynchronous reset is checked first in the sensitivity list and outside the clock edge condition, soif reset = '1' thencomes beforeelsif rising_edge(clk).Step 2: Check shift direction and concatenation
Shifting right means bits move to lower indexes, so new bitdata_inis concatenated at the right end:shift_reg(2 downto 0) & data_in.Step 3: Verify code snippet
process(clk, reset) begin if reset = '1' then shift_reg <= (others => '0'); elsif rising_edge(clk) then shift_reg <= shift_reg(2 downto 0) & data_in; end if; end process; matches asynchronous reset first, then rising edge clock shift right with correct concatenation.Final Answer:
process(clk, reset) begin if reset = '1' then shift_reg <= (others => '0'); elsif rising_edge(clk) then shift_reg <= shift_reg(2 downto 0) & data_in; end if; end process; -> Option AQuick Check:
Async reset first, then shift right = process(clk, reset) begin if reset = '1' then shift_reg <= (others => '0'); elsif rising_edge(clk) then shift_reg <= shift_reg(2 downto 0) & data_in; end if; end process; [OK]
- Placing reset inside clock edge condition
- Wrong bit concatenation order for shift direction
- Missing reset in sensitivity list
Ready to prove it?
Pass the test and this pattern moves unknown
