FPGA|Verilog语言快速入门

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

FPGA|Verilog语言快速入门
文章图片

时序逻辑的产生:
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.

    推荐阅读