Verilog和FPGA的自学笔记2——点亮LED
今天说说Verilog的程序框架
先说说个人感受。
觉得Verilog的模块化很强,和C++面向对象有一拼,记得之前写C#,每一个方法、变量都需要封装进class里,相当的模块……
Verilog也是以模块(module)为基础进行搭建的。
先给大家看一段代码,用按键点亮led:
module led(input key,output led
);assign led = ~key;endmodule
(不知道为啥CSDN里无Verilog代码块,用C++的凑合着过吧……)
可以看到,这段代码的开始是module,结束是endmodule。而在这两者之间的,就是我们所写的一个模块。endmodule后面没有分号!!
说说module的语法格式:
module 模块名(端口类型 端口1,端口类型 端口2,……端口类型 端口n
);
各位都是编程大佬,命名规则就不罗嗦了。
注意几个小问题:一个是每个端口后面用逗号,最后一个无逗号,模块名结束要加分号。
是不是写成这样会清楚许多:
module led(input ked,output led);
确实,在端口数量少的情况下(虽然比较少见),这样写会更简洁。
那这些端口是用来干啥的呢?
我们用Verilog描述了一个模块,负责对输入(激励)进行处理,最后输出。
端口就是给模块提供输入(激励)和输出(响应)信号的
比如上面的模块,输入信号是key(当然你叫啥都行,比如doge……),输出信号是led。
都有哪些端口类型呢?给大家放在下面了:
端口类型 | 作用 |
---|---|
input | 输入 |
output | 输出 |
inout | 输入/输出 |
(inout类型既可以作为输入也可以作为输出)
最顶上的模块写完了,接下来就要写逻辑了。
逻辑一般用assign和always语句实现,今天就说说assign。(发现很多教程总喜欢一股脑的介绍完,喜欢把人搞得晕头转向)
assign 目标信号 = 表达式; //就是把右面的表达式赋值给左边
assign led = ~key; /*就像这样*/
悄悄说一句上面不光介绍了assign的写法,一并把Verilog的注释写法讲完了(嘻嘻)
与C、C++不同的是,Verilog不允许单独写逻辑语句,比如这样:
led = ~key; //大错特错,这一点要注意
无论写多少个逻辑,都得这么写:
assign a= 0;
assign b= 0;
assign c= 0;
……
"~"是一种位运算符,用于将变量的每个位进行取反 (应该不用多说了……)
模块结尾要加endmodule不要写分号再说一遍
相信大家已经对Verilog的模块有了初步认识,今天就写到这里吧,也一千多字了,好有成就感哈哈!
如果有不明白或错误之处,也希望大家在评论区给出,帮助大家的同时也能再次提升自己对于FPGA和Verilog的理解,感谢大家!!
系列链接:
上一篇:Verilog和FPGA的自学笔记1——FPGA
下一篇:Verilog和FPGA的自学笔记3——仿真文件Testbench的编写