收藏 分享(赏)

VerilogHDL夏宇闻--设计举例.ppt

上传人:hwpkd79526 文档编号:8434373 上传时间:2019-06-26 格式:PPT 页数:39 大小:244KB
下载 相关 举报
VerilogHDL夏宇闻--设计举例.ppt_第1页
第1页 / 共39页
VerilogHDL夏宇闻--设计举例.ppt_第2页
第2页 / 共39页
VerilogHDL夏宇闻--设计举例.ppt_第3页
第3页 / 共39页
VerilogHDL夏宇闻--设计举例.ppt_第4页
第4页 / 共39页
VerilogHDL夏宇闻--设计举例.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、Verilog 设计举例,结构模块的层次化组成 各种类型模块之间的关系 测试和验证,设计示例一 用门级结构描述D触发器,设计示例一,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 iv

2、1(ndata,data),iv2(nclock,clock); endmodule,用户定义的原始元件,primitive udp_and (out,a,b);output out;input a,b;table /a b : out;0 0 : 0;0 1 : 0;1 0 : 0;1 1 : 1;endtableendprimitive,用户定义的原始元件,前面模块中的nand和not原语元件(primitive)在Verilog 语言中是保留词,它们分别表示:与非门和非门的逻辑关系。在Verilog 语法中通过用户定义的原始元件语句(即UDP)的真值表和带参数的延迟线模型来表示。在与具体

3、工艺库的逻辑对应时把具体延迟参数传入延迟线模型,再加上描述逻辑关系的UDP 。就有了一个与真实情况很接近逻辑模型,仿真器就可以依据它进行计算,来确定相互连接元件的逻辑值。,设计示例二 由已设计的模块来构成高一级的模块,设计示例二,include “ flop.v ” module hardreg(d,clk,clrb,q); input clk,clrb; input3:0 d; output3:0 q;flop f1(d0,clk,clrb,q0,),f2(d1,clk,clrb,q1,),f3(d2,clk,clrb,q2,),f4(d3,clk,clrb,q3,); endmodule,

4、设计示例三 编写测试模块通过仿真检查设计正确与否,include “hardreg.v” module hardreg_top;reg clock, clearb; reg 3:0 data; wire 3:0 qout; define stim #100 data=4b/宏定义 stim,可使源程序简洁 event end_first_pass; /定义事件end_first_pass,设计示例三 (续),hardreg reg_4bit(.d(data),.clk(clock), .clrb(clearb), .q(qout); /*- 把本模块中产生的测试信号data、clock、cle

5、arb输入实例reg_4bit以观察输出信号qout.实例reg_4bit引用了hardreg -*/initialbeginclock = 0;clearb = 1;end always #50 clock = clock;,设计示例三 (续),initial beginrepeat(4)begin /*- 宏定义stim引用,等同于 #100 data=4b 注意引用时要用 符号。 -*/stim 0000;stim 0001;. . . . . .stim 1111; #200 end_first_pass;/延迟200个单位时间,触发事件end_first_passend$finish

6、; /结束仿真end,设计示例三 (续),always (end_first_pass)clearb = clearb; /清零信号电平翻转always (posedge clock)$display (“ at time %0d clearb= %b data= %b qout= %b ”,$time,clearb,data,qout);endmodule,设计示例四 带异步复位端的 D 触发器,module DFF(q, d, clk, reset); output q; input d, clk, reset; reg q; always (posedge reset or negedg

7、e clk) if (reset)q = 1b0; elseq = d;endmodule,设计示例四(续) 用D触发器构成T触发器,module TFF(q, clk, reset); output q; input clk, reset; wire d;DFF dff0(q, d, clk, reset); / DFF已在上面的模块定义 not n1(d, q); / not 表示非门是一个Verilog 原语.endmodule,设计示例四(续) 用四个T触发器组成一个进位计数器,module ripple_carry_counter(q, clk, reset); output 3:0

8、 q; input clk, reset; /4 instances of the module TFF are created. TFF tff0(q0,clk, reset); TFF tff1(q1,q0, reset); TFF tff2(q2,q1, reset); TFF tff3(q3,q2, reset); endmodule,设计示例四(续) 用激励信号对进位计数器进行测试,module stimulus; reg clk; reg reset; wire3:0 q; / instantiate the design block ripple_carry_counter r1

9、(q, clk, reset);/ Control the clk signal that drives the design block. initial clk = 1b0; always #5 clk = clk;,设计示例四(续) 用激励信号对进位计数器进行测试,/ Control the reset signal that drives the design block initial begin reset = 1b1; #15 reset = 1b0; #180 reset = 1b1; #10 reset = 1b0; #20 $stop; end,设计示例四(续) 用激励信号

10、对进位计数器进行测试,/ Monitor the outputs initial$monitor($time, “ Output q = %d“, q);endmodule,设计示例五 用一位全加器组成四位全加器,module FullAdder (A, B, Cin, SUM, Cout); input A, B, Cin; output SUM, Cout;assign SUM = A B Cin; assign Cout = (A endmodule,设计示例五(续) 用一位全加器组成四位全加器,module ADDER4BIT ( Ain, Bin, SUM, OVF); input

11、3:0 Ain, Bin; output 3:0 SUM; wire 2:0 CY; output OVF;FullAdder U0 (Ain0, Bin0, 0, SUM0, CY0);FullAdder U1 (Ain1, Bin1, CY0, SUM1, CY1);FullAdder U2 (Ain2, Bin2, CY1, SUM2, CY2);FullAdder U3 (Ain3, Bin3, CY2, SUM3, OVF); endmodule,设计示例五(续) 用四位全加器的测试,timescale 1ns/1ns module ADDER4BIT_TEST; reg 3:0 A

12、in, Bin; wire 3:0 SUMOUT; wire OVF; ADDER4BIT m ( Ain, Bin, SUMOUT, OVF ); initial beginAin = 4b0000; Bin= 4b0000;#100 Ain = 4b0111; Bin= 4b0101;#100 #100 Ain = 4b0000; Bin= 4b0000;#100 $stop;end endmodule,设计示例五(续) 四位全加器的另一种描述,module ADDER4BIT ( Ain, Bin, SUM, OVF); input 3:0 Ain, Bin; output 3:0 SU

13、M;output OVF;assign OVF, SUM = Ain +Bin; Endmodule这种描述方法比较直观,可以直接用综合器转换为门级组合逻辑互相连接的描述。仍然用同样的测试模块测试。这种描述使得逻辑关系更容易明白。,综合的一般原则,综合之前一定要进行仿真,这是因为仿真会暴露逻辑错误,所以建议大家这样做。如果不做仿真,没有发现的逻辑错误会进入综合器,使综合的结果产生同样的逻辑错误; 每一次布局布线之后都要进行仿真,在器件编程或流片之前要做最后的仿真; 用Verilog HDL描述的异步状态机是不能综合的,因此应该避免用综合器来设计,如果一定要设计异步状态机则可用电路图输入的方法来

14、设计; 如果要为电平敏感的锁存器建模,使用连续赋值语句是最简单的方法。,设计示例六:指令译码电路的设计实例 (利用电平敏感的always块来设计组合逻辑),define plus 3d0 /操作码的宏定义 define minus 3d1 define band 3d2 define bor 3d3 define unegate 3d4module alu (out,opcode,a,b);output 7:0 out;input 2:0 opcode;input 7:0 a,b;reg 7:0 out;,设计示例六:指令译码电路的设计实例 (利用电平敏感的always块来设计组合逻辑),al

15、ways (opcode or a or b) /用电平敏感的always块描述组合逻辑begin case(opcode) /算术运算plus: out =a + b;minus: out = a - b; /位运算band: out = a endcaseend endmodule,设计示例六:指令译码电路的测试,timescale 1ns/1ns module t; wire 7:0 result; reg 2:0 opc; reg 7:0 ain, bin; reg clk;initial begin clk = 0; ain=0; bin=3; opc=0; endalways #2

16、0 clk = clk;always (posedge clk)begin ain = ain +1; bin = bin+2; opc=$random%8; endalu m (.out (result), .opcode(opc),.a(ain),.b(bin);initial begin #(20*2000) $stop; endinitial $monitor($time, , “ ain=%b, bin=%b, opc=%b, result=%b”, ain, bin, opc, result); endmodule,设计示范七: 状态机和电路动作的控制,设计一个电路接口,可以把并行

17、的四位数转在ack信号的控制下逐个转变为串行数据。,sda,设计示范七: 状态机和电路动作的控制,串行数据符合以下协议:,设计示范七: 状态机和电路动作的控制,/* 模块功能:按照设计要求把输入的4位平行数据转换为协议要求的串行数据流由scl和sda配合输出本模块为RTL可综合模块,已通过综合后门级网表仿真*/ module ptosda (sclk, ack,scl,sda,rst,data); input sclk, rst, ; input 3:0 data; output scl,ack; inout sda; /定义sda为双向的串行总线 reg scl, link_sda, sda

18、buf,ack; reg 3:0 databuf; reg 7:0 state;assign sda = link_sda? sdabuf :1bz; /link_sda 控制 sdabuf输出到串行总线上,设计示范七: 状态机和电路动作的控制,parameter ready = 8b0000_0000,start = 8b0000_0001,bit1 = 8b0000_0010,bit2 = 8b0000_0100,bit3 = 8b0000_1000,bit4 = 8b0001_0000,bit5 = 8b0010_0000,stop = 8b0100_0000,IDLE = 8b1000

19、_0000;,设计示范七: 状态机和电路动作的控制,always (posedge sclk or negedge rst) /由输入的sclk时钟信号产生串行输出时钟sclbeginif (!rst)scl = 1; elsescl = scl; endalways (posedge ack) /从并行data端口接收数据到databuf保存begindatabuf = data;end,设计示范七: 状态机和电路动作的控制,/主状态机:产生控制信号,根据databuf中保存的数据,按照协议产生sda串行信号 always (negedge sclk or negedge rst)if (!

20、rst)beginlink_sda=0; / 把sdabuf与sda串行总线断开state = ready;sdabuf= 1; ack =0;end else begin case(state)ready: if ( !scl / 把sdabuf与sda串行总线连接,设计示范七: 状态机和电路动作的控制,state = start;ack = 1; /发出请求新数据endelse /并行数据尚未到达beginlink_sda=0; /把sda总线让出,此时sda可作为输入state = ready;endstart : if ( scl ,设计示范七: 状态机和电路动作的控制,bit1: i

21、f (!scl) /在scl为低电平时送出最高位databuf3begin sdabuf=databuf3; state = bit2; endelse state = bit1;bit2: if (!scl) /在scl为低电平时送出次高位databuf2begin sdabuf=databuf2; state = bit3; endelse state = bit2;bit3: if (!scl) /在scl为低电平时送出次低位databuf1begin sdabuf=databuf1; state = bit4; endelse state = bit3;,设计示范七: 状态机和电路动作

22、的控制,bit4: if (!scl) /在scl为低电平时送出最低位databuf0begin sdabuf=databuf0; state = bit5; endelse state = bit4;bit5: if (!scl) /为产生结束信号做准备,先把sda变为低begin sdabuf=0; state = stop; ack=0; endelse state = bit5;stop: if (scl) /在scl为高时把sda由低变高产生结束信号begin sdabuf=1; state = IDLE; endelse state = stop;IDLE: begin link_

23、sda = 0; / 把sdabuf与sda串行总线脱开state = ready; end,设计示范七: 状态机和电路动作的控制,default: begin link_sda = 0; sdabuf=1; state = ready; endendcase endendmodule /-ptosda.v 文件结束-,设计示范七: 状态机和电路动作的控制:测试信号源的行为模块,/- sigdata.v 文件的开始 - /* 模块功能: 本模块产生测试信号对设计中的模块进行测试。 * 本模块只用于测试,不能通过综合转换为电路。*/timescale 1ns/1ns module sigdata

24、 (sclk,data, ack); input ack; / 请求新数据信号 output 3:0 data; / 输出的数据信号 output sclk; / 输出的时钟信号 reg sclk; reg 3:0 data;,设计示范七: 状态机和电路动作的控制:测试信号源的行为模块,initial / 寄存器变量初始化beginsclk = 0;data = 0;endalways #50 sclk = sclk; /产生第一个模块需要的输入时钟。/每当一个并行数据转换结束后就发出一个新数据。always (posedge ack )#2 data = data + 1;endmodule

25、,设计示范七: 状态机和电路动作的控制:测试顶层模块,timescale 1ns/1nsmodule top;wire sclock, acknowledge;wire 3:0 datawire;wire scl, sda;reg reset;initial begin reset = 1, #73 reset = 0; #113 reset = 1; endsigdata (.sclk(sclock), .data(datawire), .ack(acknowledge);ptosda m1(.sclk(sclock), .ack(acknowledge), .scl(scl), .sda(sda), .rst(reset), .data(datawire) );endmodule,设计示范七: 波形图,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报