Verilog语言快速入门 基本框架
module<模块名> (端口列表)
端口说明
input
output
inout参数定义
数据类型定义连续赋值语句
assign过程块
initial(行为描述语句)
always(行为描述语句)低层模块实例
任务和函数
延时说明块
endmodule
行为描述语句只能出现在initial、always两种语句内。
q=a+b;
q<=a+b
这样的行为语句只能出现在always块内,而且always块内只能使用reg变量。
这是因为always里面可能会出现时序逻辑和寄存器,因此必须采用拥有保持原值属性的reg。但是always也可以做组合逻辑,因此reg也可能被综合成线网类项。
wire只能搭配assign使用,这是因为他就是一根导线,只能放在组合逻辑里。
区别于VHDL,带有反馈的只能采用buffer类型,wire也可以带有反馈
module test(Din, CS, WR, Dout ) ;
input CS, WR;
input Din;
output Dout;
wire t;
assign t = ~t;
assign Dout = t;
endmodule
文章图片
时序逻辑的产生:
always @ (posedge CS)
begin
Dout<=Din;
end
可以理解为,posedge CS可以写成VHDL中的if(clk’event and clk=1),这是一个不完整的if语句因此产生时序逻辑,但是verilog里貌似没有找到类似的对应,只能用 (posedge CS) 来描述,而且,如果要异步复位只能用negedge RST+if(!RST)来实现,因为不能写(posedge CS or RST),但是无伤大雅。
always @ (posedge CS or negedge RST)
begin
if(!RST)
...
end
如果代码如上述所示,那么CS的上升沿会触发一次事件,如果此时RST已经为0,那么会走if语句的内容。如果CS不是上升沿,但是RST变化,同样也会触发always,然后相应判断。
如果是这个代码,那么RST的变化不会触发always,只要clk会触发,因此这个就是同步时序。
always @ (posedge CS)
begin
if(!RST)
...
end
实例化示意:
or iB (out, sel a, sel b) ;
模块名+实例化名+端口
【FPGA|Verilog语言快速入门】A note on wire vs. reg: The left-hand-side of an assign statement must be a net type (e.g., wire), while the left-hand-side of a procedural assignment (in an always block) must be a variable type (e.g., reg). These types (wire vs. reg) have nothing to do with what hardware is synthesized, and is just syntax left over from Verilog’s use as a hardware simulation language.
推荐阅读
- 【2】FPGA设计与调试方法|FPGA状态机(一段式、二段式、三段式)、摩尔型(Moore)和米勒型(Mealy)
- 【3】简单的接口与外设|FPGA实现IIC协议(二)----IIC总线的FPGA实现(单次读写驱动)
- Java|雷军做程序员时写的博客,真滴强啊
- 程序人生|做木匠、开烘焙店、写科幻小说,那些选择转行的开发者们…
- 程序人生|十年AI学者影响力盘点(何恺明排名第一,成为全球最具影响力学者)
- 自动化测试|5年测试开发工程师感悟 —— 写给还在迷茫中的朋友
- JAVA人生|我这个月外快赚了2万多...
- 程序人生|外包干了五年,已经快寄了...
- 低代码开发|驰骋BPM低代码快速开发平台之—.NET版准备工作篇