Verilog Language;Procedures
1.Alwaysblock1
1.always语句的基本语法
always @(敏感事件列表
)
begin: 块名
块内局部变量定义
;
过程赋值语句
;
end
例:
module half_adder(a,b,en,c);
input a,b,en;
output reg[1:0] c;
always@(a or b or en)
if(en)
begin
c[1] =a^b;
c[0] =a^~b;
end
endmodule
2.case语句的基本语法
case (case表达式
)
分支项表达式1
:语句1
;
分支项表达式2
:语句2
;
分支项表达式3
:语句3
;
分支项表达式4
:begin 语句4-1
;语句4-2
;语句4-3
;end
default:default语句
endcase
当每个分支语句多于一条时多的语句要写在begin···end块中
例:
always@(*)
case(scancode)
16'he06b: begin left=1'b1; down=1'b0; right=1'b0; up=1'b0;end//==当一个case下有多个分号时应该添加begin end==
16'he072: begin down=1'b1; right=1'b0; left=1'b0; up=1'b0;end
16'he074: begin right=1'b1; down=1'b0; left=1'b0; up=1'b0;end
16'he075: begin up=1'b1; down=1'b0; right=1'b0; left=1'b0;end
default :begin left=1'b0;down=1'b0;right=1'b0;up=1'b0;end
endcase
endmodule
例1:
解:
// synthesis verilog_input_version verilog_2001
module top_module(
input a,
input b,
output wire out_assign,
output reg out_alwaysblock
);
assign out_assign = a & b;
always@(*)
out_alwaysblock = a & b;
endmodule
问题
- reg与wire的区别
always中需要用reg进行定义
2.Alwaysblock2
与上题没有太大区别多了一块时序always块中使用非阻塞性赋值
例1:
解:
// synthesis verilog_input_version verilog_2001
module top_module(
input clk,
input a,
input b,
output wire out_assign,
output reg out_always_comb,
output reg out_always_ff );
assign out_assign = a^b;