页数:53页文件大小:679.9 KB来源: 硬件描述语言和数字系统设计ppt课件
本课件以三个典型数字电路为例展开:十六进制计数器、12小时计数电路与周计数电路的RTL实现及测试模块,全加器的门级与行为级描述及其验证,以及串行数据转换为并行输出电路的实现方式与波形分析。
硬件描述语言和数字系统设计
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;测试模块: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;进制计数器电路原理图
电路原理图-同步方式
进制计数器芯片的设计二、以前数字电路做法:1.列出状态表和驱动表;2.卡诺图化简3.求得各个D触发器的D驱动信号表达式;4.画出该计数器的逻辑电路图.5.画出版图;6.去foundry厂流片;7.测试计数器样片。一、现代建模式做法:1.写出该计数器行为级描述;2.行为级仿真;3.综合得出电路图;4.综合生成网表;5.自动布局布线生成版图;6.后仿真;7.去foundry厂流片;8.测试计数器样片。
电路原理图-异步方式
carry分计数完成两个功能:
carry小时计数完成一个功能:
小时计数器——方法一(行波计数器)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;小时计数器——方法一(秒计数器)复位信号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是是否否
小时计数器——方法一(分计数器)复位信号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是是否否
小时计数器——方法一(小时计数器)复位信号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;是是否否
小时计数器——方法一(行波计数器)方法一是一个同步电路还是异步电路?
小时计数器——方法二方法二方法一
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方法二的代码实现;用Verilog HDL建模实现一用于玩具上的时钟芯片,要求该芯片能完成一周计数的星期/小时/分/秒功能。
周计数器的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;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;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;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;;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测试模块
课后练习1.用D触发器做个4进制的计数。(华为)2.实现N位Johnson Counter,N=5。(南山之桥)3.用你熟悉的设计方式设计一个可预置初值的7进制循环计数器,15进制的呢?(仕兰微电子)4.用VERILOG或VHDL写一段代码,实现10进制计数器。
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;(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位全加器
测试模块编写-预备知识1-系统任务及函数使用方式:$<identifier>
模拟内存使用,不能用这种方式来实现芯片中实际的内存(工艺)!!!!!
0];一个存储器赋值不能在一条赋值语句中完成。如,不能Xrom={{32‘hA},{32’h8}};//error可以对存储器中的一个字赋值。例如:Xrom[0] = 32'hA;//rightXrom[1] = 32'h8;//right
0] data_buffer;例5:reg serialMem[31 : 0];reg [3:0] Mem[31 : 0];提问:1.对data_buffer[3]进行赋值是否可以?2.那么serialMem[3]又是否可以,又是什么含义?Mem[3]呢?
1)$readmemb(加载二进制值)从指定的文本文件中读取数据并加载到存储器。例如:reg [31:0]RomB[6:0] ;$readmemb (“ram.dat", RomB);RomB是存储器。文件“ram .dat”是PC计算机上存在的一个数据文件。从文件ram .dat中读取数据并加载到存储器RomB。
initialbegin$readmemb ("test.vec", Vmem ) ;for (counter=0; counter<=1; counter = counter+ 1)begin{A, B, Cin, Sum_Ex, Cout_Ex}= Vmem [counter] ;#5;
//$readmemb ("test.vec", Vmem ) ;//{A, B, Cin, Sum_Ex, Cout_Ex}= Vmem [counter] ;假定仿真电脑的当前目录下,已经有文件“test.vec”包含如下两个向量:
仿真波形
综合后电路图-3-bit adder
综合后电路图1-bit adder
练习常见公司数字IC设计招聘题目(加法器)请用HDL描述四位的全加法器电路。(仕兰微电子)
串行转换成并行电路实现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;
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;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;串转并电路-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));
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
仿真波形
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}