赞
踩
找了好多好多,感觉网上都不太人性化,所以自己记录了一下自己写的,还是有点意思的的,但是这前面的没啥意思,到后面连起来用的时候就有意思了!
1、File -> New Project Wizard
后面没有选择, 一路无脑下来,项目就已经安装好了!
只要在如下区域双击,就可以开始放置元器件了!
基本上用得了的就是如下栏
显示这个就算成功了,然后可以先看下效果,就是仿真一下,看看是不是自己想要的结果
1.6.1 新建一个VWF文件
1.6.2 设置仿真文件
1.6.3 在in 端口设置输入波形信号
可以直接框选几栏,然后再工具栏设置高低电平
也可以框选几栏,然后双击,就可以设置这里的值
小tips: 可以将这里的进制位改为十进制,因为可以看起来很方便(主要是懒得换算,输入一位就可以达到二进制四位的效果。)
设置成这样就可以了,表示1.2.3…
1.6.4 开始仿真
会弹出一个新页面,显示出仿真波形。仿真就这样结束了,说明符合我们的预期
Assignments->Pin Planner
在这里输入对应的引脚号就行,然后直接退出
Tools->Programmer,下面对着书搞就行。(开发板不在身边,下不了程序)
g)]
小tips:看个人喜好,我喜欢用Notepad来代替quartus ii的编译
类似与c语言的Include 和python 中的import(一般无脑导入就行)
Library IEEE;
Use IEEE.STD_LOGIC_1164.all;
实体,就是主要就是定义要使用的端口,注意,实体名称一定要和vhdl文件名称一样,否则报错
Entity sch38yimaqi_vhdl IS
Port(input1:IN std_logic_vector (2 DOWNTO 0);
D:OUT std_logic_vector (7 DOWNTO 0));
End;
结构体的感觉更像是其他语言里面函数之类的感觉,就是去实现功能,这里一个并行就可以完成
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 那些。
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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。