使用FPGA实现编码器

本文介绍了如何基于已有的38译码器实现编码器,通过真值表设计,给出了编码器的逻辑实现和测试代码,以及顶层模块的端口映射和实例化。作者强调是学习过程中的分享,欢迎提问交流。
摘要由CSDN通过智能技术生成

介绍

前面已经实现了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;


结语

因为我也刚开始学习嘛,有些地方可能表述不当,我会慢慢学习的。

有什么问题还是欢迎大家留言,哈哈哈哈,希望能带给大家积极的情绪吧。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值