Thực hiện một bộ đếm chương trình cho vi xử lý.
Bảng chân lý của thanh ghi bộ đếm chương trình PC
PCclr
|
PCld
|
PCincr
|
CLK
|
PC_in
|
PC_out
|
‘1’
|
X
|
X
|
X
|
X
|
0
|
‘0’
|
1
|
X
|
↑
|
–
|
PC_in
|
‘0’
|
‘0’
|
‘1’
|
↑
|
X
|
PC_out + 1
|
‘0’
|
‘0’
|
‘0’
|
↑
|
X
|
PC_out
|
Mã nguồn VHDL thực hiện một thanh ghi bộ đếm chương trình PC (Program Counter) dùng trong các bộ vi lý.
— program_counter.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use WORK.MICROPROCESSOR_LIB.ALL;
— Uncomment the following library declaration if using
— arithmetic functions with Signed or Unsigned values
–use IEEE.NUMERIC_STD.ALL;
— Uncomment the following library declaration if instantiating
— any Xilinx leaf cells in this code.
–library UNISIM;
–use UNISIM.VComponents.all;
entity program_counter is
Port ( clk : in STD_LOGIC;
PCclr : in STD_LOGIC;
PCincr : in STD_LOGIC;
PCld : in STD_LOGIC;
PC_in : in STD_LOGIC_VECTOR (DATA_WIDTH – 1 downto 0);
PC_out : out STD_LOGIC_VECTOR (DATA_WIDTH – 1 downto 0));
end program_counter;
architecture program_counter of program_counter is
signal PC_reg: STD_LOGIC_VECTOR (DATA_WIDTH – 1 downto 0);
begin
process(clk)
begin
if PCclr = ‘1’ then
PC_reg <= (others => ‘0’);
elsif clk’event and clk = ‘1’ then
if PCld = ‘1’ then
PC_reg <= PC_in;
elsif PCincr = ‘1’ then
PC_reg <= PC_reg + 1;
end if;
end if;
end process;
PC_out <= PC_reg;
end program_counter;