草庐IT

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

xihuanafengxx 2023-06-02 原文

第一次实验

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

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

1、项目的创建

1、File -> New Project Wizard
后面没有选择, 一路无脑下来,项目就已经安装好了!

2、两种方法实现38译码器

一、纯原理图法
1.1新建一个图形设计文件

1.2 放置元器件

只要在如下区域双击,就可以开始放置元器件了!
基本上用得了的就是如下栏

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

1.5 编译



显示这个就算成功了,然后可以先看下效果,就是仿真一下,看看是不是自己想要的结果

1.6 仿真

1.6.1 新建一个VWF文件

1.6.2 设置仿真文件

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

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

也可以框选几栏,然后双击,就可以设置这里的值

小tips: 可以将这里的进制位改为十进制,因为可以看起来很方便(主要是懒得换算,输入一位就可以达到二进制四位的效果。)

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

1.6.4 开始仿真

会弹出一个新页面,显示出仿真波形。仿真就这样结束了,说明符合我们的预期

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;

有关实验一:38译码器的VHDL实现及原理图实现的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  7. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  8. ruby - 实现k最近邻需要哪些数据? - 2

    我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项

  9. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  10. ruby - Ruby 1.8 的 Shellwords.shellescape 实现 - 2

    虽然1.8.7的构建我似乎有一个向后移植的Shellwords::shellescape版本,但我知道该方法是1.9的一个特性,在1.8的早期版本中绝对不支持.有谁知道我在哪里可以找到(以Gem形式或仅作为片段)针对Ruby转义的Bourne-shell命令的强大独立实现? 最佳答案 您也可以从shellwords.rb中复制您想要的内容。在Ruby的颠覆存储库的主干中(即GPLv2'd):defshellescape(str)#Anemptyargumentwillbeskipped,soreturnemptyquotes.ret

随机推荐