热度 23| |
时序逻辑用“<=”,组合逻辑用“=”;其他情况不存在。
使用 always 设计的信号都定义为 reg 型,其他信号都定义为 wire 型。
在 always 过程块中被赋值的变量必须是 reg (寄存器型)
用 assign 连续赋值的对象必须定义成 wire(线型)(System verilog中可以用assign给reg型变量赋值,综合的时候会优化,具体看我的综合器选项,verilog不支持,顺便说下sv的logic就是reg的别名)
问:解决了语法错误后,为什么提示的错误数量更多了?
答:1. QUARTUS/VUVADI/MODELSIM报语法错误时,会提示哪一行出错。请注意,不仅要看这一行,也有可能是前面错误引起的。
2. 在修改语法错误的时候,一个错误解决了,必不一定意味提示的错误数量的减少,也有可能变多。因为之前的错误,掩盖了其他错误。
Gvim的G指的是GUI,也就是图形化界面。相当于在vim包了一层图形化界面,相比之下gvim拥有更丰富的颜色和字体,还有菜单和滚动条,以及更友好的鼠标操作,等等,除此之外差异不大。在各个主流操作系统上(windows、linux、mac)都有对应的Gvim。vi和vim的区别:vim全称Vi IMproved(vi增强版的意思),拥有超多的vi不具备的特型,可以从百科上了解下vi和vim的发展历史,vi诞生于70年代,而vim诞生于90年代初,vim是在vi的基础上改进的,但是已功能特型已远超vi,现在linux中标配都是vim,通过执行alias vi你会发现至少主流linux都用vim代替vi了。然后讲几点vi和vim具体的差异(就讲几点,不全):多级多分支撤销、语法高亮、tab和buffer、自动补全、块操作(visual mode)、vimscript语言(诞生了大量的功能丰富的插件),等等。。。都是vi不具备的。
VSCODE配置Verilog https://blog.csdn.net/qq_38376586/article/details/125683633
https://mp.weixin.qq.com/s/F3L7ZVRkAQCutiTieccHAQ
Quartus打开.v文件,中文注释乱码,很可能是因为.v文件里的编码格式是ANSI,而Quartus较新的版本用的编码格式都是UTF-8,所以用记事本打开.v文件,点另存为,然后把编码格式改成UTF-8就能解决
Quartus设置外置编辑器,不要直接复制路径到栏里,因为那样没引号,识别不了,还是要从Quartus里面打开文件管理器然后去选择你要用的外置编辑器
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f(即0000 0000~0111 1111)范围的1 个字节来表示1个英文字符。超出此范围的使用0x80~0xFFFF(即 1000 0000~1111 1111 1111 1111)来编码,即扩展的ASCII编码。
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
ANSI编码电脑是认识的,问题是,ANSI编码有很多种。不同的国家和地区制定了不同的标准,在大陆是GB2312,在台湾是BIG5,在日本又成了JIS,这些都是互不兼容的。电脑遇到这种格式的文件,会根据系统当前语言环境选择对应的版本解析。这边我的电脑的语言环境是简体中文,电脑看到这ANSI编码,根据当前系统语言认为是GB2312,于是很欢乐的解析了。然而此ANSI编码非彼ANSI编码,驴头不对马嘴,自然就乱码了。
看波形图的规则:在每一个时钟上升沿查看信号时,如果信号的值发生了改变,那么此时的信号值为信号改变前的值。看verilog代码时要摈弃软件思维,不要联系起来看,要一个always一个always的看,看这个always里产生了什么信号,产生这个信号需要什么条件,在时钟上升沿查看条件信号时,如果条件信号的值发生改变,条件信号的值为它改变前的值。
如第一幅图所示,将vscode设置为Quartus的编辑器,但是如果像第一幅图那样设置的话是不能在Quartus里打开vscode的,必须要像第二幅图里那样设置才能从Quartus里打开vscode,原因就在于Quartus的路径设置里不能出现空格,如果出现了空格则必须要在路径外围加引号,按照第二幅图那样设置虽然可以从Quartus里打开vscode了,但是vscode打开后不会自动打开你要看的.v文件,因为你没有在最后面加%f,像第三幅图里那样设置就可以解决这个问题,像第四幅图里这样设置就既可以保留文件名的空格,又能从Quartus里打开vscode,并且vscode打开后能自动打开要看的.v文件
问:GVIM输入快捷命令后,没有模板,并提示如下。
答:请先把文件保存为.v格式,再输入命令。
解决VSCODE任务栏图标异常:https://blog.csdn.net/lvdou1120101985/article/details/89509977
verilog例化说明:https://blog.csdn.net/weixin_42470069/article/details/107421790?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-107421790-blog-78848449.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-107421790-blog-78848449.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=9
关于sof文件:sof文件是对verilog源代码编译(分析、综合、布线、生成、时序)过程中生成的一个文件,生成的sof文件是可以直接通过JTAG口下载到FPGA的SRAM中去并直接执行。所以sof文件可以“看成”是原始二进制文件,当然还是有区别的,就相当于HEX文件和BIN文件的区别一样,HEX文件和BIN文件可以互相转
sof文件下载到FPGA板子上去可以实现相应的功能,但是断电之后会丢失
Q:FPGA的晶振是50MHz,时钟周期为20ns,这个工作频率50MHz,时钟周期20ns是FPGA的固有硬件属性,还是说是一个可以在开发工具里由工程师自由调整改变的值?
A:不是fpga的固有硬件属性,是外部晶振是50MHz,如果你愿意,可以换成10,30其他等等。fpga内部实际工作频率可以与输入时钟相同,也可以不同(分频或倍频)
Q:那明德扬mp801用的晶振是50MHz的吧,这个是晶振是焊死在明德扬mp801上改不了了吧(明德扬是一家做FPGA培训的机构)
A:是的
Q:噢噢,那就是我也可以通过开发工具自定义我想要的频率,fpga硬件自己会倍频或者分频是吧?
A:在pll IP核里设置分频或倍频系数
Q:噢噢,那不设置的话那就还是按默认的50MHz来
A:对
设计文件里写的都是我们设计的各种信号,是可以上板综合的,然后测试文件是不能综合的,只是为了产生激励然后仿真(在仿真工具里进行仿真,比如modelsim),比如串口通信实验中的rx_uart这个信号,它在测试文件里是写好了rx_uart怎么怎么变化,八个灯是有的亮有的不亮,因为它在测试文件里写的rx_uart是有1有0的各种变化,然后上板的话,激励就不像仿真那样是我们写个测试文件就能产生了,像clk这种激励是板子自己的晶振产生的,然后rx_uart这个激励的变化是用串口调试助手这个软件去产生,上板的时候一切都是真实发生的,仿真的时候我们想要什么激励就可以在测试文件里产生对应的激励输入,用于测试我们的设计。
问:仿真文件里,没有定义timescale时,那么仿真的单位是多少?(仿真文件一般指的就是用于设定如何产生激励的测试文件)
答:仿真工具modelsim默认的单位是ns。如果有指定timescale(不一定在仿真文件中指定,任一设计文件也可以指定),则按timescale来。
关于测试文件是什么的科普:https://blog.csdn.net/qq_38502780/article/details/119942652
fpga的USB下载器和USB串口是两个东西,USB-BLASTER是FPGA下载器的驱动,USB-SERIAL CH340(COM3)是FPGA的USB串口的驱动,这俩个不是一个东西,你要做串口通信的实验的话,先编译,然后通过下载器也就是JTAG接口把综合后得到的SOF文件加载到板子上,然后再用串口调试助手通过USB串口去给FPGA板子发送串口数据
你用串口调试助手传数据的时候,你想让led[0],led[1],led[4],led[5]亮,led[2],led[3],led[6],led[7]不亮,那么这个时候按照我们设计的代码你应该发送一段二进制码11001100给FPGA,转换成十六进制就是CC,这里你不要在计算器里输入11001100直接转换成十六进制,因为你这里默认输入的是十进制的11001100,不是二进制的,千万别搞错了
一般都是用时序逻辑,时序逻辑中如果设计信号a是会随着信号b的变化而变化的话,一般信号a的变化会比信号b慢一拍(俗称"打一拍"),如果要让信号a提前一拍,那就用组合逻辑来设计,没有特殊要求的话一般都用时序逻辑来设计
MP801这块板子要求我把引脚AB12分配给复位信号rst_n,由原理图可知,按下板子上的复位按钮就等于接地,分配给AB12的值为0,也就是给低电平,不按的时候是3.3V弱上拉,也就是给1值,给高电平,所以上板上电的时候,你不按复位按钮,就一直给你rst_n高电平
Q:Quartus这个HOME页面不小心拖出来了,咋按回去?
A:按这个回去
输出信号一般用always时序产生,时序电路产生的信号只有在时钟上升沿才会开始变,这样产生的信号才是没有毛刺的,没有竞争和冒险现象的
Quartus中要注意工程的名称一定要与verilog的顶层模块名称一致,否则编译会出错。
signed可以和reg和wire联合使用,用于定义有符号数,被signed定义的数据在电路上是以补码形式存储并计算的。
有符号数和无符号数,区别在于如何扩位,无符号数是MSB添0,有符号数是MSB添加符号位
MSB:最高有效位
vscode无法自动调用iverilog检错问题:https://blog.csdn.net/weixin_42193451/article/details/127799939
用的FPGA板子可以在网上查型号,比如我手上这块FPGA是明德扬MP801,型号是EP4CE15F23C8,EP4CE后面的两个数字代表这块板子的逻辑资源数,单位是K,所以这块板子的逻辑资源数是15k.
二进制原码定点数乘法,整数部分直接用乘法竖式相乘即可,小数部分用原码一位乘(参考计算机组成原理),混合的,如11.1101*10.1011,可以当成111101乘101011,乘完再除2的八次方(因为111101=11.1101*2^4,101011=10.1011*2^4)
用vscode写verilog代码,需要配置环境(如何配置详见第7条),常用的插件组合如图所示:
一般用第三个插件(从上往下数)来进行语法检查,在此之前要在本地安装iverilog,然后在第三个插件的扩展设置中对iverilog进行配置,配置好之后就可以进行语法检错,但是这里有个问题,那就是iverilog在vscode里不能链接文件进行检查,比如你在模块A中对子模块B进行例化,iverilog在文件A中是无法识别B是啥东西的,这样就会出现不能识别B是什么的报错,报错看起来就会很难受,影响我们写代码的心情,因为B模块是在另一个文件里写好的,不能链接检查,解决这个问题的常见做法是在第三个插件的扩展配置里添加-i参数对这种问题进行抑制,这样心情就好了。
然而第五个插件,Teroshdl也会自动调用iverilog进行语法检查,这就导致我们虽然配置好了第三个插件,但TerosHDL也会出现上述问题,如图所示:
解决办法:
点击这个齿轮,进入TerosHDL的配置画面
然后linter不要设成icarus,这样就解决了TerosHDL瞎报错的问题,这样我们写代码就心情好
generate用法总结:https://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html
verilog语法+:用法:https://www.cnblogs.com/lmore/p/16812766.html