Joeyos's Blog Software Engineer

Verilog HDL基础知识

2016-03-07
Quan Zhang

Verilog语言的特点和基本语法

  • 较多的第三方工具的支持
  • 语法结构比VHDL简单
  • 学习起来比VHDL容易
  • 仿真工具比较好使
  • 测试激励模块容易编写

优点:

在各种抽象层次上描述数字电路
测试各种层次数字电路的行为
设计出正确有效的复杂电路结构

Verilog模块和电路结构的关系

行为级和RTL级

RTL模块的数据流动必须基于时钟。RTL模块在每个时钟的沿时刻,其变量的值必定是精确的。

门结构级

Verilog HDL入门

module myadder(clock, reset, a, b, sum);
parameter width = 8;
input clock, reset;
input [width-1:0] a, b;
output [width :0] sum;
reg [width-1:0] a_reg, b_reg;
reg [ width : 0 ] sum;
    always @(posedge clock or negedge reset)
        if  (!reset)  begin
                 		 a_reg <= ’b0;  b_reg <= ’b0;   sum<= ’b0;
                  	  end
		else   begin
                  a_reg <= a; 
                  b_reg <= b;
                  sum <= a_reg + b_reg;
               end
endmodule

Verilog HDL模块

如在模块中逻辑功能由下面三个语句块组成:

assign   cs  =  ( a0  &  ~a1 &  ~a2 ) ;   //  -----1
and2   and_inst ( qout, a, b);           //  -----2
always @ (posedge clk or posedge clr)   //-----3
begin  if (clr) q<= 0; else if (en) q<= d;
end

三条语句是并行的,它们产生独立的逻辑电路;而在 always 块中: begin 与 end 之间是顺序执行的。

模块中的信号

只有两种主要的信号类型:

  • 寄存器类型:reg(被赋值的信号,往往代表触发器,不一定是触发器,只是在always块中赋值的信号)
  • 连线类型:wire(assign关键词指定的逻辑组合)

reg与wire的不同点

阻塞与非阻塞

不阻塞赋值语句:

always @(posedge clk)
	begin
		b <= a;
		c <= b;
	end

阻塞赋值语句:

always @(posedge clk)
	begin
		b = a;
		c = b;
	end

非阻塞(non-blocking)  赋值语句 ( b<= a):
    - 块内的赋值语句同时赋值;
    - b 的值被赋成新值 a 的操作, 是与块内其他赋值语句同时完成的;
    - 建议在可综合风格的模块中使用不阻塞赋值。
阻塞(blocking)  赋值语句 ( b = a):
    - 完成该赋值语句后才能做下一句的操作;
    - b 的值立刻被赋成新值 a;
    - 时序电路中硬件没有对应的电路,因而综合结果未知。

数字系统的构成

组合逻辑(无记忆)

- 多路器
- 加法器
- 缓冲器
- 逻辑开关
- 总线
- 逻辑运算电路

组合逻辑的两种Verilog HDL表示:

(1)assign语句:

assign q = (a1==1?) d : 0

(2)always块:

always@(al or d)
	begin
		if(al==1) q=d;
			else q=0;
	end

用always块时,没注意加else语句:

always@(al or d)
	begin
		if(al==1) q=d;
	end

此时生成的不是纯组合逻辑,因为当al==0时,q能保留原来的值,所以生成的电路中有锁存器。

用always块时,必须注意电平敏感的信号表是否完全:

always@(a or b or c or d)
	begin
		out = (a&b&c) | (d&e);
	end

此时生成的不是纯组合逻辑,因为当 e 变化时,out 不能立即跟着变化。只有当a 或 b 或 c 或 d 变化时e 的变化后果才显示出来。可见需要有一个寄存器来储存 e 的变化。

时序逻辑(有记忆)

- 计数器
- 同步有限状态机
- 运算控制器
- 总线分配器

时序逻辑的Verilog HDL表示:

(1)always:

always@(posedge clock)
	if(!reset)
		do_reset;
	else case(state)
		state_1:do_state_1;
		state_2:do_state_2;
		state_3:do_state_3;
		state_4:do_state_4;
		state_5:do_state_5;
		default:state <= xx;
	endcase
task dp_reset;
	begin
		Reset_Every_Register;
		Prepare_For_Next_State;
	end
endtask
task do_state_1;
   begin  if (Condition_Is_True)
         Switch_Proper_Control_Logic;
         Prepare_For_Next_State;
      else Stay_In_Original_State;
   end
endtask
task do_state_2;
   begin if (Condition_Is_True)
        Switch_Proper_Control_Logic;
        Prepare_For_Next_State;
        else Stay_In_Original_State;
   end
endtask

上一篇 博客格式

Comments

Content