首页计算机计算机工程硬件描述语言和数字系统设计 07 第7章 实例讲解-计数器-全加器设计.pptx

07 第7章 实例讲解-计数器-全加器设计.pptx

页数:53页文件大小:679.9 KB来源: 硬件描述语言和数字系统设计ppt课件

本课件以三个典型数字电路为例展开:十六进制计数器、12小时计数电路与周计数电路的RTL实现及测试模块,全加器的门级与行为级描述及其验证,以及串行数据转换为并行输出电路的实现方式与波形分析。

第7章Verilog基本语法章节封面,标示本章涵盖计数器及其测试模块、全加器及其测试模块、串行转换成并行电路的实现等内容
第7章主要内容,依次讲述计数器及其测试模块、全加器及其测试模块、串行转换成并行电路的实现等小节
计数器及其测试模块知识点页,列出周计数电路的实现等知识点
查看本课件的文字版(共 53 页,供检索与复制)

第1页:第7章Verilog基本语法

硬件描述语言和数字系统设计

第2页:第7章主要内容

主要内容
7.1计数器及其测试模块7.2全加器及其测试模块7.3串行转换成并行电路的实现

第3页:计数器及其测试模块

7.1.1
16进制计数器的实现
7.1.2
12小时计数电路的实现
7.1.3
周计数电路的实现

第4页:计数器及其测试模块(续1)

16进制计数器的实现设计要求
1.用Verilog HDL语言实现16进制计数器;2.写出其测试模块;3.画出用D触发器实现的16进制计数器的电路原理图。

第5页:module counter 代码示例

modulecounter (count, clk, rst,initial_value); input clk, rst; input [3:0] initial_value; output [3:0] count; reg [3:0] count; always @ (posedge clk or posedge rst)if (rst)count<= initial_value; else if( count == 4'b1111)count<= 4'b0000; elsecount<= count + 4'b0001; endmodule;

第6页:module test_counter

测试模块:module test_counter; reg clk, rst; Reg [3:0] initial_value; wire [3:0] count; counter dut(count,clk,rst,initial_value);always #50 clk = !clk;// rst generatorinitialbeginrst = 0; #5 rst = 1; #4 rst = 0; #50000 $stop; endendmodule;

第7页:16进制计数器电路原理图

进制计数器电路原理图

第8页:电路原理图-同步方式

电路原理图-同步方式

第9页:16进制计数器芯片的设计二

进制计数器芯片的设计二、以前数字电路做法:1.列出状态表和驱动表;2.卡诺图化简3.求得各个D触发器的D驱动信号表达式;4.画出该计数器的逻辑电路图.5.画出版图;6.去foundry厂流片;7.测试计数器样片。一、现代建模式做法:1.写出该计数器行为级描述;2.行为级仿真;3.综合得出电路图;4.综合生成网表;5.自动布局布线生成版图;6.后仿真;7.去foundry厂流片;8.测试计数器样片。

第10页:电路原理图-异步方式

电路原理图-异步方式

第11页:计数器作为一个重要的时序逻辑电路

  • 其Verilog实现有以下三个要点:2.敏感量采用边沿触发方式1.采用reg寄存器变量类型3.使用复位信号给计数器一个初值总结

第12页:时序逻辑电路设计实例

  • 时序逻辑电路的Verilog描述
  • 设计实例:设计一个时钟电路,具有时/分/秒计数功能,完成12小时计数7.1.2 12小时计数电路的实现

第13页:电路功能分析:由三个计数器

电路功能分析
由三个计数器电路组成:
  • 秒针进行60进制计数;
  • 分针进行60进制计数;
  • 时针进行12进制计数。

第14页:输入计数clk(假设clk频率为1Hz)

功能分解(秒计数)
秒进位脉冲s_carry秒计数完成两个功能:
  • 在输入计数时钟clk信号驱动下,进行0 ~ 59计数
  • 向分计数器输出进位脉冲,驱动分计数器工作

第15页:功能分解(分计数)分进位脉冲m_

carry分计数完成两个功能:

  • 在秒进位s_carry信号驱动下,进行0 ~ 59计数
  • 向小时计数器输出进位脉冲,驱动小时计数器工作秒进位脉冲s_carry

第16页:功能分解(小时计数)分进位脉冲m_

carry小时计数完成一个功能:

  • 在分进位m_carry信号驱动下,进行0 ~ 11计数

第17页:Verilog代码示例

小时计数器——方法一(行波计数器)module counter_12hour(clk,rst,s,m,h); input clk,rst; output [5:0] s;output [5:0] m; output [4:0] h; reg [5:0] s; reg [5:0] m; reg [4:0] h;reg m_carry;

第18页:12小时计数器——方法一(秒计数器)复位

小时计数器——方法一(秒计数器)复位信号rst或输入信号clk上升沿触发秒计数器s加1秒计数器s置0向分计数器电路输出进位高脉冲s_carry是否复位秒计数s是否到达最大值always@(posedge clk or posedge rst)if(rst)s<=6'b000000;else if(s!=6'b111011)begins<=s+1;s_carry< = 0;endelsebegins<=6'b000000;s_carry <= 1;end是是否否

第19页:12小时计数器——方法一(分计数器)复位

小时计数器——方法一(分计数器)复位信号rst或秒进位信号s_carry上升沿触发分计数器m加1分计数器m置0向小时计数器电路输出进位高脉冲m_carry是否复位分计数m是否到达最大值always@(posedge s_carry or posedge rst)if(rst)m<=6'b000000;else if(m!=6'b111011)beginm<=m+1;m_carry< = 0;endelsebeginm<=6'b000000;m_carry <= 1;end是是否否

第20页:12小时计数器——方法一(小时计数器)

小时计数器——方法一(小时计数器)复位信号rst或分进位信号m_carry上升沿触发小时计数器h加1小时计数器h置0是否复位小时计数h是否到达最大值always@(posedge m_carry or posedge rst)if(rst)h<=4'b0000;else if(h!=4'b1011)h<=h+1;elseh<=4'b0000;是是否否

第21页:12小时计数器——方法一(行波计数器)

小时计数器——方法一(行波计数器)方法一是一个同步电路还是异步电路?

第22页:12小时计数器——方法二方法

小时计数器——方法二方法二方法一

第23页:module counter_h12

modulecounter_h12(clk,rst,s,m,h); input clk,rst; output [5:0] s,m; output[3:0] h; reg [5:0]s,m; reg [3:0] h; always@(posedge clk or posedge rst )if(rst)s<=6'b000000; else if(s==6'b111011)s<=6'b000000; elses<=s+1; always@(posedgeclkor posedge rst )if(rst)m<=6'b000000; elseif(s==6'b111011)beginif(m==6'b111011)m<=6'b000000; elsem<=m+1; endalways@(posedge clkor posedge rst )if(rst)h<=4'b0000; else if((s==6'b111011)&&(m==6'b111011))beginif(h==4'b1011)h<=4'b0000; elseh<=h+1; endendmodule方法二的代码实现;

第24页:周计数电路的实现

用Verilog HDL建模实现一用于玩具上的时钟芯片,要求该芯片能完成一周计数的星期/小时/分/秒功能。

第25页:clk 时序逻辑示例

周计数器的Verilog实现module counter_week(clk,rst,s,m,h,w); input clk,rst; output [5:0] s,m; output[4:0] h; output [2:0] w; reg [5:0]s,m; reg [4:0] h; reg [2:0] w; always@(posedge clk or negedge rst )//second_counterif(!rst) s<=6'b000000; else if(s==6'b111011)s<=6'b000000; else s<=s+1;

第26页:clk 时序逻辑示例(续1)

always@(posedge clk or negedge rst )//minutes_counterif(!rst) m<=6'b000000; else if(s==6'b111011)beginif(m==6'b111011)m<=6'b000000; elsem<=m+1; end;

第27页:Verilog时序逻辑示例

always@(posedgeclkornegedgerst)//hours_counterif(rst)h<=5'b0; else if((s==6‘b111011)&&(m==6'b111011))beginif(h== 5‘b10111)//decimal 23h<=5'b0; elseh<=h+ 5'b00001; end;

第28页:clk 时序逻辑示例(续2)

always@(posedge clk or negedge rst )//week_counterif(!rst) w<=3'b001; else if((s==6'b111011)&&(m==6'b111011)&&(h==5'b10111))beginif(w==3'b111)w<=3'b001; elsew<=w+1; endendmodule;

第29页:module testbench

;reg clk,rst;wire [5:0] s,m; wire [4:0] h; wire [2:0] w;initialbeginclk=0;rst=1;#1 rst=0;#1 rst=1;endalways #50 clk=~clk;counter_week u1(clk,rst,s,m,h,w);endmodule测试模块

第30页:计数器及其测试模块(续2)

课后练习1.用D触发器做个4进制的计数。(华为)2.实现N位Johnson Counter,N=5。(南山之桥)3.用你熟悉的设计方式设计一个可预置初值的7进制循环计数器,15进制的呢?(仕兰微电子)4.用VERILOG或VHDL写一段代码,实现10进制计数器。

第31页:3位全加器的设计实现方式

位全加器的设计实现方式
采用常见工程项目中的实例化方式和测试模块的编写方法。7.2全加器及其测试模块

第32页:全加器及其测试模块

1位全加器的实现如果已经实现1位加法器电路如下:moduleAdder1Bit (A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; assign Sum = (A ^ B ) ^ Cin; assign Cout =(A&Cin)|(B&Cin)|(A&B); endmodule;

第33页:module Adder3Bit

(First, Second, Carry_In,Sum_Out,Carry_Out);input [2:0] First, Second;input Carry _ In;output [2:0] Sum _ Out;output Carry _ Out ;wire [1:0] Car_temp ;//通过例化1位加法形成3位加法器//moduleAdder1Bit (A, B, Cin, Sum, Cout) ;Adder1Bit A1 (. A (First[0]), .B(Second[0]), . Cin (Carry_In),. Sum (Sum_Out [0]), . Cout (Car_temp[0]) );Adder1Bit A2 (.A(First[1]), .B(Second[1]), .Cin(Car_temp[0]),.Sum(Sum_Out [ 1 ]) ,.Cout(Car_temp[1]) ) ;Adder1Bit A3 (.A(First[2]),.B(Second[2]), .Cin(Car_temp[1]),.Sum( Sum_Out [2]), .Cout(Carry_Out)) ;endmodule7.2.2利用1位加法器实现3位全加器

第34页:全加器及其测试模块(续1)

测试模块编写-预备知识1-系统任务及函数使用方式:$<identifier>

  • $符号指示这是系统任务和函数,用在测试中。
  • 系统函数有很多,如:
  • 显示/监视信号值($display, $monitor)
  • 停止仿真$stop
  • 结束仿真$finish

第35页:测试模块编写-预备知识2-存储器在仿真时

模拟内存使用,不能用这种方式来实现芯片中实际的内存(工艺)!!!!!

  • 在实际芯片制造时,ROM、RAM都会采用特殊工艺,但是由于仿真目的的需要,有时候我们会定义存储器接口。例1:reg [3:0] MyMem[ 31 : 0 ]
  • 例2:parameter ADDR_ DP=16 ,WD_SZ=8
  • reg [WD_SZ-1:0] RamPara [ADDR_DP-1:0]
  • 说明:RamPara是存储器,是16个8位寄存器组来模拟实际的存储单元。

第36页:例3:reg [7

0] MyMem[31
0];例4:reg [31:0] data_buffer;例5:reg serialMem[31 : 0];说明:1.MyMem是存储器,是32个8位寄存器组来模拟实际存储单元,其宽度为8,深度为32;2.而data_buffer只是32位寄存器;3.而serialMem是宽度为1深度为32的存储器。

第37页:reg [31:0] Xrom[1

0];一个存储器赋值不能在一条赋值语句中完成。如,不能Xrom={{32‘hA},{32’h8}};//error可以对存储器中的一个字赋值。例如:Xrom[0] = 32'hA;//rightXrom[1] = 32'h8;//right

第38页:例4:reg [31

0] data_buffer;例5:reg serialMem[31 : 0];reg [3:0] Mem[31 : 0];提问:1.对data_buffer[3]进行赋值是否可以?2.那么serialMem[3]又是否可以,又是什么含义?Mem[3]呢?

第39页:为存储器赋值的另一种方法是使用系统任务

1)$readmemb(加载二进制值)从指定的文本文件中读取数据并加载到存储器。例如:reg [31:0]RomB[6:0] ;$readmemb (“ram.dat", RomB);RomB是存储器。文件“ram .dat”是PC计算机上存在的一个数据文件。从文件ram .dat中读取数据并加载到存储器RomB。

第40页:module TestBench

;reg [2
0] A , B; reg Cin;wire [2:0] Sum; wire Cout;reg [2:0] counter;reg [2: 0] Sum _ Ex;reg Cout_Ex;reg [10:0] Vmem [1: 0] ;/ /被测试验证的模块实例。Adder3Bit F1 (A, B, Cin, Sum, Cout ) ;7.2.3 3位全加器的测试模块

第41页:Verilog代码示例(续1)

initialbegin$readmemb ("test.vec", Vmem ) ;for (counter=0; counter<=1; counter = counter+ 1)begin{A, B, Cin, Sum_Ex, Cout_Ex}= Vmem [counter] ;#5;

第42页:$readmemb读取向量文件

//$readmemb ("test.vec", Vmem ) ;//{A, B, Cin, Sum_Ex, Cout_Ex}= Vmem [counter] ;假定仿真电脑的当前目录下,已经有文件“test.vec”包含如下两个向量:

  • 向量的前三位对应于输入A,接下来的三位对应于输入B,再接下来的位是进位,八到十位是期望的求和结果,最后一位是期望进位值的输出结果。

第43页:仿真波形

仿真波形

第44页:全加器及其测试模块(续2)

综合后电路图-3-bit adder

第45页:全加器及其测试模块(续3)

综合后电路图1-bit adder

第46页:全加器及其测试模块(续4)

练习常见公司数字IC设计招聘题目(加法器)请用HDL描述四位的全加法器电路。(仕兰微电子)

第47页:串行转换成并行电路的

7.3.1
电路verilog实现
7.3.2
testbench设计
7.3.3
modelsim仿真与波形分析

第48页:电路verilog实现

串行转换成并行电路实现module s2p(rst,clk,s2p_en,data_in,data_out,data_out_valid);input rst,clk;input s2p_en;input data_in;output data_out_valid;output [3:0] data_out;reg [3:0] data_out;reg data_out_valid;reg [1:0] counter;

第49页:clk 时序逻辑示例(续3)

always @(posedge clk or negedge rst)if (!rst)counter<=2'b00; else if(counter==2'b11)counter<=2'b00; elsecounter<=counter+ 2'b01; always @ (posedge clk or negedge rst)if (!rst)data_out<=4'h0; else if(s2p_en)begindata_out[0]<=data_in; data_out[3:1]<=data_out[2:0]; endelsedata_out<=4'h0;

第50页:clk 时序逻辑示例(续4)

always@(posedge clk or negedge rst)if(!rst)data_out_valid<=1'b0; else if((counter==2'b11)&&(s2p_en))data_out_valid<=1'b1; elsedata_out_valid<=1'b0; endmodule;

第51页:testbench设计

串转并电路-testbenchmodule testbench_s2p;reg rst1,clk1;reg s2p_en1;reg data_in1;wire [3:0]data_out1;wire data_out_valid1;initialbeginrst1=1;clk1=0;#5 rst1=0;#3 rst1=1;#5 s2p_en1=1‘b1;endalways #50 clk1=~clk1;s2p serial2parallel (.rst(rst1),.clk(clk1),.s2p_en(s2p_en1),.data_in(data_in1),.data_out(data_out1),.data_out_valid(data_out_valid1));

第52页:Verilog代码示例(续2)

initialbegin#40 data_in1=1;#100 data_in1=0;#100 data_in1=1;#100 data_in1=1;#100 data_in1=0;#100 data_in1=0;#100 data_in1=1;#100 data_in1=0;#100 data_in1=1;#100 data_in1=1;#100 data_in1=1;#100 data_in1=1;#100 data_in1=0;#100 data_in1=1;#100 data_in1=0;#100 data_in1=1;endendmodule

第53页:modelsim仿真与波形分析

仿真波形

顶部目录