一、QUARTUS II的简单上手及基本操作
找了好多好多,感觉网上都不太人性化,所以自己记录了一下自己写的,还是有点意思的的,但是这前面的没啥意思,到后面连起来用的时候就有意思了!
1、项目的创建
1、File -> New Project Wizard
后面没有选择, 一路无脑下来,项目就已经安装好了!
2、两种方法实现38译码器
一、纯原理图法
1.1新建一个图形设计文件
1.2 放置元器件
只要在如下区域双击,就可以开始放置元器件了!
基本上用得了的就是如下栏
1.3 主要使用到的元器件的种类
NOT(可以直接用搜索框搜,没必要傻傻的找)
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,下面对着书搞就行。(开发板不在身边,下不了程序)
总结一下
创建项目
创建图形设计文件
选择元器件
画图
编译
仿真
选择引脚
下载
二、纯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";
————————————————
版权声明:本文为CSDN博主「xihuanafengxx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_49327342/article/details/126959851