介绍
前面已经实现了38译码器,现在我们来实现一下编码器。
对于编码器,就是译码的反过程嘛,哈哈哈哈,大家一定很熟悉了,不多赘述了。
由于之前已经实现了38译码器,所以这里我与之前实现的译码器结合,实现编码译码的全过程,仿真结果和源码都放在最后了。
真值表
大家参考38译码器的真值表吧,反过来就是了。
设计文件
library ieee;
use ieee.std_logic_1164.all;
entity encoder is
port(input : in std_logic_vector(7 downto 0);
output : out std_logic_vector(2 downto 0));
end encoder;
architecture encoder of encoder is
begin
output <= "000" when input = "11111110" else
"001" when input = "11111101" else
"010" when input = "11111011" else
"011" when input = "11110111" else
"100" when input = "11101111" else
"101" when input = "11011111" else
"110" when input = "10111111" else
"111" when input = "01111111" else
"ZZZ";
end encoder;
测试文件
library ieee;
use ieee.std_logic_1164.all;
entity tb_encoder is
end tb_encoder;
architecture encoder of tb_encoder is
component encoder is
port(input : in std_logic_vector(7 downto 0);
output : out std_logic_vector(2 downto 0));
end component encoder;
signal input : std_logic_vector(7 downto 0);
signal output : std_logic_vector(2 downto 0);
begin
dut : encoder
port map(
input => input,
output => output);
process
begin
input <= "11111101";
wait for 20ns;
input <= "01111111";
wait for 20ns;
input <= "11101111";
wait for 20ns;
input <= "11111011";
wait for 20ns;
input <= "11111011";
wait for 20ns;
end process;
end encoder;
仿真结果
使用上面的设计代码和测试代码就能仿真出上面的波形了。
上面的仿真结果代表了编码译码的全过程。需要新建一个顶层模块吧,代码放在附录了,再结合之前的译码设计代码和上面的编码设计代码就可以完成了。
附录
分别实现编码和译码的功能后,需要在顶层中实现端口映射和实例化,这部分相关的代码放在这了。
顶层文件
library ieee;
use ieee.std_logic_1164.all;
entity coder is
port( ena : in std_logic;
input : in std_logic_vector(7 downto 0);
output : out std_logic_vector(7 downto 0));
end coder;
architecture coder of coder is
--编码器的元件声明
component encoder is
port( input : in std_logic_vector(7 downto 0);
outp1: out std_logic_vector(2 downto 0));
end component encoder;
--译码器的元件声明
component decoder is
port( ena : in std_logic;
inp1 : in std_logic_vector(2 downto 0);
output : out std_logic_vector(7 downto 0));
end component decoder;
--定义中间变量
signal outp1 : std_logic_vector(2 downto 0);
signal inp1 : std_logic_vector(2 downto 0);
begin
--端口映射
u1 : encoder
port map(input => input,
outp1 => outp1);
u2 : decoder
port map(inp1 => outp1,
ena => ena,
output => output);
end architecture coder;
测试文件
library ieee;
use ieee.std_logic_1164.all;
entity tb_coder is
end tb_coder;
architecture coder of tb_coder is
component coder is
port( ena : in std_logic;
input : in std_logic_vector(7 downto 0);
output : out std_logic_vector(7 downto 0));
end component coder;
signal ena : std_logic := '0';
signal input : std_logic_vector(7 downto 0) :="11111111";
signal output : std_logic_vector(7 downto 0) := "00000000";
begin
dut : coder
port map(ena => ena,
input => input,
output => output);
process
begin
ena <= '0';
input <= "11110111";
wait for 20ns;
ena <= '1';
wait for 20ns;
input <= "11011111";
wait for 20ns;
input <= "11101111";
wait for 20ns;
end process;
end architecture coder;
结语
因为我也刚开始学习嘛,有些地方可能表述不当,我会慢慢学习的。
有什么问题还是欢迎大家留言,哈哈哈哈,希望能带给大家积极的情绪吧。