打算设计一个简单的微程序控制CPU模型,下面是VHDL语法回顾。
/*
VHDL是由模块组成,嵌在module endmodule之间,其他语句均由 ';' 结束
*/
module add(a,b,c,sum,count); //模块端口定义
input [2:0] a,b;
input cin;
output [2:0] sum;
output count; //IO 定义
//内部变量定义
assign {count,sum} = a + b + cin; // 功能定义
endmodule
常用的是 assign
(组合逻辑电路)和 always
(时序电路)
//简单的计数器
module count (clk,reset,x,num);
input reset,clk,x;
output [1:0]num;
reg [1:0]num;
always @ (posedge clk) //上升沿
begin
if(reset)
num=2'b00;
else
case (num)
2'b00 : if(x==0) num<=2'b01;
else num<=2'b11;
2'b01 : if(x==0) num<=2'b10;
else num<=2'b00;
2'b10 : if(x==0) num<=2'b11;
else num<=2'b01;
2'b11 : if(x==0) num<=2'b00;
else num<=2'b10;
endcase
end
endmodule
assign
和 always
块的逻辑功能是同时进行(并行)的,always
内的逻辑是顺序执行的.
Verilog HDL中没有
{ }
以begin end
取代
<位宽>’<进制><对应的进制数字>
不同位宽应分别定义
8'b0001_0101 //位宽为8位的二进制数字表示,使用下划线可以提高可读性(对数字的大小没有影响)
8'h15 //位宽为8位的十六进制数字表示
wire
类型用以 assign
操作的组合逻辑信号
默认为wire型
wire a; //1位的wire型变量
wire[7:0] b; //8位的wire型变量
wire[7:0] c,d; //两个8位的wire型变量
寄存器类型是对数据存储单元的抽象,在 always
块内定义的变量都必须是reg型,可以这么理解:reg型就是在always内使用的变量类型,并不一定是寄存器或者触发器的输出
基本算术运算符: + - * / %
关系运算符: > < >= <= ==
赋值运算符: = <=
逻辑运算符: && || !(非)
位运算符: & | ~(反) `(亦或)
拼接符: { }
非阻塞赋值<= : 块结束后,才完成赋值;值不是立即改变的;在always块中常使用此种方法。
阻塞赋值 : 立即完成赋值,赋值结束后才能结束块。可能会产生意想不到的错误。
if else
case(变量)
变量值1:
begin
执行语句
end
变量值2:
default:
endcase
for()
//模4计数器
module counter4(X,clk,Z,L);
input X,clk;
output Z,L;
reg[1:0] L;
parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;
always @(posedge clk)
begin
if(X==1)
case(L)
S0: L<=S1;
S1: L<=S2;
S2: L<=S3;
S3: L<=S0;
endcase
else
case(L)
S0: L<=S3; /*仿真时间、always语句和assign的位置*/
S1: L<=S0;
S2: L<=S1;
S3: L<=S2;
endcase
end
assign Z=((X==1&&L==S3)?1:0)|((X==0&&L==S0)?1:0);
endmodule
//010序列检查器
module test010(in,out,state,clk,reset);
input in,clk,reset;
output out;
output[2:0]state;
reg[2:0]state;
reg out;
parameter s0='d0,s1='d1,s2='d2;
always @(posedge clk)
begin
if(reset) begin state<=s0; out<=0; end /*控制in的输入*/
else case(state)
s0:begin
if(in==0) begin state<=s1; out<=0; end
else begin state<=s0; out<=0; end
end
s1:begin
if(in==1) begin state<=s2; out<=0; end
else begin state<=s0; out<=0; end
end
s2:begin
if(in==0) begin state<=s0; out<=1; end
else begin state<=s0; out<=0; end
end
default: state<=s0;
endcase
end
endmodule