verilog模六十计数器设计

合集下载

模可变计数器设计(Verilog语言)解答

模可变计数器设计(Verilog语言)解答

模可变计数器设计(一)实验目的1、进一步熟悉实验装置和Quartus n软件的使用;2、进一步熟悉和掌握EDA 设计流程;3 、学习简单组合、时序电路的EDA 设计;4、学习计数器中二进制码到BCD 码的转换技巧;5、学习实验装置上数码管的输出方法。

(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA 实验装置上实现模可变计数器功能,具体要求如下:1 、设置一个按键控制改变模值,按键按下时模为10-99 之间(具体数值自行确定)的数,没按下时模为100-199 之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。

(三) 主要仪器设备3、微机 1 台4、QuartusII 集成开发软件 1 套5、EDA 实验装置 1 套(四) 实验步骤主要有三个模块1:一个模20 和模119 的计数器2:数码管的显示3:BCD 的调整源程序:module count (clk,m,en,rst,a,sel,SG,d);input clk,m,en,rst;output [7:0] SG;output [2:0] sel;output a;(* synthesis, keep *) reg clk1;(* synthesis, keep *) wire [3:0] gw,sw,bw;/*(* synthesis, keep *) */reg [3:0]a;reg [11:0] q;reg [11:0] model;reg [7:0] cnt,SG;reg [2:0] sel;reg [0:0]d;output [0:0]d;always @(posedge clk) begin cnt=cnt+1;if (cnt==200) begin clk1=1'b1; cnt=0; endelse clk1=1'b0; //200 分频,CLK 为数码管扫描频率,CLK1 为计数频率if (sel<2) sel=sel+1; else sel=0; end //sel 为数码管选择always @(sel) begincase (sel)0: a=bw; //0 数码管为百位1: a=sw; //1 数码管为十位2: a=gw; //2 数码管为个位default: a=0;endcasecase (a)0:SG<=8'b00111111; 1:SG<=8'b00000110;2:SG<=8'b01011011; 3:SG<=8'b01001111;4:SG<=8'b01100110; 5:SG<=8'b01101101;6:SG<=8'b01111101; 7:SG<=8'b00000111;8:SG<=8'b01111111; 9:SG<=8'b01101111; //8 段译码值default: SG=8'b11111111;endcase endalways @(m)if (m) model=12'b000000100000; // 模值20else model=12'b000100011001; // 模值119assign gw=q[3:0];assign sw=q[7:4];assign bw=q[11:8];always @(posedge clk1,negedge rst)beginif (!rst) q=0;else if (en)beginif (q<model)beginif (gw==9) begin q=q+7; if (sw==9) q=q+96; end //BCD 调整else q=q+1;endelse q=0;endendalways @(q)if(qvmodel) d<=0; else d<=1; endmodule波形仿真:iimulatioin WaveformsSimulation sode : TillingA.B Master Time Sar19L9 ns ■[POinler: 39.3^1 us Imeival:39.32 us Stan :End:he. 14 us 37.. 42 UH 33. 7 us39.9B LLS4k 26 us54 us 4X B2 usP 1 i111■Clk1是计数频率,每来一个 clk1信号q 计数一次Simula ion Wa^efor™ Sinulatlon lode: Tiling如图所rst=1有效时开始计数 clk 为扫描频率sel=0时数码管显示百位 a=0 sel=1时数码管显示十位 a=1 sel=2时数码管显示个位 a=3 m=1模20计数器 m=0模119计数器管脚分配:* I HI Ik * Jij19.3ns J hRoirter.6fl.H us Interval.68.09 UE Slarl End.lane<>0□ S&elk<>1B clkl曲+ 0-L玮tT IF Len^1.nCH- 1±1 sei尬1.田Q B i辭El 勿u 3.dM68.14 us63.16 us ■6E. 18 usI63.22 us 68. 24 usW [1] X [3]连[01 X [1] X [3]迪[0] X [1] X [3] ® [o] X [1] X [3]址[0] II :MasierTiiTiB Bar.68.12 usIIISG[0] SG[1] SG[2] SG[3] SG[4] SG[5] SG[6] SG[7] clkPIN_F13PIN_F14PIN_F15PIN_E15PIN_F16PIN_F17PIN_E18PIN_F18 PIN_C13en PIN_H8m rst sel[0] sel[1] sel[2] d[0] PIN_J9PIN_C5PIN_G18PIN_G17PIN_G16 PIN_G13(五)实验心得本实验主要是三大模块的编写,第一次的实验在老师给的参考代码下进行的,不过错误依然很多,主要有几个重点药掌握,一是首先要编写出能够计数的模块,用m 来控制模值的变化m=1 时模值为20 m=0 时模值为119;二是计数模块都是二进制计数的,而要在数码管上显示计数的话就必须进行BCD 调整,并且q 是一个是十二位的寄存器,通过把gw=q[3:0]; sw=q[7:4]; bw=q[11:8] 赋值的方法;一个个的显示在数码管上,由于clk 的频率比较快,所以可以看到三位数码管显示的值,我觉得管脚分配也是比较关键的!一开始我就把个位和百位显示的值搞反了序列信号发生和检测器设计(一)实验目的1、进一步熟悉EDA实验装置和Quartus n软件的使用方法;2 、学习有限状态机法进行数字系统设计;3、学习使用原理图输入法进行设计。

FPGA与数字系统设计:实验八 使用ECS绘制六十进制计数器

FPGA与数字系统设计:实验八 使用ECS绘制六十进制计数器

使用ECS绘制六十进制计数器1、实验目的本实验通过设计一个六十进制计数器,介绍如何使用ECS绘制模块原理图,并通过添加一个分频器来进行模块化设计。

2、实验内容通过本实验要求掌握以下几点:1、熟练运用ECS绘制原理图2、掌握模块化设计方法3、实验器材Spartan 3E开发板。

4、实验说明实验中所需要的源文件在本报告附录中。

5、实验步骤步骤1:新建工程1、新建名为cnt_60的工程(1)启动桌面上的ISE9.1图标,在Project Navigator中选择File→New Project。

(2)在弹出的对话框(见图1)中,设置工程名为cnt_60,工程存放路径为E:\work\,顶层模块类型选择HDL,并单击Next按钮。

图1 ISE工程属性对话框(3)出现图2所示对话框,目标器件选择spartan3E,具体设计如下图图2 ISE工程属性对话框(4)一直点击Next,直到出现图3(即是刚才所设定的),最后点击Finish。

图3 工程设计总表2、新建原理图资源文件(1)双击Creat New Source,点击Execute。

选择新建资源类型为Schematic,新建文件名为“cnt60”,并勾选Add to project,如图4,图4 新建原理图“cnt60”(2)单击NEXT,单击Finish,启动ECS,如图5,图5 原理图编辑窗口3、选择并放置器件符号“cnt60”是时间计数器,有两个4bit总线输出代表时间的各位与十位数值。

在出现的原理图编辑窗口中放置各种逻辑块,单击绘图工具栏中的按钮,在器件符号分类显示目录选择所有器件(All Symbols),在“Filter”中输入“cd4ce”,把选中的器件拖到工作区的合适位子,单击鼠标左键,把该器件放下。

再如上放下其它器件。

还须2个and2,2个or2, 2 个inv,1个and4,如图6,图6 放置器件的原理图编辑窗口4、添加连线(1)单击绘图工具栏的按钮,选择智能连线方式,当鼠标移动到可画线区域时,鼠标符号自动变为“+”形状,点击始点管脚,再点击终点管脚(2)单击右键结束操作(3)依照原理图连接其它线,并在器件端口拉出一小段线段为添加网线名称与I/O管脚做准备,如图7,图7 连完线的编辑窗口5、设置I/O管脚(1)单击绘图工具栏的按钮,在每个I/O管脚处单击,,为原理图设置I/O管脚,如图8图8 设置I/O管脚(2)在I/O管脚上双击,修改管脚名,如图9图9 修改I/O管脚的名字(3)修改完后,单击右键结束操作6、绘制总线ECS中没有专用的总线绘制命令,绘制总线时仍然采用绘制总线命令,仅仅用网线名区分总线与普通连线。

verilog的15个经典设计实例

verilog的15个经典设计实例
module block(c,b,a,clk); output c,b; input clk,a; reg c,b; always @(posedge clk)
begin b=a; c=b; end endmodule
【例 5.11】模为 60 的 BCD 码加法计数器
module count60(qout,cout,data,load,cin,reset,clk);
【例 5.6】用 fork-join 并行块产生信号波形
`timescale 10ns/1ns module wave2; reg wave; parameter cycle=5; initial
fork wave=0;
#(cycle) wave=1; #(2*cycle) wave=0; #(3*cycle) wave=1; #(4*cycle) wave=0; #(5*cycle) wave=1; #(6*cycle) $finish; join initial $monitor($time,,,"wave=%b",wave); endmodule
else
out<=out+1;
end
endmodule
//同步复位 //计数
【例 3.3】4 位全加器的仿真程序
`timescale 1ns/1ns `include "adder4.v" module adder_tp; reg[3:0] a,b; reg cin; wire[3:0] sum; wire cout; integer i,j;
output[7:0] qout;
output cout;
input[7:0] data;
input load,cin,clk,reset;

verilog综合设计实验:计数器及译码器的总体设计源代码

verilog综合设计实验:计数器及译码器的总体设计源代码

综合实验二:计数器及译码器的总体设计1. 实验说明:● 本次试验采用层次化设计。

● 设计的计数器模块的计数范围为0~7,具有异步清零,增或减的同步二进制计数功能。

● 3-8线译码器模块不带使能端,其他逻辑功能同前面设计的3-8线译码器。

● 采用modelsim 6.5软件进行测试。

2. 实验层次图:3. 实验代码:(1) 计数器模块● 源代码:inp_countert.Vmodule inp_2_counter(CP,CR,Q,Mod);inputCP,CR,Mod; //Mod=1,up counter;Mod=0,down counteroutput [2:0] Q;reg [2:0] Q; Y 7 Y 1 Y 0……always @ (posedge CP or negedge CR)if(~CR)Q<=3'b000;//CR=0,asynchronousclear else if (Mod==1) Q<=Q+1'b1;else Q<=Q-1'b1;endmodule●测试代码:test_inp_counter.Vmodule test_inp_2_counter;regCP,CR,Mod;wire [2:0] Q;inp_2_counter u0(CP,CR,Q,Mod);initialbeginCP=0;CR=0;Mod=1;#20 CR=1;Mod=1;#60 CR=0;Mod=1;#20 CR=1;Mod=1;#40 CR=1;Mod=0;#20 CR=0;Mod=1;endalways #10 CP=~CP;endmodule●测试结果:见inp2counter.WLF(2)译码器模块●源代码:3-8-decoder.Vmodule decoder_3to8(Q,Y);input [2:0] Q;output [7:0] Y;reg [7:0] Y;always @(Q)begin case(Q)3'b000:Y=8'b11111110;3'b001:Y=8'b11111101;3'b010:Y=8'b11111011;3'b011:Y=8'b11110111;3'b100:Y=8'b11101111;3'b101:Y=8'b11011111;3'b110:Y=8'b10111111;3'b111:Y=8'b01111111;endcaseendendmodule●测试代码:test_3_8_decoder.Vmodule test_decoder_3to8;reg [2:0] Q;wire [7:0] Y;decoder_3to8 u1(Q,Y);initialbeginQ=3'b000;endalways #20 Q=Q+1'b1;endmodule●测试结果:见decoder-3-8.WLF(3)顶层模块●源代码:top.Vmoduledec_counter(CP,CR,Mod,Y);inputCP,CR,Mod;output [7:0] Y;wire [2:0] Q; //intermediate carriesinp_2_counter f1(CP,CR,Q,Mod);decoder_3to8 f2(Q,Y);endmodule●测试代码:test_top.Vmoduledec_counter(CP,CR,Mod,Y);inputCP,CR,Mod;output [7:0] Y;wire [2:0] Q; //intermediate carriesinp_2_counter f1(CP,CR,Q,Mod);decoder_3to8 f2(Q,Y);endmodule测试结果:见top_dec_cn.WLF4.实验心得:本次实验为第一次使用分层次的电路设计方法来完成所需功能。

verilog计数器设计原理

verilog计数器设计原理

Verilog计数器设计原理1. 介绍计数器是一种常见的数字电路,用于计算和记录事件的数量。

在数字系统中,计数器通常用于生成时钟信号、控制状态机、实现频率分频等应用。

Verilog是一种硬件描述语言,可以用于设计和仿真数字电路。

本文将详细介绍与Verilog计数器设计相关的基本原理。

2. 计数器的基本概念计数器是一种能够在输入脉冲信号的作用下进行累加或递减操作的数字电路。

它通常由触发器和逻辑门组成,触发器用于存储和传递数据,逻辑门用于控制触发器的工作状态。

2.1 同步计数器同步计数器是通过时钟信号来同步各个触发器的状态转换,以实现数据的累加或递减操作。

它包含一个时钟输入端(CLK)和一个复位输入端(RST)。

2.1.1 同步正向计数器同步正向计数器是最简单的同步计数器之一,它能够在每个上升沿时钟信号到达时进行累加操作。

2.1.1.1 原理同步正向计数器由多个触发器和逻辑门组成,其中每个触发器都有一个时钟输入端和一个复位输入端。

当时钟信号的上升沿到达时,触发器的状态将根据输入信号进行更新。

具体的原理如下:1.初始化:将计数器的初始值设置为0。

2.时钟边沿检测:当时钟信号的上升沿到达时,进入下一步操作。

3.累加操作:根据触发器的当前状态进行累加操作。

如果触发器为0,则变为1;如果触发器为1,则变为0。

4.检测溢出:如果最高位触发器由1变为0,则表示计数溢出,需要将其他低位触发器进行进位操作。

2.1.1.2 Verilog代码示例以下是一个4位同步正向计数器的Verilog代码示例:module synchronous_counter(input wire clk,input wire rst,output wire [3:0] count);reg [3:0] count;always @(posedge clk or posedge rst)beginif (rst)count <= 4'b0000;elsecount <= count + 1;endendmodule2.1.2 同步递减计数器同步递减计数器是同步正向计数器的一种扩展,它能够在每个上升沿时钟信号到达时进行递减操作。

Verilog的150个经典设计实例

Verilog的150个经典设计实例

module adder4(cout,sum,ina,inb,cin);output[3:0] sum;output cout;input[3:0] ina,inb;input cin;assign {cout,sum}=ina+inb+cin;endmodule【例3.2】4位计数器module count4(out,reset,clk);output[3:0] out;input reset,clk;reg[3:0] out;always @(posedge clk)beginif (reset) out<=0; //同步复位else out<=out+1; //计数endendmodule【例3.3】4位全加器的仿真程序`timescale 1ns/1ns`include "adder4.v"module adder_tp; //测试模块的名字reg[3:0] a,b; //测试输入信号定义为reg型reg cin;wire[3:0] sum; //测试输出信号定义为wire型wire cout;integer i,j;adder4 adder(sum,cout,a,b,cin); //调用测试对象always #5 cin=~cin; //设定cin的取值initialbegina=0;b=0;cin=0;for(i=1;i<16;i=i+1)#10 a=i; //设定a的取值endinitialbeginfor(j=1;j<16;j=j+1)#10 b=j; //设定b的取值endinitial//定义结果显示格式begin$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);#160 $finish;endendmodule【例3.4】4位计数器的仿真程序`timescale 1ns/1ns`include "count4.v"module coun4_tp;reg clk,reset; //测试输入信号定义为reg型wire[3:0] out; //测试输出信号定义为wire型parameter DELY=100;count4 mycount(out,reset,clk); //调用测试对象always #(DELY/2) clk = ~clk; //产生时钟波形initialbegin//激励信号定义clk =0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*20) $finish;end//定义结果显示格式initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule【例3.5】“与-或-非”门电路module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,Doutput F; //模块的输出端口为Fwire A,B,C,D,F; //定义信号的数据类型assign F= ~((A&B)|(C&D)); //逻辑功能描述endmodule【例5.1】用case语句描述的4选1数据选择器module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input[1:0] sel;reg out;always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default: out=2'bx;endcaseendmodule【例5.2】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output[7:0] out;input[7:0] data;input load,clk,reset;reg[7:0] out;always @(posedge clk) //clk上升沿触发beginif (!reset) out = 8'h00; //同步清0,低电平有效else if (load) out = data; //同步预置else out = out + 1; //计数endendmodule【例5.3】用always过程语句描述的简单算术逻辑单元`define add 3'd0`define minus 3'd1`define band 3'd2`define bor 3'd3`define bnot 3'd4module alu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode; //操作码input[7:0] a,b; //操作数always@(opcode or a or b) //电平敏感的always块begincase(opcode)`add: out = a+b; //加操作`minus: out = a-b; //减操作`band: out = a&b; //求与`bor: out = a|b; //求或`bnot: out=~a; //求反default: out=8'hx; //未收到指令时,输出任意态endcaseendendmodule【例5.4】用initial过程语句对测试变量A、B、C赋值`timescale 1ns/1nsmodule test;reg A,B,C;initialbeginA = 0;B = 1;C = 0;#50 A = 1; B = 0;#50 A = 0; C = 1;#50 B = 1;#50 B = 0; C = 0;#50 $finish ;endendmodule【例5.5】用begin-end串行块产生信号波形`timescale 10ns/1nsmodule wave1;reg wave;parameter cycle=10;initialbeginwave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) $finish ;endinitial $monitor($time,,,"wave=%b",wave); endmodule【例5.6】用fork-join并行块产生信号波形`timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,,,"wave=%b",wave); endmodule【例5.7】持续赋值方式定义的2选1多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel为0,则out=a ;否则out=b endmodule【例5.8】阻塞赋值方式定义的2选1多路选择器module MUX21_2(out,a,b,sel);input a,b,sel;output out;reg out;always@(a or b or sel)beginif(sel==0) out=a; //阻塞赋值else out=b;endendmodule【例5.9】非阻塞赋值module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb<=a;c<=b;endendmodule【例5.10】阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb=a;c=b;endendmodule【例5.11】模为60的BCD码加法计数器module count60(qout,cout,data,load,cin,reset,clk);output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk) //clk上升沿时刻计数if (reset) qout<=0; //同步复位else if(load) qout<=data; //同步置数else if(cin)beginif(qout[3:0]==9) //低位是否为9,是则beginqout[3:0]<=0; //回0,并判断高位是否为5if (qout[7:4]==5) qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1; //高位不为5,则加1endelse//低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号endmodule【例5.12】BCD码—七段数码管显示译码器module decode4_7(decodeout,indec);output[6:0] decodeout;input[3:0] indec;reg[6:0] decodeout;always @(indec)begincase(indec) //用case语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default: decodeout=7'bx;endcaseend【例5.13】用casez描述的数据选择器module mux_casez(out,a,b,c,d,select); output out;input a,b,c,d;input[3:0] select;reg out;always @(select or a or b or c or d) begincasez(select)4'b???1: out = a;4'b??1?: out = b;4'b?1??: out = c;4'b1???: out = d;endcaseendendmodule【例5.14】隐含锁存器举例module buried_ff(c,b,a);output c;input b,a;reg c;always @(a or b)beginif((b==1)&&(a==1)) c=a&b;endendmodule【例5.15】用for语句描述的七人投票表决器module voter7(pass,vote);output pass;input[6:0] vote;reg[2:0] sum;integer i;reg pass;always @(vote)beginsum=0;for(i=0;i<=6;i=i+1) //for语句if(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4人赞成,则pass=1else pass=0;endendmodule【例5.16】用for语句实现2个8位数相乘module mult_for(outcome,a,b);parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] outcome; //结果reg[2*size:1] outcome;integer i;always @(a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) //for语句if(b[i]) outcome=outcome +(a << (i-1));endendmodule【例5.17】用repeat实现8位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;input[size:1] a,b;output[2*size:1] outcome;reg[2*size:1] temp_a,outcome;reg[size:1] temp_b;always @(a or b)beginoutcome=0;temp_a=a;temp_b=b;repeat(size) //repeat语句,size为循环次数beginif(temp_b[1]) //如果temp_b的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a<<1; //操作数a左移一位temp_b=temp_b>>1; //操作数b右移一位endendendmodule【例5.18】同一循环的不同实现方式module loop1; //方式1integer i;initialfor(i=0;i<4;i=i+1) //for语句begin$display(“i=%h”,i);endendmodulemodule loop2; //方式2integer i;initial begini=0;while(i<4) //while语句begin$display ("i=%h",i);i=i+1;endendendmodulemodule loop3; //方式3integer i;initial begini=0;repeat(4) //repeat语句begin$display ("i=%h",i);i=i+1;endendendmodule【例5.19】使用了`include语句的16位加法器`include "adder.v"module adder16(cout,sum,a,b,cin);output cout;parameter my_size=16;output[my_size-1:0] sum;input[my_size-1:0] a,b;input cin;adder my_adder(cout,sum,a,b,cin); //调用adder模块endmodule//下面是adder模块代码module adder(cout,sum,a,b,cin);parameter size=16;output cout;output[size-1:0] sum;input cin;input[size-1:0] a,b;assign {cout,sum}=a+b+cin;endmodule【例5.20】条件编译举例module compile(out,A,B);output out;input A,B;`ifdef add //宏名为addassign out=A+B;`elseassign out=A-B;`endifendmodule【例6.1】加法计数器中的进程module count(data,clk,reset,load,cout,qout);output cout;output[3:0] qout;reg[3:0] qout;input[3:0] data;input clk,reset,load;- 11 -always @(posedge clk) //进程1,always过程块beginif (!reset) qout= 4'h00; //同步清0,低电平有效else if (load) qout= data; //同步预置else qout=qout + 1; //加法计数endassign cout=(qout==4'hf)?1:0; //进程2,用持续赋值产生进位信号endmodule【例6.2】任务举例module alutask(code,a,b,c);input[1:0] code;input[3:0] a,b;output[4:0] c;reg[4:0] c;task my_and; //任务定义,注意无端口列表input[3:0] a,b; //a,b,out名称的作用域范围为task任务内部output[4:0] out;integer i;beginfor(i=3;i>=0;i=i-1)out[i]=a[i]&b[i]; //按位与endendtaskalways@(code or a or b)begincase(code)2'b00: my_and(a,b,c);/* 调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c 分别对应任务定义中的a,b,out */2'b01: c=a|b; //或2'b10: c=a-b; //相减2'b11: c=a+b; //相加endcaseendendmodule- 12 -【例6.3】测试程序`include "alutask.v"module alu_tp;reg[3:0] a,b;reg[1:0] code;wire[4:0] c;parameter DELY = 100;alutask ADD(code,a,b,c); //调用被测试模块initial begincode=4'd0; a= 4'b0000; b= 4'b1111;#DELY code=4'd0; a= 4'b0111; b= 4'b1101;#DELY code=4'd1; a= 4'b0001; b= 4'b0011;#DELY code=4'd2; a= 4'b1001; b= 4'b0011;#DELY code=4'd3; a= 4'b0011; b= 4'b0001;#DELY code=4'd3; a= 4'b0111; b= 4'b1001;#DELY $finish;endinitial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c);endmodule【例6.4】函数function[7:0] get0;input[7:0] x;reg[7:0] count;integer i;begincount=0;for (i=0;i<=7;i=i+1)if (x[i]=1'b0) count=count+1;get0=count;endendfunction【例6.5】用函数和case语句描述的编码器(不含优先顺序)module code_83(din,dout);input[7:0] din;output[2:0] dout;- 13 -function[2:0] code; //函数定义input[7:0] din; //函数只有输入,输出为函数名本身casex (din)8'b1xxx_xxxx : code = 3'h7;8'b01xx_xxxx : code = 3'h6;8'b001x_xxxx : code = 3'h5;8'b0001_xxxx : code = 3'h4;8'b0000_1xxx : code = 3'h3;8'b0000_01xx : code = 3'h2;8'b0000_001x : code = 3'h1;8'b0000_000x : code = 3'h0;default: code = 3'hx;endcaseendfunctionassign dout = code(din) ; //函数调用endmodule【例6.6】阶乘运算函数module funct(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk) //在clk的上升沿时执行运算beginif(!reset) result<=0; //复位else beginresult <= 2 * factorial(n); //调用factorial函数endendfunction[31:0] factorial; //阶乘运算函数定义(注意无端口列表)input[3:0] opa; //函数只能定义输入端,输出端口为函数名本身reg[3:0] i;beginfactorial = opa ? 1 : 0;for(i= 2; i <= opa; i = i+1) //该句若要综合通过,opa应赋具体的数值factorial = i* factorial; //阶乘运算end- 14 -endfunctionendmodule【例6.7】测试程序`define clk_cycle 50`include "funct.v"module funct_tp;reg[3:0] n;reg reset,clk;wire[31:0] result;initial//定义激励向量beginn=0; reset=1; clk=0;for(n=0;n<=15;n=n+1)#100 n=n;endinitial $monitor($time,,,"n=%d result=%d",n,result);//定义输出显示格式always # `clk_cycle clk=~clk; //产生时钟信号funct funct_try(.clk(clk),.n(n),.result(result),.reset(reset));//调用被测试模块endmodule【例6.8】顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;a=~q;endendmodule【例6.9】顺序执行模块2module serial2(q,a,clk);output q,a;- 15 -input clk;reg q,a;always @(posedge clk)begina=~q;q=~q;endendmodule【例6.10】并行执行模块1module paral1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;endalways @(posedge clk)begina=~q;endendmodule【例6.11】并行执行模块2module paral2(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)begina=~q;endalways @(posedge clk)beginq=~q;endendmodule【例7.1】调用门元件实现的4选1 MUX - 16 -module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not(notcntrl1,cntrl2),(notcntrl2,cntrl2);and (w,in1,notcntrl1,notcntrl2),(x,in2,notcntrl1,cntrl2),(y,in3,cntrl1,notcntrl2),(z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodule【例7.2】用case语句描述的4选1 MUXmodule mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always@(in1 or in2 or in3 or in4 or cntrl1 or cntrl2)case({cntrl1,cntrl2})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmodule【例7.3】行为描述方式实现的4位计数器module count4(clk,clr,out);input clk,clr;output[3:0] out;reg[3:0] out;always @(posedge clk or posedge clr)beginif (clr) out<=0;else out<=out+1;endendmodule- 17 -【例7.4】数据流方式描述的4选1 MUXmodule mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=(in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)| (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2);endmodule【例7.5】用条件运算符描述的4选1 MUXmodule mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1);endmodule【例7.6】门级结构描述的2选1MUXmodule mux2_1a(out,a,b,sel);output out;input a,b,sel;not (sel_,sel);and(a1,a,sel_),(a2,b,sel);or (out,a1,a2);endmodule【例7.7】行为描述的2选1MUXmodule mux2_1b(out,a,b,sel);output out;input a,b,sel;reg out;always @(a or b or sel)beginif(sel) out = b;else out = a;endendmodule【例7.8】数据流描述的2选1MUXmodule MUX2_1c(out,a,b,sel);output out;- 18 -input a,b,sel;assign out = sel ? b : a;endmodule【例7.9】调用门元件实现的1位半加器module half_add1(a,b,sum,cout);input a,b;output sum,cout;and(cout,a,b);xor(sum,a,b);endmodule【例7.10】数据流方式描述的1位半加器module half_add2(a,b,sum,cout);input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;endmodule【例7.11】采用行为描述的1位半加器module half_add3(a,b,sum,cout);input a,b;output sum,cout;reg sum,cout;always @(a or b)begincase ({a,b}) //真值表描述2'b00: begin sum=0; cout=0; end2'b01: begin sum=1; cout=0; end2'b10: begin sum=1; cout=0; end2'b11: begin sum=0; cout=1; endendcaseendendmodule【例7.12】采用行为描述的1位半加器module half_add4(a,b,sum,cout);input a,b;output sum,cout;- 19 -reg sum,cout;always @(a or b)beginsum= a^b;cout=a&b;endendmodule【例7.13】调用门元件实现的1位全加器module full_add1(a,b,cin,sum,cout);input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and (m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or(cout,m1,m2,m3);endmodule【例7.14】数据流描述的1位全加器module full_add2(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign sum = a ^ b ^ cin;assign cout = (a & b)|(b & cin)|(cin & a);endmodule【例7.15】1位全加器module full_add3(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign {cout,sum}=a+b+cin;endmodule【例7.16】行为描述的1位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;output sum,cout;- 20 -reg sum,cout; //在always块中被赋值的变量应定义为reg型reg m1,m2,m3;always @(a or b or cin)beginsum = (a ^ b) ^ cin;m1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1|m2)|m3;endendmodule【例7.17】混合描述的1位全加器 module full_add5(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg cout,m1,m2,m3; //在always块中被赋值的变量应定义为reg型wire s1;xor x1(s1,a,b); //调用门元件always @(a or b or cin) //always块语句beginm1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1| m2) | m3;endassign sum = s1 ^ cin; //assign持续赋值语句endmodule【例7.18】结构描述的4位级连全加器 `include "full_add1.v"module add4_1(sum,cout,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;full_add1 f0(a[0],b[0],cin,sum[0],cin1); //级连描述full_add1 f1(a[1],b[1],cin1,sum[1],cin2);full_add1 f2(a[2],b[2],cin2,sum[2],cin3);- 21 -full_add1 f3(a[3],b[3],cin3,sum[3],cout);endmodule【例7.19】数据流描述的4位全加器module add4_2(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;assign {cout,sum}=a+b+cin;endmodule【例7.20】行为描述的4位全加器module add4_3(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;reg[3:0] sum;reg cout;always @(a or b or cin)begin{cout,sum}=a+b+cin;endendmodule【例8.1】$time与$realtime的区别`timescale 10ns/1nsmodule time_dif;reg ts;parameter delay=2.6;initialbegin#delay ts=1;#delay ts=0;#delay ts=1;#delay ts=0;endinitial $monitor($time,,,"ts=%b",ts); //使用函数$time - 22 -endmodule【例8.2】$random函数的使用`timescale 10ns/1nsmodule random_tp;integer data;integer i;parameter delay=10;initial $monitor($time,,,"data=%b",data);initial beginfor(i=0; i<=100; i=i+1)#delay data=$random; //每次产生一个随机数endendmodule【例8.3】1位全加器进位输出UDP元件primitive carry_udp(cout,cin,a,b);input cin,a,b;output cout;table//cin a b : cout //真值表0 0 0 : 0;0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;endtableendprimitive【例8.4】包含x态输入的1位全加器进位输出UDP元件primitive carry_udpx1(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表0 0 0 : 0;- 23 -0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;0 0 x : 0; //只要有两个输入为0,则进位输出肯定为00 x 0 : 0;x 0 0 : 0;1 1 x : 1; //只要有两个输入为1,则进位输出肯定为11 x 1 : 1;x 1 1 : 1;endtableendprimitive【例8.5】用简缩符“?”表述的1位全加器进位输出UDP元件primitive carry_udpx2(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表? 0 0 : 0; //只要有两个输入为0,则进位输出肯定为00 ? 0 : 0;0 0 ? : 0;? 1 1 : 1; //只要有两个输入为1,则进位输出肯定为11 ? 1 : 1;1 1 ? : 1;endtableendprimitive【例8.6】3选1多路选择器UDP元件primitive mux31(Y,in0,in1,in2,s2,s1);input in0,in1,in2,s2,s1;output Y;table//in0 in1 in2 s2 s1 : Y0 ? ? 0 0 : 0; //当s2s1=00时,Y=in01 ? ? 0 0 : 1;? 0 ? 0 1 : 0; //当s2s1=01时,Y=in1- 24 -? 1 ? 0 1 : 1;? ? 0 1 ? : 0; //当s2s1=1?时,Y=in2? ? 1 1 ? : 1;0 0 ? 0 ? : 0;1 1 ? 0 ? : 1;0 ? 0 ? 0 : 0;1 ? 1 ? 0 : 1;? 0 0 ? 1 : 0;? 1 1 ? 1 : 1;endtableendprimitive【例8.7】电平敏感的1位数据锁存器UDP元件primitive latch(Q,clk,reset,D);input clk,reset,D;output Q;reg Q;initial Q = 1'b1; //初始化table// clk reset D : state : Q? 1 ? : ? : 0 ; //reset=1,则不管其他端口为什么值,输出都为00 0 0 : ? : 0 ; //clk=0,锁存器把D端的输入值输出0 0 1 : ? : 1 ;1 0 ? : ? : - ; //clk=1,锁存器的输出保持原值,用符号“-”表示endtableendprimitive【例8.8】上升沿触发的D触发器UDP元件primitive DFF(Q,D,clk);output Q;input D,clk;reg Q;table//clk D : state : Q(01) 0 : ? : 0; //上升沿到来,输出Q=D(01) 1 : ? : 1;(0x) 1 : 1 : 1;(0x) 0 : 0 : 0;(?0) ? : ? : -; //没有上升沿到来,输出Q保持原值? (??) : ? : - ; //时钟不变,输出也不变- 25 -endprimitive【例8.9】带异步置1和异步清零的上升沿触发的D触发器UDP元件primitive DFF_UDP(Q,D,clk,clr,set);output Q;input D,clk,clr,set;reg Q;table// clk D clr s et : state : Q(01) 1 0 0 : ? : 0;(01) 1 0 x : ? : 0;? ? 0 x : 0 : 0;(01) 0 0 0 : ? : 1;(01) 0 x 0 : ? : 1;? ? x 0 : 1 : 1;(x1) 1 0 0 : 0 : 0;(x1) 0 0 0 : 1 : 1;(0x) 1 0 0 : 0 : 0;(0x) 0 0 0 : 1 : 1;? ? 1 ? : ? : 1; //异步复位? ? 0 1 : ? : 0; //异步置1n ? 0 0 : ? : -;? * ? ? : ? : -;? ? (?0) ? : ? : -;? ? ? (?0): ? : -;? ? ? ? : ? : x;endtableendprimitive【例8.12】延迟定义块举例module delay(out,a,b,c);output out;input a,b,c;and a1(n1,a,b);or o1(out,c,n1);specify(a=>out)=2;(b=>out)=3;(c=>out)=1;- 26 -endmodule【例8.13】激励波形的描述'timescale 1ns/1nsmodule test1;reg A,B,C;initialbegin//激励波形描述A = 0;B = 1;C = 0;#100 C = 1;#100 A = 1; B = 0;#100 A = 0;#100 C = 0;#100 $finish;endinitial $monitor($time,,,"A=%d B=%d C=%d",A,B,C); //显示endmodule【例8.15】用always过程块产生两个时钟信号module test2;reg clk1,clk2;parameter CYCLE = 100;alwaysbegin{clk1,clk2} = 2'b10;#(CYCLE/4) {clk1,clk2} = 2'b01;#(CYCLE/4) {clk1,clk2} = 2'b11;#(CYCLE/4) {clk1,clk2} = 2'b00;#(CYCLE/4) {clk1,clk2} = 2'b10;endinitial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2);endmodule【例8.17】存储器在仿真程序中的应用module ROM(addr,data,oe);output[7:0] data; //数据信号input[14:0] addr; //地址信号input oe; //读使能信号,低电平有效- 27 -reg[7:0] mem[0:255]; //存储器定义parameter DELAY = 100;assign #DELAY data=(oe==0) ? mem[addr] : 8'hzz;initial $readmemh("rom.hex",mem); //从文件中读入数据endmodule【例8.18】8位乘法器的仿真程序`timescale 10ns/1nsmodule mult_tp; //测试模块的名字reg[7:0] a,b; //测试输入信号定义为reg型wire [15:0] out; //测试输出信号定义为wire型integer i,j;mult8 m1(out,a,b); //调用测试对象//激励波形设定initialbegina=0;b=0;for(i=1;i<255;i=i+1)#10 a=i;endinitialbeginfor(j=1;j<255;j=j+1)#10 b=j;endinitial//定义结果显示格式begin$monitor($time,,,"%d * %d= %d",a,b,out);#2560 $finish;endendmodulemodule mult8(out, a, b); //8位乘法器源代码parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] out; //结果assign out=a*b; //乘法运算符- 28 -endmodule【例8.19】8位加法器的仿真程序`timescale 1ns/1nsmodule add8_tp; //仿真模块无端口列表reg[7:0] A,B; //输入激励信号定义为reg型reg cin;wire[7:0] SUM; //输出信号定义为wire型wire cout;parameter DELY = 100;add8 AD1(SUM,cout,A,B,cin); //调用测试对象initial begin//激励波形设定A= 8'd0; B= 8'd0; cin=1'b0;#DELY A= 8'd100; B= 8'd200; cin=1'b1;#DELY A= 8'd200; B= 8'd88;#DELY A= 8'd210; B= 8'd18; cin=1'b0;#DELY A= 8'd12; B= 8'd12;#DELY A= 8'd100; B= 8'd154;#DELY A= 8'd255; B= 8'd255; cin=1'b1;#DELY $finish;end//输出格式定义initial $monitor($time,,,"%d + %d + %b = {%b, %d}",A,B,cin,cout,SUM); endmodulemodule add8(SUM,cout,A,B,cin); //待测试的8位加法器模块output[7:0] SUM;output cout;input[7:0] A,B;input cin;assign {cout,SUM}=A+B+cin;endmodule【例8.20】2选1多路选择器的仿真`timescale 1ns/1nsmodule mux_tp;reg a,b,sel;wire out;- 29 -MUX2_1 m1(out,a,b,sel); //调用待测试模块initialbegina=1'b0; b=1'b0; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; s el=1'b0;#5 sel=1'b1;#5 a=1'b0; b=1'b1; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; b=1'b1; sel=1'b0;#5 sel=1'b1;endinitial $monitor($time,,,"a=%b b=%b sel=%b out=%b",a,b,sel,out);endmodulemodule MUX2_1(out,a,b,sel); //待测试的2选1MUX模块input a,b,sel;output out;not #(0.4,0.3) (sel_,sel); //#(0.4,0.3)为门延时and #(0.7,0.6) (a1,a,sel_);and #(0.7,0.6) (a2,b,sel);or #(0.7,0.6) (out,a1,a2);endmodule【例8.21】8位计数器的仿真`timescale 10ns/1nsmodule count8_tp;reg clk,reset; //输入激励信号定义为reg型wire[7:0] qout; //输出信号定义为wire型parameter DELY=100;counter C1(qout,reset,clk); //调用测试对象always #(DELY/2) clk = ~clk; //产生时钟波形initialbegin//激励波形定义clk =0; reset=0;- 30 -#DELY reset=1;#DELY reset=0;#(DELY*300) $finish;end//结果显示initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout); endmodulemodule counter(qout,reset,clk); //待测试的8位计数器模块output[7:0] qout;input clk,reset;reg[7:0] qout;always @(posedge clk)begin if (reset) qout<=0;else qout<=qout+1;endendmodule【例9.1】基本门电路的几种描述方法(1)门级结构描述module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); //调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule(2)数据流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D); //assign持续赋值endmodule(3)行为描述module gate3(F,A,B,C,D);input A,B,C,D;output F;- 31 -reg F;always @(A or B or C or D) //过程赋值beginF=(A&B)|(B&C&D);endendmodule【例9.2】用bufif1关键字描述的三态门module tri_1(in,en,out);input in,en;output out;tri out;bufif1 b1(out,in,en); //注意三态门端口的排列顺序endmodule【例9.3】用assign语句描述的三态门module tri_2(out,in,en);output out;input in,en;assign out = en ? in : 'bz;//若en=1,则out=in;若en=0,则out为高阻态endmodule【例9.4】三态双向驱动器module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout = en ? in : 'bz;assign out = tri_inout ^ b;endmodule【例9.5】三态双向驱动器module bidir2(bidir,en,clk);inout[7:0] bidir;input en,clk;reg[7:0] temp;assign bidir= en ? temp : 8'bz;always @(posedge clk)begin- 32 -if(en) temp=bidir;else temp=temp+1;endendmodule【例9.6】3-8译码器module decoder_38(out,in);output[7:0] out;input[2:0] in;reg[7:0] out;always @(in)begincase(in)3'd0: out=8'b11111110;3'd1: out=8'b11111101;3'd2: out=8'b11111011;3'd3: out=8'b11110111;3'd4: out=8'b11101111;3'd5: out=8'b11011111;3'd6: out=8'b10111111;3'd7: out=8'b01111111;endcaseendendmodule【例9.7】8-3优先编码器module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h);output none_on;output[2:0] outcode;input a,b,c,d,e,f,g,h;reg[3:0] outtemp;assign {none_on,outcode}=outtemp;always @(a or b or c or d or e or f or g or h)beginif(h) outtemp=4'b0111;else if(g) outtemp=4'b0110;else if(f) outtemp=4'b0101;else if(e) outtemp=4'b0100;else if(d) outtemp=4'b0011;else if(c) outtemp=4'b0010;- 33 -else if(b) outtemp=4'b0001;else if(a) outtemp=4'b0000;else outtemp=4'b1000;endendmodule【例9.8】用函数定义的8-3优先编码器module code_83(din, dout);input[7:0] din;output[2:0] dout;function[2:0] code; //函数定义input[7:0] din; //函数只有输入端口,输出为函数名本身if (din[7]) code = 3'd7;else if (din[6]) code = 3'd6;else if (din[5]) code = 3'd5;else if (din[4]) code = 3'd4;else if (din[3]) code = 3'd3;else if (din[2]) code = 3'd2;else if (din[1]) code = 3'd1;else code = 3'd0;endfunctionassign dout = code(din); //函数调用endmodule【例9.9】七段数码管译码器module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0);output a,b,c,d,e,f,g;input D3,D2,D1,D0; //输入的4位BCD码reg a,b,c,d,e,f,g;always @(D3 or D2 or D1 or D0)begincase({D3,D2,D1,D0}) //用case语句进行译码4'd0: {a,b,c,d,e,f,g}=7'b1111110;4'd1: {a,b,c,d,e,f,g}=7'b0110000;4'd2: {a,b,c,d,e,f,g}=7'b1101101;4'd3: {a,b,c,d,e,f,g}=7'b1111001;4'd4: {a,b,c,d,e,f,g}=7'b0110011;4'd5: {a,b,c,d,e,f,g}=7'b1011011;- 34 -。

数电-课程设计-60进制计数器

数电-课程设计-60进制计数器

表1 十进制计数器功能表CP RD` LD` EP ET 工作状态×0 ××置零↑ 1 0 ××预置数× 1 1 0 1 保持× 1 1 ×0 保持↑ 1 1 1 1 计数连接方式如图:图2 十进制计数器(个位)2、十进制计数器(十位)电路图3 十进制计数器(十位)3、时钟脉冲电路图4 时钟脉冲电路4、置数电路图5 置数电路5、进位电路图6 进位电路6、译码显示电路图7 译码显示电路三、绘制原理图1、完整原理图图7 计数器原理图2、选定仪器列表仪器名称型号数量用途同步十进制计数器74LS160 2片极联构成60进制计数器与门与非门非门74LS21D74LS00D74LS04D各1个辅助设计构成其他计数器共阴极显示器DCD-HEX 2只显示数字计数电压源1个提供脉冲电压表二原理图仪器列表四、测试方案测试步骤:1)进入Multisim7界面图8 软件页面2)右击空白处,选择放置元件,进入元器件选择区,选择要放置的元件,然后单击好。

图9 放置元件3)放置好各种器件之后,即可进行线路连接,同时标明所需参数值。

设置元器件的参数时,用鼠标双击,弹出属性对话框,分别给元件赋值,并设置名称标号。

图10 元器件属性图4)确认电路无误后,即可单击仿真按钮,实现对电路的仿真工作。

5)观察结果看是否与理论分析的预测结果相同。

五、测试验证结果与分析1、验证结果以下两个仿真结果分别是计数器计数的仿真起点00和仿真终点59,之后计数器会自动恢复原来的00起点继续进行循环计数,并且进位输出灯会在59时发光。

图11 60进制计数器起点00 图12 60进制计数器终点592、理论分析本计数器由两个10进制计数器构成60进制计数器的接线图,右边的10进制计数器作为个位,左边的10进制计数器作为十位。

输入端全部接地,计数开始循环一周后通过置位法自动进行归00,之后再继续循环计数。

基于Verilog的任意模长可加减计数器设计

基于Verilog的任意模长可加减计数器设计

基于Verilog 的任意模长可加减计数器设计一、设计要求计数器是一种在时钟的触发下,完成计数功能的时序逻辑电路,输出结果由输入时钟和计数器上一状态的计数共同决定。

本设计要求实现的计数器,具有以下功能:(1)要求实现计数器工作状态的控制;(2)要求实现计数器的异步清零功能;(3)要求实现计数器递增和递减的功能;(4)要求实现计数器的计数范围(模长)任意改变;二、设计思路计数器工作状态的控制,可以设计一个使能端,在外部时钟的触发下,只有当使能端信号有效(高电平),才启动计数器的计数功能(递增或递减),否则计数器输出结果不变。

计数器的异步清零功能,可以设计一个外部输入的清零端,在外部输入信号有效(低电平)的情况下,直接清零计数器,不用等待下一个外部时钟的触发,即计数器的清零是异步的。

计数器计数方向的控制,设计一个加减可控的信号端口,在时钟的触发、异步清零无效以及计数器使能端有效的情况下,该输入端为高电平则计数器完成递增功能,低电平则完成递减功能。

实现计数器的任意模长,即进入下一个计数周期,其计数的最大值可以发生变化。

设计一个4位(最大模长为16)的输入端口,可以在当前计数周期结束,即计数器产生一个溢出信号的同时,判断该端口输入的信号是否发生变化,通过相邻两个计数周期的端口数据作异或运算,结果为高电平则代表模长发生变化,即进入的下一个计数周期,其计数最大值要发生变化。

三、程序设计本次设计使用的是Quartus 11.0开发环境,该软件没有自带仿真功能(9.0版本以后都没自带),需要使用第三方的Modelsim软件,故本设计的程序包括计数器的Verilog设计以及仿真测试需要的testbench激励文件两部分。

计数器的Verilog设计:module Prj(clk,rst_input,en,add_sub,data_input,full,data_output);input clk; // 外部时钟input rst_input; // 外部清零(异步)input en; // 计数使能input add_sub; // 计数方向input [3:0] data_input; // 计数器模长输入output reg full; // 计完当前模长output [3:0] data_output; // 计数器输出reg [3:0] current_counter;// 当前计数值(输出)reg update_length_en; // 改变模长的使能信号// 当前计数周期与上个计数周期的模长输入reg [3:0] current_clk_data_input,last_clk_data_in put;reg [3:0] counter_length; // 下个计数周期的模长reg [1:0] k;always @(posedge clk,negedge rst_input) beginif(!rst_input) // 异步清零beginfull=0;current_counter=0;endelse if(en) // 计数使能beginif(add_sub) // 加法器beginif(current_counter<(counter_length-1))begincurrent_counter=current_counter+1;full=0;endelse// 加法器计数完产生full脉冲以触发// 判断下个计数周期的模长是否变化begincurrent_counter=0;full=1; //full输出endendelse // 减法器beginif(current_counter>0)begincurrent_counter=current_counter-1;full=0;endelse // 减法器计数完begincurrent_counter=counter_length-1;full=1;endendendend//驱动当前计数输出assign data_output=current_counter;initialbegink=1; // k=1 表示启动计数器的第一个计数周期endalways @(posedge full) // 加法器/减法器完成当前周期计数// 计完当前周期(即full有效)才更新beginlast_clk_data_input<=data_input; // 上个周期的模长current_clk_data_input=data_input;//当前周期的模长update_length_en<=last_clk_data_input^current_clk_data_input;// update_length_en为更新计数器模长的使能端,// 异或运算使能端为0代表模长变化 1不变k=k+1; // k的初值为1,k变化说明计数模长更改过了if(k==2'd3)k=2;endalways @(posedge clk)beginif(update_length_en) // 使能有效计数模长变化counter_length=current_clk_data_input;elsebeginif(k>=2)// 下个周期计数器模长不变(保持上次更改的)counter_length=last_clk_data_input;if(k==1)// 整个计数器系统,最初的模长(一次没更改过)counter_length=data_input;endendendmodule测试激励文件testbench:`timescale 1 ps/ 1 psmodule Prj_vlg_tst();reg add_sub;reg clk;reg [3:0] data_input;reg en;reg rst_input;wire [3:0] data_output;wire full;Prj i1 (.add_sub(add_sub),.clk(clk),.data_input(data_input),.data_output(data_output),.en(en),.full(full),.rst_input(rst_input));parameter clk_period=10; // 时钟周期initial // 初始化使能端、清零端和时钟信号beginen=1;rst_input=1;clk=1;#(46*clk_period) en=0;#(3*clk_period) en=1;#(4*clk_period) rst_input=0;#(2*clk_period) rst_input=1;endalways #(clk_period/2) clk=~clk;initialbegin// 计数器模长分别为6 4 5 3// 左边为上一模长持续的时钟个数data_input=4'b0110;#(22*clk_period) data_input=4'b0100;#(12*clk_period) data_input=4'b0101;#(12*clk_period) data_input=4'b0011;#(5*clk_period);endinitialbegin// 计数器计数方向的改变// 左边为递增递减持续的时钟个数add_sub=1;#(9*clk_period) add_sub=0;#(10*clk_period) add_sub=1;#(13*clk_period) add_sub=0;#(4*clk_period) add_sub=1;endendmodule四、仿真结果如图1所示,最开始计数器输入的模长data_input为6,在计数方向控制端add_sub为高电平的情况下,可以从0计数到5,在add_sub为低电平的情况下,可以实现计数器的递减;当计数器模长data_input变为4的时候,先计完当前周期的模长(0到5),才开始模长为4的计数(0到3)。

verilog计数器代码

verilog计数器代码

Verilog计数器代码1. 介绍计数器是数字电子电路中常见的组件之一,用于记录和显示特定事件的次数。

Verilog是一种硬件描述语言,可用于设计和模拟数字电路。

本文将介绍如何使用Verilog编写一个简单的计数器代码。

2. 计数器的基本原理计数器的基本原理是通过输入的时钟信号进行计数。

每当时钟信号的边沿到来时,计数器的值加1。

计数器可以根据需要进行设置,例如可以设置计数器的初始值、计数器的上限等。

3. Verilog计数器代码的编写下面是一个简单的Verilog计数器代码示例:module counter (input wire clk,input wire reset,output reg [7:0] count);always @(posedge clk or posedge reset) beginif (reset)count <= 0;elsecount <= count + 1;endendmodule代码中定义了一个名为counter的模块,该模块具有三个端口:clk、reset和count。

其中,clk为时钟信号输入端口,reset为复位信号输入端口,count为计数值输出端口。

always @(posedge clk or posedge reset)表示在时钟信号的上升沿或复位信号的上升沿时执行下面的代码块。

if (reset)表示当复位信号为高电平时,将计数器的值设置为0,否则将计数器的值加1。

4. 计数器的测试为了验证计数器的功能,我们可以编写一个简单的测试代码来模拟时钟信号和复位信号的变化。

下面是一个测试代码示例:module counter_tb;reg clk;reg reset;wire [7:0] count;counter uut (.clk(clk),.reset(reset),.count(count));always begin#5 clk = ~clk;endinitial beginclk = 0;reset = 0;#10 reset = 1;#20 reset = 0;#100 $finish;endendmodule测试代码中定义了一个名为counter_tb的测试模块。

六十进制计数器

六十进制计数器

实验五考核实验——六十进制计数
一、实验目的
1、了解可编程数字系统设计的流程
2、掌握Quartus II 软件的使用方法
3、掌握Quartus II 软件的使用方法
4、掌握Quartus II 软件的使用方法
二、实验设备
1、计算机:Quartus II 软件
2、掌握Quartus II 软件的使用方法
3、集成电路:74LS161,任意与非门等。

三、实验原理
1、74LS161:异步清零、同步置数四位二进制计数器
2、引脚定义
3、74LS161功能表
四、实验内容
1、实现60进制计数,计数器用74LS161(2片),其它器件任选
2、七段码显示00、01、02、03 、…、57、58、59
要求:
(1)用原理图输入方式完成
(2)给出仿真波形
(3)计数脉冲CLK接BUTTON0,计数结果接7段码HEX1和HEX0显示
五、实验结果
1、实验原理图:
2、实验波形仿真图
3、引脚分配图
六、实验心得
1、同步异步计数器区分:同步计数器的触发信号是同一个信号。

具体来说,每一级的触发器接的都是同一个CLK信号。

异步计数器的触发信号时不同的,例如第一集的输出Q'作为第二级的触发信号。

几进制的区分:看数据输出端得接线方法,当接线满足拿个计数时会导致“清零”端或者是“置数端”满足工作状态。

2、异步计数器中第二级如果采用置数法,就需要置数的时候给该级提供相应的时钟信号,否则不能完成置数。

60进制计数器verilog设计代码

60进制计数器verilog设计代码
60进制计数器 verilog设计代码
module count60(Clk,Rst,Display,Sel); input Clk; //产生10KHZ时钟输入 input Rst; // 复位输入 output[2:0] Sel; //七段码管扫描驱动 output[6:0] Display; // 七段码管显示输出
always@(posedge Clk) begin if(Clk_Count1==900) //对计数器进行判断,以确定Clk_1HZ 信号是否反转 begin Clk_Count1<=0; Clk_1HZ<=~Clk_1HZ; end else Clk_Count1<=Clk_Count1+1; end always@(posedge Clk_1HZ or negedge Rst) if(!Rst) // 系统复位 begin SECL<=0; SECH<=0; MINL<=0; MINH<=0; Count2=0; end else begin if(SECL==9) //一般运行状态 begin SECL<=0; if(SECH==5) begin SECH<=0; if(MINL==9) begin MINL<=0; if(MINH==5) begin MINH<=0;
reg[2:0] Sel; reg[6:0] Display;
reg[13:0]Clk_Count1; // 产生 1Hz 时钟的分频计数器 reg[13:0]Count2; // reg Clk_1HZ; reg[3:0] SECL,SECH; reg[3:0] MINL,MINH; reg[3:0] Disp_Temp;
end else MINH<=MINH+1; end else MINL<=MINL+1; end else SECH<=SECH+1; end else SECL<=SECL+1; end always@(posedge Clk)

数电课程设计(60进制计数器设计)

数电课程设计(60进制计数器设计)

目录摘要: (2)1设计题目 (2)1.1设计要求 (2)2题目分析 (2)3设计思路与原理 (3)3.1 LED简介 (3)3.2 芯片74290及六十进制计数器的设计 (4)3.3 三十九进制计数器 (6)4电路图的仿真 (7)4.1六十进制计数器的仿真 (7)4.2三十九进制计数器的仿真 (8)5仪器列表 (9)6心得体会 (9)7参考文献 (10)摘要:要获得N进制计数器,常用的方法有两种:一是用时钟触发器和门电路来设计:二是用集成计数器来构成。

当要得到一些进制数大的计数器时,用时钟触发器和门电路来实现就显的很复杂。

我们就可以用集成计数器来构成,当然集成计数器是厂家已定型的产品,其函数关系已被固化在芯片中,状态分配以及编码我们自己是不可以更改的,而且多为纯自然态序编码,因而利用清零端或置数控制端,让电路跳过某些状态而获得N进制的计数器。

1设计题目60进制计数器的设计1.1设计要求(1)要求学生掌握74系列的芯片和LED的原理和使用方法。

(2)熟悉集成电路的使用方法,能够运用所学的知识设计一规定的电路。

1.2设计任务(1)完成一个60进制的计数器。

(2)LED显示从00开始,各位计数从0—9,逢10 进1,是为计数0—5。

59显示后,又从00重新开始计数。

2题目分析要实现60进制的计数器,单用一片计数器无法实现,我们可以利用级联方式获得大容量的N进制计数器,60进制的计数器就可以由六进制和十进制计数器级联起来构成。

CP 3设计思路与原理 3.1 LED 简介LED 是一种显示字段的显示器件,7个发光二极管构成七笔字形“8”,一个发光二极管构成小数点。

七段发光管分别称为a 、b 、c 、d 、e 、f ,g ,构成字型“8”,如图(a )所示,当在某段发光二极管上施加一定的电压时,某些段被点亮发光。

不加电压则变暗,为了保护各段LED 不被损坏,需外加限流电阻。

信号源 计数器数码显示器十进制计数器(个位)六进制计数器(十位)其真值表如下。

60进制计数器

60进制计数器

题目60计数器60进制计数器主要内容:利用QuartusII设计一个六十进制计数器。

该电路是采用整体置数法接成的六十进制计数器。

首先需要两片74160接成一百进制的计数器,然后将电路的60状态译码产生LD′=0信号,同时加到两片74160上,在下一个计数脉冲(第60个计数脉冲)到达时,从而得到六十进制计数器。

主要要求如下:(1)每隔1个周期脉冲,计数器增1;(2)当计数器递增到60时,进位端波形发生跳变,说明计数器产生进位信号,之后计数器会自动返回到00并重新计数;(3)本设计主要设备是两片74160同步十进制计数器,时钟信号通过建立波形文件得以提供。

1方案选择与电路原理图的设计使用具有一定频率的时钟信号作为计数器的时钟脉冲作为同步控制信号,整体电路通过两片74160与其他门电路辅助等单元电路构成以实现置数进位功能。

图2.1为六十进制计数器的总体电路原理框图。

图1.1 电路原理框图1.1单元电路一:十进制计数器电路(个位)本电路采用74160作为十进制计数器,它是一个具有异步清零、同步置数、可以保持状态不变的十进制上升沿计数器。

每输入10个计数脉冲,计数器便工作一个循环,并且在进位端RCO产生一个进位输出信号。

其功能表如表2-1所示,连接方式如图2.2所示。

此片工作时进位端RCO在没有进位时RCO=0,因此第二片ENP·ENT=0,第二片不工作。

表2-1 同步十进制计数器功能表在新建好的block文件的图形编辑窗口中双击鼠标,或点击图中“符号工具”按钮,或者选择菜单Edit下的Insert Symbol命令,即可对元件进行选择。

选择元件库中的ot hers—maxplus2—74160。

点击工具栏中Orthogonal Node Tool按钮便可以对端子间进行连线,其中值得注意的是,点击工具栏中Orthogonal Bus Tool按钮可以通过总线进行连接。

1.2 单元电路二:十进制计数器(十位)本电路同样采用74160作为十进制计数器,如图2.3所示。

verilog模六十计数器设计

verilog模六十计数器设计
end
endmodule
子模块 1:
module frequency1000( input cp, output reg cp1
); reg [15:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=16'b1100001101001111)//50000-1,把 50MHz 分频为 1000Hz begin cp1<=~cp1;
性能测试: 用电子表测量系统从 00 显示到 59,再到 00 的时间,确实为 30 秒(计数信号为 2Hz), 性能上达到要求。
七、 系统设计开发步骤与过程
1、 明确设计要求与拥有的资源; 2、 设计原理图; 3、 编写代码; 4、 仿真; 5、 修改代码后,重复步骤 4、5,直到仿真结果无误为止; 6、 将代码写入开发板,进行性能与功能测试; 7、 修改代码后,重复步骤 4、5、6、7,直到性能与功能都达到要求为止; 8、 撰写系统说明书与报告。
); reg [24:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=25'b1011111010111100000111111)//25000000-1,把 50MHz 分
频为 2Hz begin cp0<=~cp0; cnt<={25{1'b0}}; end
endmodule
子模块 3:
module cnt6( input tc, input cr, output reg [3:0]q6=0 ); always@(posedge tc or negedge cr) begin if(~cr) q6<=4'b0000; else if(q6>=4'b0101) q6<=4'b0000;

60进制计数器课程设计

60进制计数器课程设计

60进制计数器设计 (1)绪论 (1)1.1设计背景 (1)1.2设计思想 (1)2器件介绍 (2)2.1电阻 (2)2.2电容 (3)2.3 555秒发生器 (3)2.4 74ls00 (5)2.574ls90 (6)2.674ls48 (7)3软件仿真 (8)3.1 555仿真图 (8)3.2 60进制仿真图 (9)3.3 仿真图 (9)4焊接方法 (11)4.1焊接方法 (11)4.2 注意事项 (12)4.3调试 (12)4.4实际图 (13)5总结 (14)6致谢 (16)7 参考文件 (17)60进制计数器设计摘要:60进制计数器的设计是以数电和模电为基础,结合模电里面的置零方法,利用了555芯片、74ls00、74ls48、74ls90以及显示管和各种电阻电容组成的。

利用74ls90可以实现制数功能,可以单独制成十进制。

利用74ls00(与非门)与74ls90可以制成6进制,再利用74ls48和显示管就可以在基于EWB的软件平台上完成该设计。

本设计采用较为常用的74系列芯片,及555芯片实现了信号灯与信号脉冲同步实现、同步控制,进而提高了整个系统的稳定性、独立性。

在实际生活中我们用60进制的有钟表的秒分进制。

随着我国科学技术与高科技的发展,对于仪器精度的要求更加的高,为了满足中国高科技的发展需求研究高精度计数器对于我国的航天、电子等业务具有很大的作用.关键字:60进制555芯片74ls00 74ls48 74ls90绪论1.1设计背景计数器是一个用以实现计数功能的时序部件,它不仅可用来及脉冲数,还常用作数子系统的定时、分频和执行数字运算以及其它特定的逻辑功能。

目前,无论是TTL还是CMOS集成电路,都有品种较齐全的中规模集成计数器。

使用者只要借助于器件手册提供的功能和工作波形图以及引出端的排列,就能正确运用这些器件。

计数器在现代社会中用途中十分广泛,在工业生产、各种和记数有关电子产品。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# PlanAhead Generated physical constraints
NET "ce" LOC = P11; NET "cr" LOC = L3; NET "seg[0]" LOC = L14; NET "seg[1]" LOC = H12; NET "seg[2]" LOC = N14; NET "seg[3]" LOC = N11; NET "seg[4]" LOC = P12; NET "seg[5]" LOC = L13; NET "seg[6]" LOC = M12; NET "seg[7]" LOC = N13; NET "cs[0]" LOC = J12; NET "cs[1]" LOC = F12; NET "cs[2]" LOC = K14; NET "cs[3]" LOC = M13;
六、 系统功能与性能测试结果
功能测试: 1、 将 SW0 与 SW1 同时打到闭合,观察到数码管上显示每过 0.5 秒计一次数,到 59 后
回到 00,完成基本计数功能。 2、 将 SW0 与 SW1 同时打到闭合,在数码管上显示 05 时,将 SW0 断开,数码管上保
持显示 05,完成暂停功能。 3、 将 SW0 与 SW1 同时打到闭合,在数码管上显示 05 时,将 SW1 断开,观察到数码
模六十计数器设计 一、 系统设计实现目标要求
利用层次化方法在实验板上实现模六十计数, 即 0—1—2—3—4—……—9—10 —……—59—0—1……,并在 Basys2 实验板的 AN1 与 AN0 上显示。
二、 设计原理
顶层模块图如图 1 所示,子模块图如图 2 所示。
图1
图2 frequency2 模块将 50MHz 分频为 2Hz,作为计数器的计数脉冲。frequency1000 模块将 50MHz 分频为 1000Hz,用于分别轮换点亮两个数码管。cnt10 为 10 进制计数器,一方 面作为点亮个位数码管的输入,另一方面得到 6 进制计数器的进位输入。cnt6 为 6 进制 计数器,作为点亮十位数码管的输入。slt 将 1000Hz 频率分给 cs[0]和 cs[1],作为两个 使能信号,用于分别轮换点亮两个数码管。selector 将 cnt10 和 cnt6 的输出端轮换送给 decoder,decoder 将计数器的数据译码,使之可以在数码管上显示。
endmodule
四、 管脚约束文件
#Created by Constraints Editor (xc3s100e-cp132-4) - 2013/12/05 NET "cp" TNM_NET = "cp"; TIMESPEC TS_cp = PERIOD "cp" 20 ns HIGH 50 %;
wire [3:0]q; selector U5( .q0(q6[3:0]),
2
.q1(q10[3:0]), .cs(cs[3:0]), .q(q[3:0]) );
decoder U6( .q(q[3:0]), .seg(seg[7:0]) );
endmodule
子模块 0:
module frequency2( input cp, output reg cp0
always@(*) begin
case(q) 4'h1:seg = 8'b11111001; 4'h2:seg = 8'b10100100; 4'h3:seg = 8'b10110000; 4'h4:seg = 8'b10011001; 4'h5:seg = 8'b10010010;
5
4'h6:seg = 8'b10000010; 4'h7:seg = 8'b11111000; 4'h8:seg = 8'b10000000; 4'h9:seg = 8'b10010000; 4'hA:seg = 8'b10001000; 4'hB:seg = 8'b10000011; 4'hC:seg = 8'b11000110; 4'hD:seg = 8'b10100001; 4'hE:seg = 8'b10000110; 4'hF:seg = 8'b10001110; default:seg = 8'b11000000; endcase end
); reg [24:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=25'b1011111010111100000111111)//25000000-1,把 50MHz 分
频为 2Hz begin cp0<=~cp0; cnt<={25{1'b0}}; end
NET "cp" LOC = B8;
6
五、 系统使用说明
拨码开关 SW1 为复位开关,拨码开关 SW0 为暂停开关,当 SW0 与 SW1 同时处于闭合 状态时,每过 0.5 秒计一次数,并在数码管上显示,到 59 后回到 00,重新计数。当 SW1 闭合,SW0 断开时,计数暂停。当 SW1 断开,无论 SW0 闭合还是断开,数码管始终显 示 00.当 SW1 闭合后,重新开始计数。
endmodule
子模块 5:
module selector( input [3:0]q0, input [3:0]q1, input [3:0]cs, output [3:0]q );
assign q=cs[0]?q1:q0;
endmodule
子模块 6:
module decoder( input [3:0]q, output reg odule cnt6( input tc, input cr, output reg [3:0]q6=0 ); always@(posedge tc or negedge cr) begin if(~cr) q6<=4'b0000; else if(q6>=4'b0101) q6<=4'b0000;
3
cnt<={16{1'b0}}; end end
endmodule
子模块 2:
module cnt10( input cp0, input ce, input cr, output reg tc, output reg [3:0]q10 ); always@(posedge cp0 or negedge cr) begin tc<=1'b0; if(~cr) q10<=4'b0000; else if(~ce) q10<=q10; else if(q10>=4'b1001) begin q10<=4'b0000; tc<=1'b1; end else q10<=q10+1'b1; end
性能测试: 用电子表测量系统从 00 显示到 59,再到 00 的时间,确实为 30 秒(计数信号为 2Hz), 性能上达到要求。
七、 系统设计开发步骤与过程
1、 明确设计要求与拥有的资源; 2、 设计原理图; 3、 编写代码; 4、 仿真; 5、 修改代码后,重复步骤 4、5,直到仿真结果无误为止; 6、 将代码写入开发板,进行性能与功能测试; 7、 修改代码后,重复步骤 4、5、6、7,直到性能与功能都达到要求为止; 8、 撰写系统说明书与报告。
end
endmodule
子模块 1:
module frequency1000( input cp, output reg cp1
); reg [15:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=16'b1100001101001111)//50000-1,把 50MHz 分频为 1000Hz begin cp1<=~cp1;
4
else q6<=q6+1'b1;
end
endmodule
子模块 4:
module slt( input cp1, output [3:0]cs ); assign cs[0]=cp1; assign cs[1]=~cp1; assign cs[2]=1'b1; assign cs[3]=1'b1;
三、 源程序
1
主模块:
module cnt_60( input cp,ce,cr, output [7:0]seg, output [3:0]cs
);
wire cp0; frequency2 U0( .cp(cp), .cp0(cp0) );
wire cp1; frequency1000 U1( .cp(cp), .cp1(cp1) );
八、 实验心得体会
这次实验从上学期的原理到这学期的实践,跨度稍有些大,因而显得很有挑战性。自己 在课下又自学了很多东西,才把问题基本解决。虽然耗时较大,但收获也较大。
7
wire tc; wire [3:0]q10; cnt10 U2( .cp0(cp0), .ce(ce), .cr(cr), .tc(tc), .q10(q10[3:0]) );
wire [3:0]q6; cnt6 U3( .tc(tc), .cr(cr), .q6(q6[3:0]) );
相关文档
最新文档