Verilog数字系统设计90例_第1页
Verilog数字系统设计90例_第2页
Verilog数字系统设计90例_第3页
Verilog数字系统设计90例_第4页
Verilog数字系统设计90例_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、合肥工业大学宣城校区 微电子科学与工程 Verilog数字系统设计 Verilog数字系统设计 代码90例Contents1、二选一多路选择器.12、多路器模块的编写测试平台.13、三位加法器.24、比较器.25、实例调用三态门选择器.26、同步置位/清零的计数器.37、异步清零.38、case语句实现3-8译码器的部分代码.39、for语句来实现8位数据中低4位左移到高4位.410、for语句计算出13路脉冲信号为高电平的个数.411、生成语句对两个N位的总线用门级原语进行按位异或.512、用条件生成语句实现参数化乘法器.513、使用case生成语句实现N位加法器.614、四选一多路器.71

2、5、四位计数器.716、使用任务控制交通灯.817、CPU总线控制的任务.918、自动任务示例.919、用函数实现乘累加器.1020、计算32位地址值的偶校验位.1121、左/右移位寄存器.1222、用函数的递归调用定义阶乘计算.1223、常量函数.1324、带符号函数.1325、显示任务.1426、文件写入操作的例子.1427、读取文件的示例1.1528、读取文件的示例2.1529、使用$random生成随机数.1630、宏定义语句define.1631、带有宏定义的8位加法器.1732、用include语句设计的16位加法器.1733、结构化描述方式对四选一多路选择器.1834、结构化描述

3、方式实现一位全加器.1835、结构化描述方式实例化四个一位全加器实现四位串行进位全加器.1836、用户定义原语.1937、四选一的多路选择器的自定义原语设计.2038、用户定义原语的方式设计电平敏感锁存器.2039、用户定义原语的方式设计D触发器(时钟下降沿触发).2040、采用实例化前面用定义原语设计的四选一多路选择器(MUX)的方法实现十六 选一的多路选择器.2141、数据流建模描述方式:一位全加器.2242、行为建模方式设计一位加法器.2243、混合设计方式设计一位全加器.2244、数据流描述方式对四选一多路选择器建模.2345、行为建模方式设计四选一多路选择器.2346、用RTL级建模

4、方式设计此电路.2447、四位全加器.2448、组合逻辑电路.2449、单向三态端口.2550、单向总线缓冲器.2551、双向三态端口.2552、双向总线缓冲器.2653、2选1多路选择器.2654、多路比较器.2755、带使能端的38译码器.2856、4位二进制到格雷码的转换器.2957、时序逻辑电路.3058、JK触发器.3159、D触发器.3260、带异步复位端D触发器.3261、带异步置位端D触发器.3262、带有异步置位和复位的D触发器.3363、带有同步复位的D触发器.3364、带同步置位端的上升沿触发器.3365、带异步复位端和输出使能端的上升沿触发器.3466、锁存器:电平触发

5、的存储器单元,基本SR锁存器.3467、透明锁存器.3568、基本N位同步计数器.3569、带有异步复位、同步计数使能和可预置的十进制计数器.3570、格雷码计数器.3671、四位移位寄存器.3772、8位串入串出移位寄存器.3773、利用移位寄存器产生顺序脉冲.3874、可输出输入信号的2分频信号、4分频信号和8分频信号的分频器.3875、分频系数为12的分频器.3976、分频系数为6,占空比为1:5的偶数分频器.3977、3分频占空比为1:1的奇数分频器.4078、分频系数为5、占空比为1:1的奇数分频器.4179、分频系数为7、占空比为1:6的奇数分频器.4280、带使能端和复位端的时钟

6、同步8位寄存器组逻辑.4281、自触发always块.4282、1001序列信号检测器.4383、米利型有限状态机.4784、自动售饮料机的设计.4985、并行数据流转换为一种特殊串行数据流模块的设计.5386、设计对数字采集芯片AD0809的控制接口电路的Verilog代码.5787、面积优化设计乘法选择器.6188、串行化描述一个乘法累加器,其位宽位16位 对8个16位数据进行乘法和加法运算.6389、流水线设计流水线计数使用实例:8位加法器.6490、流水线设计设计一个为8位全加器 (一个是直接实现,一个采用4级流水线实现).65合肥工业大学宣城校区 微电子科学与工程 Verilog数字

7、系统设计1、二选一多路选择器行为描述:module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always(a or b or sl) if(!sl) out = a; else out = b;endmodule逻辑描述:module muxtwo(out,a,b,sl);input a,b,sl;output out;不用写寄存器 wire nsl,sela,selb;assign nsl = sl;assign sela = a&nsl;assign selb = b&sl;assign out = sela|s

8、elb;endmodule门级描述:module muxtwo(out,a,b,sl); input a,b,sl;output out;不用写寄存器 not u1(nsl,sl); and u2(sela,a,nsl); and u3(selb,b,sl); or u4(out,sela,selb); endmodule2、多路器模块的编写测试平台include “muxtwo.v” module t; reg ain,bin,select; reg clock; wire outw; initial begin ain=0; bin=0; select=0; clock=0; end al

9、ways #50 clock =clock; always(posedge clock) begin#1 ain = $random%2;#3 bin = $random%2; end muxtwo m(.out(outw),.a(ain),.b(bin),.sl(select);endmodule3、 三位加法器module adder ( count,sum,a,b,cin ); input 2:0 a,b; input cin; output count; output 2:0 sum; assign count,sum=a+b+cin;endmodule4、比较器:module com

10、pare ( equal,a,b ); output equal; /声明输出信号equal input 1:0 a,b; /声明输入信号a,b assign equal=(a=b)?1:0;/如果两个输入信号相等,输出为1。否则为0endmodule5、实例调用三态门选择器module mytri(out,in,enable); output out; input in, enable; assign out = enable? in : 'bz;endmodulemodule trist1(sout,sin,ena); output sout; input sin, ena; my

11、tri tri_inst(.out(sout), .in(sin),.enable(ena);endmodulemodule trist2(sout,sin,ena); output out; input in, enable; mytri tri_inst(sout,sin,ena);endmodule6、同步置位/清零的计数器module sync(out,d,load,clr,clk) input d,load,clk,clr; input7:0 d; output7:0out; reg7:0 out; always ( posedge clk ) /clk上升沿触发 begin if

12、( !clr ) out <= 8h00; /同步清0,低电平有效 else if ( load ) out <= d; /同步置数,高电平有效 else out <= out+1 /计数 endendmodule7、异步清零module async(d,clk,clr,q); input d,clk,clr; output q: reg q; always ( posedge clk or posedge clr) /异步清0 begin if ( clr ) q <= 1b0; else q <= d; endendmodule8、case语句实现3-8译码器

13、的部分代码wire2:0 sel;reg7:0 res;always (sel or res) begin case (sel) 3b000 : res=8b00000001; 3b001 : res=8b00000010; 3b010 : res=8b00000100; 3b011 : res=8b00001000; 3b100 : res=8b00010000; 3b101 : res=8b00100000; 3b110 : res=8b01000000; default : res=8b10000000; endcase end9、for语句来实现8位数据中低4位左移到高4位intege

14、r i;reg 7:0 datain; always (posedge clk) begin for(i=4;i<=7;i=i+1) begin dataini <= datain i-4; end end10、for语句计算出13路脉冲信号为高电平的个数 input clk,rst; input 12:0 datain;     /输入13路数据 output 15:0 num;     /13路数据电平为高的路数 reg 3:0 i; reg 15:0 num; always (posedge clk) begin&#

15、160;      if ( !rst ) begin       num <= 0;      end       else begin              for ( i = 0; i < 13; i = i + 1) /用for循环进行

16、计算    if ( datain i ) num <= num +1;                         end end11、生成语句对两个N位的总线用门级原语进行按位异或/本模块生成两条N位总线变量的按位异或 module gen_xor(out,i0,i1); parameter N = 32; /参数声明语句,

17、参数可以重新定义; /默认的总线位宽为32位 output N-1:0 out; inputN-1:0 i0,i1; /声明一个临时循环变量 /该变量只用于生成块的循环计算 /Verilog仿真时该变量在设计中并不存在 genvar j;/用一个单循环生成按位异或的异或门(xor) generate for( j = 0 ; j < N ; j = j+1) begin :xor_loop xor g1(out j ,i0 j , i1 j ); end endgenerate/用一个单循环生成用always块来描述的异或门(xor) /reg N-1 : 0 out; generate

18、 for( j = 0 ; j < N ; j = j+1) begin :xor_loop always(i0j,i1j ) outj= i0ji1j ; end endgenerate endmodule12、用条件生成语句实现参数化乘法器/本模块实现一个参数化乘法器 module multiplier(product,a0,a1); parameter a0_width = 8; /参数声明,该参数可以重新定义 parameter a1_width = 8; /本地参数声明 /本地参数不能用参数重新定义(defparam)修改 /也不能在实例引用时通过传递参数语句,即#(参数1,参

19、数2,)的方法修改 localparam product_width = a0_width+a1_width; /端口声明语句 output product_width -1 :0 product; input a0_width -1: 0 a0; input a1_width -1: 0 a1; /有条件地调用(实例引用)不同类型的乘法器 /根据参数a0_width和a1_width的值,在调用时引用相对应的乘法器实例 generate if( (a0_width < 8) | (a1_width < 8) ) cal_multiplier # (a0_width,a1_widt

20、h) m0(product,a0,a1); else tree_multiplier # (a0_width,a1_width) m0(product,a0,a1); endgenerate endmodule13、使用case生成语句实现N位加法器/本模块生成N位的加法器 module addr(co,sum,a0,a1,ci); /参数声明,本参数可以重新定义 parameter N= 4; /缺省的.急线位宽为4 /端口声明 output N-1:0 sum; output co; input N-1:0 a0,a1; input ci; /根据总线的位宽,调用(实例引用)相应的加法器

21、/参数N在调用(实例引用)时可以重新定义。调用(实例引用) /不同位宽的加法器是根据不同的N来决定的 generate case(N) /当N=1或2时分别选用位宽为1位或2位的加法器 1 : addr_1bit addr1(co,sum,a0,a1,ci); /1位的加法器 2 : addr_2bit addr2(co,sum,a0,a1,ci); /2位的加法器 / 默认的情况下选用位宽为N位的超前进位加法器 default : addr_cla #(N) addr3(co,sum,a0,a1,ci); endgenerate/生成块的结束endmodule14、四选一多路器/四选一多路器

22、,其端口列表完全根据输人/输出图编写 module mux4_to_1(out,i0,i1,i2,i3,s1,s0); /根据输入/输出图的端口声明 output out; input i0, i1, i2, i3; input s1, s0; /输出端口被声明为寄存器类型变量reg out; /若输人信号改变,则重新计算输出信号out /造成输出信号out重新计算的所有输人信号 /必须写入always(.)的电平敏感列表 always(s1,s0,i0,i1,i2,i3) begin case(s1,s0) 2'b00 : out = i0; 2'b01 : out = i1

23、; 2'b10 : out = i2; 2'b11 : out = i3; default : out = bx; endendmodule15、四位计数器/四位二进制计数器module counter(Q,clock,clear);/输入/输出端口 output 3:0 Q; inputclock,clear;/输出变量Q被定义为寄存器类型 reg 3:0 Q; always(posedge clear or negedge clock) begin if(clear) Q<=4'd0;/为了能生成诸如触发器一类的时序逻辑, /建议使用非阻塞赋值 else Q&

24、lt;=Q+1; /Q是一个四位的寄存器, endendmodule16、使用任务控制交通灯module traffic_lights; reg clock, red, amber, green; parameter on = 1, off = 0, red_tics = 350, amber_tics = 30, green_tics = 200; /交通灯初始化 initial red = off; initial amber = off; initial green = off;/交通灯控制时序 always begin red=on;/开红灯 light(red,red_tics);/

25、调用等待任务 green=on;/开绿灯 light(green,green_tics);/等待 amber=on;/开黄灯 light(amber,amber_tics);/等待 end/定义交通灯开启时间的任务 task light; /注意此行不需要端口名列表 output color;/ task的输出参量 input31:0 tics;/ task的输入参量 begin repeat ( tics ) ( posedge clock ); /等待tics个时钟的上升沿 color = off;/关灯 end endtask/产生时钟脉冲的always块always begin #10

26、0 clock = 0; #100 clock = 1; endendmodule17、CPU总线控制的任务timescale 1ns/10psmodule bus_ctrl_tb; reg 7: 0 data; reg data_valid; reg data_rd; cpu u1(data_valid, data,data_rd); initial begin / /任务调用 cpu_driver (8'b0000_0000); cpu_driver (8'b1010_1010); cpu_driver (8'b0101_0101); end/定义任务task cp

27、u_driver; input 7:0 data_in; begin #30 data_valid = 1; wait (data_rd = 1); #20 data = data_in; wait (data_rd = 0); #20 data = 8'hzz; #30 data_valid = 0; end endtask /任务结束endmodule18、自动任务示例module auto_task; reg 4:0 cd_add, ef_add; reg 4:0 c, d , e, f; reg clk1,clk2; parameter delay=1; initial beg

28、in clk1=0; clk2=0; c=3; d=5; e=7; f=4; #20 c=2; d=4; e=8; f=10; #20 $stop; endinitial forever #4 clk1=clk1;initial forever #5 clk2=clk2;task automatic adder; / 任务定义 output 4: 0 ab_adder; input 4: 0 a, b; begin #delay ab_adder = a + b; endendtaskalways (posedge clk1) adder(ef_add,e,f);always (posedge clk2) adder(cd_add, c, d);endmodule19、用函数实现乘累加器module mac(out,a,b,clk,clr); /? output15:0 out; input7:0 a,b; input clk,clr; reg15:0 out; wire15:0 sum; /定义函数mult;function15:0 mult; input7:0 a,b; reg15:0 result; integer i; begin result = a0 ? b:0; fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论