vhdl in 1h
TRANSCRIPT
![Page 1: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/1.jpg)
VHDL in 1h
Martin Schöberl
![Page 2: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/2.jpg)
AK: JVMHW VHDL 2
VHDL /= C, Java,…
Think in hardwareAll constructs run concurrent
Different from software programmingForget the simulation explanationVHDL is complex
We use only a small subset
![Page 3: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/3.jpg)
AK: JVMHW VHDL 3
Signals are Wires
Usestd_logic
std_logic_vector (n downto 0)
unsigned
VariablesElegant for some constructsEasy to produce too much logicAvoid them
![Page 4: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/4.jpg)
AK: JVMHW VHDL 4
Synchronous Design
RegisterClock, reset
Combinatorial logicAnd, or,…+, -=, /=, >,…
![Page 5: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/5.jpg)
AK: JVMHW VHDL 5
Register
Changes the value on the clock edge
process(clk)
begin
if rising_edge(clk) then
reg <= data;
end if;
end process;
![Page 6: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/6.jpg)
AK: JVMHW VHDL 6
Register with Reset
Usually has an asynchronous reset
process(clk, reset)
begin
if (reset='1') then
reg <= "00000000";
elsif rising_edge(clk) then
reg <= data;
end if;
end process;
![Page 7: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/7.jpg)
AK: JVMHW VHDL 7
Combinational Logic
Simple expressions as signal assignmentConcurrent statement
a <= b;
c <= a and b;
![Page 8: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/8.jpg)
AK: JVMHW VHDL 8
Combinational LogicComplex expressions in a processSequential statementInput signals in the sensitivity listAssign a value to the output for each case
process(a, b)begin
if a=b thenequal <= '1';gt <= '0';
elseequal <= '0';if a>b then
gt <= '1';else
gt <= '0';end if;
end if;
end process;
![Page 9: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/9.jpg)
AK: JVMHW VHDL 9
Defaults for Combinational process(a, b)begin
equal <= '0';gt <= '0';
if a=b thenequal <= '1';
end if;if a>b then
gt <= '1';end if;
end process;
![Page 10: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/10.jpg)
AK: JVMHW VHDL 10
Constants
Single bit ’0’ and ’1’Use for std_logic
Bit arrays ”0011”Use for std_logic_vector and unsigned
Integer: 1, 2, 3Use for integer, unsigned
![Page 11: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/11.jpg)
AK: JVMHW VHDL 11
Example: Countersignal reg : std_logic_vector(7 downto 0);signal count : std_logic_vector(7 downto 0);
begin
-- the adder processprocess(reg) begin
count <= std_logic_vector(unsigned(reg) + 1);
end process;
-- the register processprocess(clk, reset) begin
if reset='1' thenreg <= (others => '0');
elsif rising_edge(clk) thenreg <= count;
end if;
end process;
-- assign the counter to the out portdout <= reg;
![Page 12: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/12.jpg)
AK: JVMHW VHDL 12
Counter in a Single Process-- we now use unsigned for the countersignal reg : unsigned(7 downto 0);
begin
-- a single process:process(clk, reset) begin
if reset='1' thenreg <= (others => '0');
elsif rising_edge(clk) thenreg <= reg + 1;
end if;
end process;
-- assign the counter to the out portdout <= std_logic_vector(reg);
![Page 13: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/13.jpg)
AK: JVMHW VHDL 13
Quiz 1process(a, b, sel) begin
if sel='0' then
data <= a;
else
data <= b;
end if;
end process;
A 2:1 Multiplexer
![Page 14: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/14.jpg)
AK: JVMHW VHDL 14
Quiz 2process(sel, a, b, c, d) begin
case sel iswhen "00" =>
data <= a;when "01" =>
data <= b;when "10" =>
data <= c;when others =>
data <= d;end case;
end process;
4:1 Multiplexer (Mux)
![Page 15: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/15.jpg)
AK: JVMHW VHDL 15
Quiz 3process(sel) begin
case sel iswhen "00" =>
z <= "0001";when "01" =>
z <= "0010";when "10" =>
z <= "0100";when "11" =>
z <= "1000";when others =>
z <= "XXXX";end case;
end process;
2 to 4 decoder
![Page 16: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/16.jpg)
AK: JVMHW VHDL 16
Quiz 4process(clk, reset) begin
if reset='1' then
reg <= (others => '0');
elsif rising_edge(clk) then
if en='1' then
reg <= data;
end if;
end if;
end process;
Register with enable
![Page 17: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/17.jpg)
AK: JVMHW VHDL 17
Quiz 5process(data, en) begin
if en='1' then
reg <= data;
end if;
end process;
A Latch!VERY bad…
![Page 18: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/18.jpg)
AK: JVMHW VHDL 18
User defined types
State machine statesOperation type
type rgb_type is (red, green, blue);
signal color : rgb_type;
begin
color <= red;
![Page 19: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/19.jpg)
AK: JVMHW VHDL 19
A simple ALUtype op_type is (op_add, op_sub, op_or, op_and);signal op : op_type;
begin
process(op, a, b) begin
case op iswhen op_add =>
result <= a + b;when op_sub =>
result <= a - b;when op_or =>
result <= a or b;when others =>
result <= a and b;end case;
end process;
![Page 20: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/20.jpg)
AK: JVMHW VHDL 20
File structurelibrary ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;
entity alu isport (
clk, reset : in std_logic;a_in, b_in : in std_logic_vector(7 downto 0);dout : out std_logic_vector(7 downto 0)
);end alu;
architecture rtl of alu issignal a, b : unsigned(7 downto 0);...
begina <= unsigned(a_in);dout <= std_logic_vector(result);
process(op, a, b) begin...
end process;end rtl;
![Page 21: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/21.jpg)
AK: JVMHW VHDL 21
Adder as Componentlibrary ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;
entity add isport (
a, b : in std_logic_vector(7 downto 0);dout : out std_logic_vector(7 downto 0)
);end add;
architecture rtl of add is
signal result : unsigned(7 downto 0);signal au, bu : unsigned(7 downto 0);
beginau <= unsigned(a);bu <= unsigned(b);result <= au + bu;dout <= std_logic_vector(result);
end rtl;
![Page 22: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/22.jpg)
AK: JVMHW VHDL 22
Component UseDeclaration
component add is
port (
a : in std_logic_vector(7 downto 0);
b : in std_logic_vector(7 downto 0);
dout : out std_logic_vector(7 downto 0)
);
end component add;
Instantiation
cmp_add: add port map (a_in, b_in, sum);
![Page 23: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/23.jpg)
AK: JVMHW VHDL 23
Componentlibrary ieee;…
entity alu is…
end alu;
architecture rtl of alu iscomponent add is
port (a, b : in std_logic_vector(7 downto 0);dout : out std_logic_vector(7 downto 0)
);end component add;
signal a, b : unsigned(7 downto 0);signal sum : std_logic_vector(7 downto 0);
begina <= unsigned(a_in);cmp_add : add port map (a_in, b_in, sum);...
end rtl;
![Page 24: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/24.jpg)
AK: JVMHW VHDL 24
State Machinearchitecture rtl of sm1 is
type state_type is (green, orange, red);signal state_reg : state_type;signal next_state : state_type;
begin
-- state registerprocess(clk, reset)begin
if reset='1' thenstate_reg <= green;
elsif rising_edge(clk) thenstate_reg <= next_state;
end if;
end process;
-- output of state machineprocess(state_reg) begin
if state_reg=red thenring_bell <= '1';
elsering_bell <= '0';
end if;
end process;
-- next state logicprocess(state_reg, bad_event, clear) begin
next_state <= state_reg;
case state_reg is
when green =>if bad_event = '1' then
next_state <= orange;end if;
when orange =>if bad_event = '1' then
next_state <= red;end if;
when red =>if clear = '1' then
next_state <= green;end if;
end case;
end process;
end rtl;
![Page 25: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/25.jpg)
AK: JVMHW VHDL 25
State Machinearchitecture rtl of sm2 is
type state_type is (green, orange,red);
signal state_reg : state_type;signal next_state : state_type;
begin
-- state registerprocess(clk, reset)begin
if reset='1' thenstate_reg <= green;
elsif rising_edge(clk) thenstate_reg <= next_state;
end if;
end process;
-- next state logic and outputprocess(state_reg, bad_event, clear) begin
next_state <= state_reg;ring_bell <= '0';
case state_reg is
when green =>if bad_event = '1' then
next_state <= orange;end if;
when orange =>if bad_event = '1' then
next_state <= red;end if;
when red =>ring_bell <= '1';if clear = '1' then
next_state <= green;end if;
end case;
end process;
end rtl;
![Page 26: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/26.jpg)
AK: JVMHW VHDL 26
State Machine in one Processarchitecture rtl of sm3 is
type state_type is (green, orange, red);signal state : state_type;
begin
-- single processprocess(clk, reset)begin
if reset='1' thenstate <= green;ring_bell <= '0';
elsif rising_edge(clk) then
case state iswhen green =>
if bad_event = '1' thenstate <= orange;
end if;when orange =>
if bad_event = '1' thenstate <= red;ring_bell <= '1';
end if;when red =>
ring_bell <= '1';if clear = '1' then
state <= green;ring_bell <= ‘0';
end if;end case;
end if;
end process;
end rtl;
![Page 27: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/27.jpg)
AK: JVMHW VHDL 27
Summary
Think in hardware!Beware of unassigned pathes (latch!)Use simple typesUse simple statements
![Page 28: VHDL in 1h](https://reader031.vdocuments.site/reader031/viewer/2022021804/620db104d863ae518636ec27/html5/thumbnails/28.jpg)
AK: JVMHW VHDL 28
More Information
FAQ comp.lang.vhdlMark Zwolinski, Digital System Design with VHDL.