Verilog和FPGA的自学笔记2——点亮LED

今天说说Verilog的程序框架

先说说个人感受。

觉得Verilog的模块化很强,和C++面向对象有一拼,记得之前写C#,每一个方法、变量都需要封装进class里,相当的模块......

Verilog也是以模块(module)为基础进行搭建的。

先给大家看一段代码,用按键点亮led:

cpp 复制代码
module led(
    input key,
    output led
);

assign led = ~key;

endmodule

(不知道为啥CSDN里无Verilog代码块,用C++的凑合着过吧......)

可以看到,这段代码的开始是module,结束是endmodule。而在这两者之间的,就是我们所写的一个模块。endmodule后面没有分号!!

说说module的语法格式:

cpp 复制代码
module 模块名(
	端口类型 端口1,
	端口类型 端口2,
	......
	端口类型 端口n
);

各位都是编程大佬,命名规则就不罗嗦了。

注意几个小问题:一个是每个端口后面用逗号 ,最后一个无逗号 ,模块名结束要加分号

是不是写成这样会清楚许多:

cpp 复制代码
module led(input ked,output led);

确实,在端口数量少的情况下(虽然比较少见),这样写会更简洁。

那这些端口是用来干啥的呢?

我们用Verilog描述了一个模块,负责对输入(激励)进行处理,最后输出。
端口就是给模块提供输入(激励)和输出(响应)信号的

比如上面的模块,输入信号是key(当然你叫啥都行,比如doge......),输出信号是led。

都有哪些端口类型呢?给大家放在下面了:

端口类型 作用
input 输入
output 输出
inout 输入/输出

(inout类型既可以作为输入也可以作为输出)

多提一句,信号类型定义也不见得放在module里,只是我觉得这样更简洁。

像下面放在外面也是可以的:

cpp 复制代码
module led(
    key,
    led
);

input key;    //反正我觉得没必要......
output led;

最顶上的模块写完了,接下来就要写逻辑了。

逻辑一般用assign和always语句实现,今天就说说assign。(发现很多教程总喜欢一股脑的介绍完,喜欢把人搞得晕头转向)

cpp 复制代码
assign 目标信号 = 表达式;  //就是把右面的表达式赋值给左边
assign led = ~key;        /*就像这样*/

悄悄说一句上面不光介绍了assign的写法,一并把Verilog的注释写法讲完了(嘻嘻)

与C、C++不同的是,Verilog不允许单独写逻辑语句,比如这样:

cpp 复制代码
led = ~key;   //大错特错,这一点要注意

无论写多少个逻辑,都得这么写:

cpp 复制代码
assign a= 0;
assign b= 0;
assign c= 0;
......

"~"是一种位运算符,用于将变量的每个位进行取反 (应该不用多说了......)

模块结尾要加endmodule不要写分号再说一遍

给个建议,建议写完module时就直接回车两行写endmodule,免得忘了。

相信大家已经对Verilog的模块有了初步认识,今天就写到这里吧,也一千多字了,好有成就感哈哈!

如果有不明白或错误之处,也希望大家在评论区给出,帮助大家的同时也能再次提升自己对于FPGA和Verilog的理解,感谢大家!!

系列链接:

上一篇:Verilog和FPGA的自学笔记1------FPGA

下一篇:Verilog和FPGA的自学笔记3------仿真文件Testbench的编写

相关推荐
wdfk_prog12 分钟前
[Linux]学习笔记系列 -- [kernel]workqueue
linux·笔记·学习
wdfk_prog13 分钟前
[Linux]学习笔记系列 -- [kernel]usermode_helper
linux·笔记·学习
一只爱做笔记的码农37 分钟前
【BootstrapBlazor】移植BootstrapBlazor VS工程到Vscode工程,报error blazor106的问题
笔记·学习·c#
木西40 分钟前
人间观察:关于健康、善良与选择的思考
笔记
星轨初途1 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法
我爱C编程2 小时前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
charlie1145141913 小时前
勇闯前后端Week2:后端基础——Flask API速览
笔记·后端·python·学习·flask·教程
深蓝海拓3 小时前
OpenCV学习笔记之:调整ORB算法的参数以适应不同的图像
笔记·opencv·学习
d111111111d3 小时前
STM32外设--SPI读取W25Q64(学习笔记)硬件SPI
笔记·stm32·单片机·嵌入式硬件·学习
摇滚侠3 小时前
2025最新 SpringCloud 教程,Nacos-配置中心-数据隔离-动态切换环境,笔记18
java·笔记·spring cloud