github传送门(练习写的代码,约束文件,仿真文件)

文章目录

Vivado

基本流程

关于封装IP核和使用Block Design

Verilog

module / 模块

always块

组合逻辑

时序

Generate块(书上p83)

task / function

其他

仿真

ip核的创建和使用方法:

烧录

BASYS3

按键

防抖方法

数码管

函数

实现固定频率的方法:

数码管数字显示

约束文件

知识点

进位和溢出

Vivado

基本流程

写代码。在sources里添加文件,把写好的模块粘贴进去并保存。

[可选] 写仿真文件 (Simulation)(模板代码)。用来在电脑上测试代码的运行结果是否达到预期,如果没问题就可以下到板子上 (写好仿真文件后在最左边Simulation - Run Simulation)(莽的话可以不用仿真直接上板子)。

综合 (Synthesis)。先检查代码有没有毛病,然后根据代码机器自动生成最优电路图(可以在最左边Synthesis - Open Synthesized Design - Schematics里看到电路图)。

实现 (Implementation)。把综合的结果与现实中的板子具体联系起来(通过约束文件),相当于从软件走到了硬件。

生成比特流文件 (Bitstream)。生成的比特流文件就可以上传到板子上了。

上传到板子上,通过Hardware Manager操作。

关于封装IP核和使用Block Design

千万千万千万不要把IP核导入到源代码所在的工程文件里,测试的时候debug有你哭的。

Verilog

module / 模块

module里的内容都是并发执行的。

不在always和initial块里的代码就是单纯调用这个module的时候才会执行。(如果输入改变了会调用这个module)

always块

多个always块并发执行,也就是说不同的主循环函数并发执行。

always里不能实例化模块

一般组合逻辑电路用阻塞赋值(=),时序逻辑电路用非阻塞赋值(<=)。

组合逻辑

always @(触发器变量)是组合逻辑电路,always @(posedge clk)是时序逻辑电路。

时序

posedge(positive edge) 是上升沿关键字,上升沿指的是变量从0变成1的那个瞬间。对应下降沿(negedge - negative edge)就是变量从1变成0的那一瞬间。因此@(posedge var)指的是对var的上升沿敏感,意思就是var达到上升沿的时候就会触发。

always @()

可以理解成onValueChangeListener,当敏感信号表达式的值发生变化时,就会执行always块。

因此always @(posedge clk)代表在每次时钟clk到达上升沿的时候会执行一次(因为并发执行,所以时序逻辑电路用非阻塞赋值就可以实现与时钟上升沿同步修改变量),因此这个always块里的代码可以理解成主循环。

不论上升沿clk还是下降沿rst,在触发时读取到clk和rst的值都是这两个信号接下来要变成的值。(即clk读取到的值为1,rst读取到的值为0)

Generate块(书上p83)

用来在模块中循环实例化其他模块。关键字为generate,对应声明循环控制变量的关键字为genvar

示例:

genvar i;

generate

for(i=0; i

begin: tag_name

module_name_1 instance_name_1 (input_1,output_1);

//可以继续实例化别的模块,如:

//module_name_2 instance_name_2 (input_2,output_2);

end

endgenerate

//执行完generate块后的实例名字分别为:tag_name[0].module_name_1, tag_name[1].module_name_1 ...

task / function

直接reg、integer、wire不属于端口,调用task/function的时候没有对应的传入。

带返回值的函数是function,只能定义输入,function的名字是输出;不带返回值的函数是task,可以定义输入和输出。

task的output如果有赋值的话至少在module和task中一处定义为reg

task和function内部只能是阻塞赋值

function的返回值可以当作常量

task和function可以带parameter,但 暂时没找到调用时改变参数的方法

task可以启动task和function,function只能启动function

其他

带符号关键字为signed,默认不带符号

assign(连续赋值)只能对wire类型,变量赋值只能对reg类型

注意时序电路在仿真时模块里counter的满足条件要小得多

initial块是初次运行时会执行一次。多个initial块也可以并发执行。

x是未知态,z是高阻态(可以理解成另一种未知态)

casez忽略z,casex既忽略z也忽略x

parameter要理解成常量。变量用reg。

常数定义前的数字表示二进制的位数,与基数无关。比如4’ha等价于4’b1010。

实例化一个模块的时候它的参数是可以改变的,方法有两种:module_name #(param1[, param2...]) instance_name (inputs,outputs); 或module_name instance_name(inputs, outputs);

defparam instance_name.param_1 = param1[, instance_name.param_2 = param2...];

if-else和for等语句不能直接写在模块里,需要写在always中。

判断语句要想写在assign中,可以assign res = (op == 2'b00) ? res1 :

(op == 2'b01) ? res2 :

defaultres;

input和output等信号默认都是wire类型。一般只有在模块中有赋值语句时才需要将output信号定义为reg型。

如果输入的位数与模块定义的输入位数不匹配,模块读进来时高位会自动补x。

仿真

常用的函数:

函数名

描述

$readmemb(filename, mem)

从文件读取二进制数据到 mem 数组

$readmemh(filename, mem)

从文件读取十六进制数据到 mem 数组

$display(“output” [, var] );

在console中输出,语法类似c的printf,%b 二进制, %d, %h, %t表示时间,对应var = $time

$write(“output”[, var] );

同display,但display自带换行,write不带

ip核的创建和使用方法:

http://www.digilent.com.cn/community/332.html%EF%BC%89

烧录

1.基本知识:

RAM(random access memory)即随机存储内存,这种存储器在断电时将丢 失其存储内容,故主要用于存储短时间使用的程序。

ROM(Read-Only Memory)即只读内存,是一种只能读出事先所存数据的固 态半导体存储器。

RAM和ROM分别对应电脑的内存和硬盘。

2.烧录含义:

直接把代码上传到板子相当于上传到RAM(内存)里,烧录是把代码上传到ROM(硬盘)里。

板子每次开机或重启的时候会直接从ROM里调用程序。

3.实现:

参考《你的Basys 3第一个入门实验官方指导手册.pdf》第35页

烧录时选择Memory Device型号:s25fl032p-spi-x1_x2_x4

BASYS3

新建工程时选择板子型号:xc7a35tcpg236-1

BASYS3板子自带的时钟CLK频率是100MHz,对应引脚名为W5,固定常数:

parameter T1S = 100000000 // 即100M

parameter T1MS = 100000;

//或

parameter T1S = 10**8;

parameter T1MS = 10**5;

按键

按键按下为1,弹起为0

防抖方法

间隔一定时间读取两次按键值,如果两次读取结果一样则认为不抖了。

数码管

数码管是一个四位带小数点的七段共阳极数码管(低电平有效,即0是点亮,1是熄灭),共12位。

从高位(第11位)到低位(第0位)分别为:

11 ~ 8位: 控制第几个数码管的显示情况。比如若第10位是0,后面7~0位的值就作用于第二个数码管的显示情况

7 ~ 1位: 从最上面一横开始,顺时针一位对应一个数码管的一小段(一个小直线),中间横线为第1位

0位: 小数点是否显示

e.g.1011_00000000_1表示第二个数码管显示"8",小数点不亮,其他三个数码管均熄灭

要想四个数码管显示不同的数字,控制数码管以很快的频率一次显示一位即可。

(示例代码)

针脚名

位数

含义

W4

11

控制第1个数码管的显示情况

V4

10

控制第2个数码管的显示情况

U4

9

控制第3个数码管的显示情况

U2

8

控制第4个数码管的显示情况

W7

7

a

W6

6

b

U8

5

c

V8

4

d

U5

3

e

V5

2

f

U7

1

g

V7

0

dp(小数点)

函数

实现固定频率的方法:

?这种方法不能在硬件上实现,会报错,只能在仿真的时候实现。

input CLK;

parameter T1MS = 10**5;

always @(posedge CLK) begin

repeat(T1MS*200) @(posedge CLK) // wait 200ms

//do something like changing input values here...

end

input CLK;

parameter T1MS = 10**5;

integer count = 0;

always @(posedge CLK) begin

count <= count + 1;

if (count == T1MS*200) begin

count <= 0;

//do every 200ms

//do something like changing input values here...

end

end

input CLK;

parameter T1MS = 10**5;

integer count = 0;

reg CLK_10HZ = 0;

always @(posedge CLK) begin

count <= count + 1;

if (count == T1MS*100) begin

count <= 0;

CLK_10HZ = ~CLK_10HZ;

end

end

always @(posedge CLK_10HZ) begin

//do every 100ms / 10HZ

//do something like changing input values here...

end

数码管数字显示

代码在这

约束文件

约束文件是用来把代码里的input、output的变量名和板子上的管脚一一对应起来用的,格式:

配置引脚:

set_property PACKAGE_PIN 引脚名 [get_ports 对应代码里的端口变量名]

配置标准电压:

set_property IOSTANDARD LVCMOS33 [get_ports 对应代码里的端口变量名]

BASYS3板子上所有引脚对应的约束文件(记得端口名改成自己的):

知识点

进位和溢出

进位只在涉及无符号数时有意义

溢出只在使用有符号数时才有意义

只有两操作数符号位相同,且与结果符号位不同时才溢出

即overflow = x*y*~s + ~x*~y*s

四位共阳极数码管显示函数_Verilog笔记相关推荐

  1. 四位共阳极数码管显示函数_数码管模块.doc

    数码管模块 数码管 1.概 述 数码管模块采用四位共阳极数码管,用于显示数字和少数特殊字符.可以在机器人项目中使用该模块,用于显示速度.时间.分数.温度.距离等传感器的值.同时,Makeblock提供 ...

  2. 四位共阳极数码管显示函数_【项目8-任务10-小组13】利用四位数码管实现动态扫描显示...

    学习任务 1.四位数码管的电路结构与显示原理 (什么是位选.什么是段选.共阴与共阳的区别.显示4位数字,需要多少条口线?显示n位数字呢?) 2.Arduino直接连接四位数码管实现四位阿拉伯数字显示 ...

  3. 四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数

    #include #include "DS1302.H" sbit K_S = P1^0;    //显示模式sbit K_M = P1^1;    //修改sbit K_I = ...

  4. 四位共阳极数码管显示函数_74LS164驱动4位共阳数码管代码

    #include "reg52.h" #define u16 unsigned int #define u8 unsigned char sbit CLK=P2^0; sbit D ...

  5. 四位共阳极数码管显示函数_初学者,求助!!设计一个4位LED数码管动态扫描显示电路,用...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; ...

  6. 8051/2单片机基础 实现开关,驱动2位的共阳极数码管显示小数,驱动喇叭播放音乐

    1. 实现开关,开关2次后,LED闪烁4次  2. 实现驱动共阳极数码关显示 3.1 3. 驱动喇叭播放 ,dao,re,mi,fa,sao,la,xi C代码: /** * 8051 DEMO 2 ...

  7. 四位共阴极数码管显示“12.34”的主程序

    四位共阴极数码管显示"12.34"的主程序 本程序使用共阴极数码管,使用了TM1650驱动芯片,在stm32F103调试成功 #include "gpio.h" ...

  8. 利用四位共阳数码管显示小数

    目录 前言 实现过程 思路 具体方法 其他代码 效果 利用数码管显示舵机的实际转速 总结 前言 前段时间利用TMS320F2335实现了对四位共阳数码管的控制(链接在这),不过当时只实现了利用数码管显 ...

  9. 共阴极和共阳极数码管显示的十六进制代码

    共阳极数码管 unsigned char LED7Code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8, 0x80, 0x90, 0x88, ...

最新文章

  1. MySQL中对varchar类型排序问题的解决
  2. 美国独步世界的八大领域
  3. 第十六届全国大学生广东赛区线上比赛流程规范
  4. [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
  5. python类常用装饰器
  6. python pymongo+networkx 实现mongo数据血缘关系可视化
  7. 一个亿的融资在一家芯片初创公司可以烧多久?
  8. 网站如何快速搭建即时响应客服系统
  9. java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc
  10. HDU 1495(非常可乐)
  11. Linux创建名为vgtest的分区,第五周作业,
  12. shell入门(二)——面试题实例
  13. 写了个关于tomcat项目部署脚本 shell
  14. 表格制作模块xlwt
  15. Atitit orm优缺点 Hinaernate mybatis 区别。attilax总结
  16. 什么是JSONP及其实现原理
  17. 微信服务商开发能力说明文档怎么写
  18. 计算机cpu型号在哪看,cpu型号,教您电脑cpu型号怎么看
  19. 上云,你需要了解的账号管理模型
  20. 《灰色预测(GM)的MATLAB实现》

热门文章

  1. angr学习笔记(5)(栈符号化)
  2. 013 自动吃药功能的设计和实现
  3. MySQL主键(PRIMARY KEY)
  4. 1.2操作系统的特征
  5. 分治法求解最大子数组问题
  6. Windows文件目录DOS窗口
  7. SqlServer数据类型
  8. 为什么阿里巴巴RPC接口不允许使用枚举类型?
  9. 再见,CentOS!
  10. hibernate教程--检索方式(hql,sql,QBC)