Verilog HDL的不同抽象级别1

用门级结构描述D触发器,实例如下:

由已经设计好的模块构成更高一级的模块,用触发器组成代清零端的4位寄存器代码和实验结果如下:

module flop(data,clock,clear,q,qb);
input data,clock,clear;
output q,qb;

nand #10 nd1(a,data,clock,clear),
nd2(b,ndata,clock),
nd4(d,c,b,clear),
nd5(e,c,nclock),
nd6(f,d,nclock),
nd8(qb,q,f,clear);
nand #9 nd3(c,a,d),
nd7(q,e,qb);
not #10 iv1(ndata,data),
iv2(nclock,clock);
endmodule

上面的模块可以用行为描述块来实现,如下:

`include "flop.v"
module hardreg(d,clk,clrb,q);
input clk,clrb;
input[3:0] d;
output[3:0] q;

flop f1(d[0],clk,clrb,q[0],),
f2(d[1],clk,clrb,q[1],),
f3(d[2],clk,clrb,q[2],),
f4(d[3],clk,clrb,q[3],);
endmodule

门级描述表示电路的结构,是布线的依据,门级电路结构相当复杂,然而行为级描述比较直观,所以Verilog语言设计复杂逻辑电路的基本思路如下:

1.第一步设计工作:用直观的行为级描述语言描述电路,通过Verilog语言仿真测试验证正确性。

2.前端的逻辑设计:用一种工具(综合器synthesis tool)把行为描述转换为门级结构,仿真正确。

3.后端的制造准备工作

测试文件(test—bench或者text.-fix ture)的编写,代码如下:

`include "flop.v"
`include "hardreg.v"
module hardreg_top;
reg clock,clearb; 
reg[3:0] data;
wire[3:0] qout;

`define stim #100 data=4‘b
event end_first_pass;                      //定义事件
hardreg reg_4bit(.d(data),.clk(clock),.clrb(clearb),.q(qout));

initial
begin
clock=0;
clearb=1;
end

always #50 clock=~clock;       //产生时钟的方法
always @(end_first_pass)
clearb=~clearb;          //事件触发的结果
always @(posedge clock)
$display("at time %0d clearb=%b data=%d qout=%d",$time,clearb,data,qout);

initial
begin
repeat(4)
begin
data=4‘b0000;
`stim 0001;
`stim 0010;
`stim 0011;
`stim 0100;
`stim 0101;
`stim 0110;
`stim 0111;
`stim 1000;
`stim 1001;
`stim 1010;
`stim 1011;
`stim 1100;
`stim 1011;
`stim 1100;
`stim 1101;

`stim 1110;

`stim 1111;
#200 ->end_first_pass;    //此处触发该事件
end
$finish;
end
endmodule

阻塞赋值与非阻塞赋值初级:

[email protected](posedge clk)

begin

b<=a;//b=a;

d<=b;//d=b;

end

非阻塞赋值得到的是两个触发器的情况,然而阻塞赋值得到的却是一个触发器,具体见书44页。

时间: 2024-10-08 10:19:34

Verilog HDL的不同抽象级别1的相关文章

verilog HDL学习笔记(基本概念)

1. 作为一种硬件描述语言,verilog可以直接描述硬件结构,也可以通过描述系统行为实现建模,其主要特点和功能有: *描述基本逻辑门和基本开关模型. * 允许用户定义基元. * 可以指定设计中的端口到端口的延时,路径时延和设计中的时序检查. *可以采用多种方式进行建模,这些方式包括(1)顺序行为描述建模——使用过程化结构建模,(2)数据流行为方式——使用连续赋值语句方式建模,(3)结构化方式——使用门和模块实例语句描述建模. * Verilog中有两类数据类型,线网数据类型和寄存器数据类型.线

【黑金教程笔记之003】【建模篇】akuei2的Verilog hdl心路

Verilog hdl不是“编程”是“建模” Verilog hdl语言是一种富有“形状”的语言. 如果着手以“建模”去理解Verilog hdl语言,以“形状”去完成Verilog hdl语言的设计.在感觉上Verilog hdl + FPGA是“可所触及”,是一种“实实在在”的感觉,不相等于“编程”时的那种“抽象感”. “低级建模”最基本最简单之意,建模习惯or风格.

Verilog HDL设计进阶:有限状态机的设计原理及其代码风格_zt

http://www.21ic.com/app/eda/201308/189781_1.htm 由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集.又由于HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同. 本书中有关可综合风格的Verilog HDL的内容,我们只着重介绍RTL级.算法级和门级逻辑结构的描述,而系统级

1-1 Verilog HDL简介

 硬件描述语言HDL(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言.设计者利用HDL可以从抽象到具体逐层描述自己的设计思想,用一系列的分层次模块来表示极其复杂的数字电路系统. VerilogHDL是描述电子电路行为和结构的一种语言,是一种 IEEE 标准(IEEE Std.1364-1995),Verilog 用于模拟从随机和纯行为到门级和开关级的抽象范围等层次的数字电子电路功能,也用于从许多抽象寄存器传输级描述合并,即自动产生,门级描

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

基于Verilog HDL整数乘法器设计与仿真验证

基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为0表示为正数),取值范围为-127~127. 负数的表示方法为正值的求反又加1.例如: 8’b0000_0100; //表示值:4,正值求反为:8’b1111_1011:再加1表示为:8’b1111_1100,这样便得到了-4的表示方法为:8’b1111_1100. 同理,负值变成正值的方法为:负值

&lt;转&gt;Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

verilog HDL 编码风格

1.有意义且有效的名字. 2.同一信号在不同层次应该保持一致. 3.添加有意义的后缀,使信号的有效性更加明确. 4.模块输出寄存器化,使得输出的驱动强度和输入延时是可以预测的. 5.使用括号表明优先级. 6.每一个if都应该有一个else.如果esle没有任何相应的动作,则用一条空语句.(if..esle可能有优先级) 7.case 语句最好有一个default分支,如果default不要执行动作就使用空语句. 8.在每个 模块的开始做模块级的注释,在模块端口列表中出现的信号做简要的功能描述.