verilog语法实例学习(9)

常用的时序电路介绍

寄存器

一个触发器可以存储一位数据,由n个触发器组成的电路可以存储n位数据,我们把这一组触发器叫做寄存器。寄存器中每个触发器共用同一个时钟。

下面是n位寄存器的代码,我们通过一个参数定义n,在实例化时传入参数n。

module regne (D, clk,Rst_n,E,Q);
  parameter n=4;
  input [n-1:0] D;
  input clk;
  input Rst_n; //复位信号
  input E; //使能信号

  output reg [n-1:0] Q;

  always @(posedge clk,negedge Rst_n)
    if(Rst_n==0)
	   Q <= 0;
	 else if(E)
	   Q <= D;

endmodule
`timescale 1ns/1ns
`define clock_period 20

module regne_tb;
  reg [7:0] D;
  wire [7:0] Q;
  reg clk;
  reg Rst_n;
  reg E;

  regne #(.n(8)) regne(.D(D),.clk(clk),.Rst_n(Rst_n),.E(E),.Q(Q));
  always # (`clock_period/2) clk = ~clk;

  initial
  begin
    D = 4‘b01010101;
	 clk = 1‘b0;
	 Rst_n = 1‘b1;
	 E = 1‘b1;
	 #(`clock_period)
	 Rst_n = 1‘b0;
	 D = 4‘b10101010;
	 #(`clock_period*2)
	 E = 1‘b0;
	 Rst_n = 1‘b1;
	 D = 4‘b00010001;
	 #(`clock_period*4)
	 E = 1‘b1;
	 D = 4‘b1111;
	 #(`clock_period*2)
	 D = 4‘b10111011;
	 #(`clock_period*2)
	 D = 4‘b10011001;
	 #(`clock_period*2)
    $stop;
  end

endmodule

移位寄存器

把串行的输入存储到一个寄存器,可以选择时机并行输出。

/*串行输入,并行输出寄存器
从高位输入,即从右向左输入*/
module shiftn(R,L,w,clk,Q);
  parameter n=8;
  input [n-1:0] R;//初始值
  input L; //load信号
  input w; //移入信号
  input clk;//时钟信号
  output reg [n-1:0] Q;
  integer k;

  always @(posedge clk)
  begin
    if(L)
	    Q <=R;
	 else
	 begin
	   for(k=0; k<n-1; k=k+1)
		  Q[k] <= Q[k+1];
	   Q[n-1] <= w;
	 end

  end

endmodule

`timescale 1ns/1ns
`define clock_period 20

module shiftn_tb;

  reg [7:0] R;
  reg L;
  reg w;
  reg clk;
  wire [7:0] Q;

  shiftn #(.n(8)) shitn0(.R(R),.L(L),.w(w),.clk(clk),.Q(Q));
  initial clk = 0;
  always #(`clock_period/2) clk = ~clk;

  initial
  begin
    R = 8‘b00000000;
	 L = 1‘b1;
	 w = 1‘b0;
	 #(`clock_period)
	 L = 1‘b0;
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b0;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 w = 1‘b1;
	 #(`clock_period)
	 $stop;
  end

endmodule

我们也可以使用拼接符操作代替for循环,实现同样的功能,而且语法更加简单。

/*串行输入,并行输出寄存器
从高位输入,即从右向左输入*/
module shiftn(R,L,w,clk,Q);
  parameter n=8;
  input [n-1:0] R;//初始值
  input L; //load信号
  input w; //移入信号
  input clk;//时钟信号
  output reg [n-1:0] Q;

  always @(posedge clk)
  begin
    if(L)
	    Q <=R;
	 else
	 begin

     Q = {w,Q[n-1:1]};
	 end

  end

endmodule

原文地址:https://www.cnblogs.com/mikewolf2002/p/10197735.html

时间: 2024-10-14 18:45:54

verilog语法实例学习(9)的相关文章

Verilog语法--Gate门

Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand (output,input,...) or (output,input,...) nor (output,input,...) xor (output,input,...) xnor (output,input,...) 缓冲器和与非门 buf (output,...,input) not (outp

verilog语法结构

数据流描述方式: 用数据流描述对一个设计建模的最基本方式是连续赋值语句.连续赋值语法assign [delay] LHS_net = RHS_ expression 'timescale 1ns/1ns module Decoder2_4(A,B,EN,Z); input A,B,EN; output [0:3] Z; wire Abar,Bbar;                                   //线网类型定义两个连线型变量 assign #1 Abar = A~; as

Verilog语法遗漏点

1 关于参数定义 Parameter:parameter只能定义在端口生命的前面,如 Input[whith:0] a; Parameter whith=4; 这样的参数定义出现在声明的后面会报错 2 关于always块 always块不仅可以描述时序逻辑,也可以描述组合逻辑 如wire a,b;  assign a=b 与reg a; wire b;  [email protected](b) a=b;     可见,always块内允许阻塞赋值 不过需要注意的是 always中,等号左边的变

verilog语法之memory存储器

命名规则:reg[n-1:0] 存储器名[m-1:0] 说明:这是m个n位的存储器,该存储器的地址范围是0-(m-1) 举例:reg[3:0] memo[255:0] 说明:这是256个4位存储器,该存储器地址范围是0-255 赋值:memo[200] = 4'b1010; 说明:给第200地址单元赋值4'b1010: 精确到位:memo[56][2] 说明:第56地址的第2位数据 赋值:wire data=memo[56][1]; 说明:把memo中第56地址的第1位数据赋值给data:

Verilog HDL基础语法讲解之模块代码基本结构

Verilog HDL基础语法讲解之模块代码基本结构 ? 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的基本结构. 以下为本章中例子中的代码: 01????/*======================================= 02????*????file neme : mux2.v 03????*????author????:????小梅哥 04????*????Verison????:????

Verilog HDL程序设计——基本要素

Verilog基本上熟悉了,继续整理一下Verilog的学习笔记吧.前面记载了Verilog的结构,写Verilog的结构有了,但是该怎么写呢?在写之前就得了解一下Verilog的一些基本要素了,也就是Verilog是怎么一点一点写出来的. 一.标识符与注释 前面已经说到,模块名的定义要符合标识符的定义,那么什么是标识符呢?它的语法是什么呢? ①标识符是赋给对象的唯一名称,通过标识符可以提及相应的对象,Verilog语法将对转义标识符中的字符逐个处理. ②标识符可以是字母.数字.下划线和美元符$

永远的流水灯(Verilog)

1. 为了更好地学习FPGA和深入理解Verilog语法,首先从最简单的流水灯做起.虽然简单,但是也包含了不少知识.通过这次实验项目,可以了解开发软件的使用及Verilog的编程方法,熟悉模块化设计的方法. 2. 该项目主要实现的功能为: (1)10位的流水灯 (2)中间两个led灯每隔100ms闪烁一次 (3)两边的led灯每隔100ms流动一下,从中间向两边流水. 3.  具体实现如下 (1)首先定义一个时间计数寄存器counter,每当达到预定的100ms时,计数寄存器就清零,否则的话寄存

verilog逻辑复制

本文转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/27/FPGA_verilog.html 在FPGA设计中经常使用到逻辑复制,逻辑复制也用在很多场合. 1.    信号驱动级数非常大,扇出很大,需要增加驱动力 逻辑复制最常使用的场合时调整信号的扇出.如果某个信号需要驱动后级很多单元,此时该信号的扇出非常大,那么为了增加这个信号的驱动能力,一种办法就是插入多级Buffer,但是这样虽然能增加驱动能力,但是也增加了这个信号的路径延时.

Verilog语言

Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,两种HDL均为IEEE标准.Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的. Verilog是由Gateway Design Automation公司的工程师Prabhu Goel和菲尔·莫比(Phil Moorby)发明的.1990年,Gateway设计自动化被Cadence公司收