实验一:38译码器的VHDL实现及原理图实现

一、QUARTUS II的简单上手及基本操作

找了好多好多,感觉网上都不太人性化,所以自己记录了一下自己写的,还是有点意思的的,但是这前面的没啥意思,到后面连起来用的时候就有意思了!

1、项目的创建

1、File -> New Project Wizard在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
后面没有选择, 一路无脑下来,项目就已经安装好了!

2、两种方法实现38译码器
一、纯原理图法
1.1新建一个图形设计文件

在这里插入图片描述

1.2 放置元器件

只要在如下区域双击,就可以开始放置元器件了!
在这里插入图片描述在这里插入图片描述基本上用得了的就是如下栏

1.3 主要使用到的元器件的种类
  1. NOT(可以直接用搜索框搜,没必要傻傻的找)
    在这里插入图片描述
  2. AND
    在这里插入图片描述
1.4 按图连线

在这里插入图片描述

1.5 编译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EM96ep0w-1663673120324)(C:\Users\xihuan\AppData\Roaming\Typora\typora-user-images\image-20220920183335946.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YinfJrko-1663673120325)(C:\Users\xihuan\AppData\Roaming\Typora\typora-user-images\image-20220920183418321.png)]
显示这个就算成功了,然后可以先看下效果,就是仿真一下,看看是不是自己想要的结果

1.6 仿真

1.6.1 新建一个VWF文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GxETUjQ6-1663673120325)(C:\Users\xihuan\AppData\Roaming\Typora\typora-user-images\image-20220920183727332.png)]

1.6.2 设置仿真文件
在这里插入图片描述

1.6.3 在in 端口设置输入波形信号

可以直接框选几栏,然后再工具栏设置高低电平

也可以框选几栏,然后双击,就可以设置这里的值
在这里插入图片描述
小tips: 可以将这里的进制位改为十进制,因为可以看起来很方便(主要是懒得换算,输入一位就可以达到二进制四位的效果。)

设置成这样就可以了,表示1.2.3…

在这里插入图片描述

1.6.4 开始仿真

会弹出一个新页面,显示出仿真波形。仿真就这样结束了,说明符合我们的预期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1RRlQxe-1663673120328)(C:\Users\xihuan\AppData\Roaming\Typora\typora-user-images\image-20220920185344767.png)]在这里插入图片描述

1.7 设置引脚,准备下载!

Assignments->Pin Planner

在这里插入图片描述
在这里输入对应的引脚号就行,然后直接退出

Tools->Programmer,下面对着书搞就行。(开发板不在身边,下不了程序)

总结一下
  1. 创建项目

  2. 创建图形设计文件

  3. 选择元器件

  4. 画图

  5. 编译

  6. 仿真

  7. 选择引脚

  8. 下载

    二、纯VHDL

    相同步骤省略,只关注VHDL

    2.1创建vhd文件

在这里插入图片描述
g)]

小tips:看个人喜好,我喜欢用Notepad来代替quartus ii的编译

2.2 导入常用库

类似与c语言的Include 和python 中的import(一般无脑导入就行)

Library IEEE;
Use IEEE.STD_LOGIC_1164.all;
2.3 编写实体

实体,就是主要就是定义要使用的端口,注意,实体名称一定要和vhdl文件名称一样,否则报错

Entity sch38yimaqi_vhdl IS
    Port(input1:IN std_logic_vector (2 DOWNTO 0); 
        D:OUT std_logic_vector (7 DOWNTO 0));
End;
2.4 编写结构体

结构体的感觉更像是其他语言里面函数之类的感觉,就是去实现功能,这里一个并行就可以完成

ARCHITECTURE behave OF sch38yimaqi_vhdl IS
    BEGIN
    PROCESS(input1) --进程程序,程序顺序执行
    BEGIN
        CASE input1 IS
            WHEN "000" =>   D<="11111110";   -- 八位,当输入为000时,只有最后一位置0
            WHEN "001" =>   D<="11111101";
            WHEN "010" =>   D<="11111011";
            WHEN "011" =>   D<="11110111";
            WHEN "100" =>   D<="11101111";
            WHEN "101" =>   D<="11011111";
            WHEN "110" =>   D<="10111111";
            WHEN "111" =>   D<="01111111";
            WHEN OTHERS =>  D<="11111111";
        END CASE;
    END PROCESS;
END;

没有在学校的fpga的板子上试验过,如果运行不成功的话,应该只要修改一下逻辑值就够了,就是0 1 那些。

3、拓展题

1、 LED9-LED12全部灭掉,无非就是让led的那些端口全部置0(假如设置1 为亮的话),可以在定义端口的时候,直接给他们赋初值的时候就直接解决掉他们。

 D4:OUT std_logic_vector (3 DOWNTO 0):="0000");   -- 初始化D9-D12   置低点位,不亮。

2、添加使能端的问题,同样也是一样的,只要添加一个if的判断语句就可以解决

ARCHITECTURE behave OF sch38yimaqi_more IS
BEGIN
    PROCESS(input1) --进程程序,程序顺序执行
    BEGIN
        IF EN='1' THEN                           -- 当使能为1时,进行有效译码
            CASE input1 IS
                WHEN "111" =>   D<="00000001";   -- 八位,当输入为000时,只有最后一位置0    实验led亮为1   按键摁下为0
                WHEN "110" =>   D<="00000010";
                WHEN "101" =>   D<="00000100";
                WHEN "100" =>   D<="00001000";
                WHEN "011" =>   D<="00010000";
                WHEN "010" =>   D<="00100000";
                WHEN "001" =>   D<="01000000";
                WHEN "000" =>   D<="10000000";
                WHEN OTHERS =>  D<="00000000";
            END CASE;
        ELSIF EN='0' THEN                        -- 不需要译码时,使能端置0,全部输出低电平
            D<="00000000";
        END IF;
    END PROCESS; 
END;

3、流水灯的实现具体可以参考另外一篇,这里主要是有两种思路

第一种,就是用rol函数(就是沿着向量右移一位)

可以参考这个

PROCESS(tim)                                        -- 含有多个进程语句,都为并行执行
BEGIN
		IF(tim'event and tim = '1') THEN
            sta <= sta rol 1;
		END IF;
END PROCESS;

第二种是,直接连接向量的头,也可以达到移位的效果

	BEGIN
		IF(tim'event and tim = '1') THEN
			sta <= sta(6 DOWNTO 0) & sta(7);
		END IF;
	END PROCESS;

4、字太多了,不想看
完全代码如下

Library IEEE;
Use IEEE.STD_LOGIC_1164.all;
Entity sch38yimaqi_more IS
    Port(input1:IN std_logic_vector (2 DOWNTO 0); 
        EN:IN std_logic;
        D:OUT std_logic_vector (7 DOWNTO 0);
        D4:OUT std_logic_vector (3 DOWNTO 0):="0000");   -- 初始化D9-D12   置低点位,不亮。
End;
ARCHITECTURE behave OF sch38yimaqi_more IS
BEGIN
    PROCESS(input1) --进程程序,程序顺序执行
    BEGIN
        IF EN='1' THEN                           -- 当使能为1时,进行有效译码
            CASE input1 IS
                WHEN "111" =>   D<="00000001";   -- 八位,当输入为000时,只有最后一位置0    实验led亮为1   按键摁下为0
                WHEN "110" =>   D<="00000010";
                WHEN "101" =>   D<="00000100";
                WHEN "100" =>   D<="00001000";
                WHEN "011" =>   D<="00010000";
                WHEN "010" =>   D<="00100000";
                WHEN "001" =>   D<="01000000";
                WHEN "000" =>   D<="10000000";
                WHEN OTHERS =>  D<="00000000";
            END CASE;
        ELSIF EN='0' THEN                        -- 不需要译码时,使能端置0,全部输出低电平
            D<="00000000";
        END IF;
    END PROCESS; 
END;

  • 24
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xihuanafengxx

好累好累好累!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值