VHDL语法回顾

来源:互联网 发布:行尸走肉网络剧仓库 编辑:程序博客网 时间:2024/05/17 15:41

Verilog HDL 基本语法回顾


打算设计一个简单的微程序控制CPU模型,下面是VHDL语法回顾。

module的结构

/*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)   //上升沿beginif(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;        endcaseendendmodule

assignalways 块的逻辑功能是同时进行(并行)的,always内的逻辑是顺序执行的.

Verilog HDL中没有{ }begin end 取代

数据类型

数字的表达方式

<位宽>’<进制><对应的进制数字>

不同位宽应分别定义

8'b0001_0101 //位宽为8位的二进制数字表示,使用下划线可以提高可读性(对数字的大小没有影响)8'h15       //位宽为8位的十六进制数字表示

变量类型

wire型

wire 类型用以 assign 操作的组合逻辑信号

默认为wire型

wire a;  //1位的wire型变量wire[7:0] b; //8位的wire型变量wire[7:0] c,d; //两个8位的wire型变量

寄存器类型 reg型

寄存器类型是对数据存储单元的抽象,always 块内定义的变量都必须是reg型,可以这么理解:reg型就是在always内使用的变量类型,并不一定是寄存器或者触发器的输出

运算符

基本算术运算符: + - * / %关系运算符: > < >= <= ==赋值运算符: =  <=逻辑运算符: && || !(非)位运算符: & | ~(反) `(亦或)拼接符: { }

非阻塞赋值<= : 块结束后,才完成赋值;值不是立即改变的;在always块中常使用此种方法。

阻塞赋值 : 立即完成赋值,赋值结束后才能结束块。可能会产生意想不到的错误。

基本流程语句

条件语句

if else

case

case(变量)    变量值1:            begin                 执行语句            end    变量值2:    default:endcase 

循环语句

for()

Exemple

//模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   endendmodule
0 0
原创粉丝点击