当前位置:文档之家› verilog数字系统设计教程第5章例题

verilog数字系统设计教程第5章例题

verilog数字系统设计教程第5章例题
verilog数字系统设计教程第5章例题

第五章例题

例如:if(a>b)

out1 = int1;

else

out1 = int2;

例如:always @( some_event) //虚的字体表示块语句

begin

if(a>b) out1 = int1;

else if (a==b) out1 = int2;

else out1 = int3;

end

if(a>b)

begin

out1<=int1;

out2<=int2;

end

else

begin

out1<=int2;

out2<=int1;

end

//有时begin_end块语句的不慎使用会改变逻辑行为。见下例:

if(index>0)

for(scani=0;scani

if(memory[scani]>0)

begin

$display("...");

memory[scani]=0;

end

else /*WRONG*/

$display("error-indexiszero");

尽管程序设计者把else写在与第一个if(外层if)同一列上,希望与第一个if对应,但实际上else是与第二个if对应,因为它们相距最近。正确的写法应当是这样的:if(index>0)

begin

for(scani=0;scani

if(memory[scani]>0)

begin

$display("...");

memory[scani]=0;

end

end

else /*WRONG*/

$display("error-indexiszero");

//定义寄存器和参数。

reg [31:0] instruction, segment_area[255:0];

reg [7:0] index;

reg [5:0] modify_seg1, modify_seg2, modify_seg3; parameter

segment1=0, inc_seg1=1,

segment2=20, inc_seg2=2,

segment3=64, inc_seg3=4,

data=128;

//检测寄存器index的值

if(index

begin

instruction = segment_area[index + modify_seg1];

index = index + inc_seg1;

end

else if(index

begin

instruction = segment_area[index + modify_seg2];

index = index + inc_seg2;

end

else if (index

begin

instruction = segment_area[index + modify_seg3];

index = index + inc_seg3;

end

else

instruction = segment_area[index];

reg [15:0] rega;

reg [9:0] result;

case(rega)

16 'd0: result = 10 'b0111111111;

16 'd1: result = 10 'b1011111111;

16 'd2: result = 10 'b1101111111;

16 'd3: result = 10 'b1110111111;

16 'd4: result = 10 'b1111011111;

16 'd5: result = 10 'b1111101111;

16 'd6: result = 10 'b1111110111;

16 'd7: result = 10 'b1111111011;

16 'd8: result = 10 'b1111111101;

16 'd9: result = 10 'b1111111110;

default: result =10 'bx;

endcase

[例1]:

case ( select[1:2] )

2 'b00: result = 0;

2 'b01: result = flaga;

2 'b0x,

2 'b0z: result = flaga? 'bx : 0;

2 'b10: result = flagb;

2 'bx0,

2 'bz0: result = flagb? 'bx : 0;

default: result = 'bx;

endcase

[例2]:

case(sig)

1 'bz: $display("signal is floating");

1 'bx: $display("signal is unknown");

default: $display("signal is %b", sig);

endcase

[例3]: reg[7:0] ir;

casez(ir)

8 'b1???????: instruction1(ir);

8 'b01??????: instruction2(ir);

8 'b00010???: instruction3(ir);

8 'b000001??: instruction4(ir);

endcase

[例4]: reg[7:0] r, mask;

mask = 8'bx0x0x0x0;

casex(r^mask)

8 'b001100xx: stat1;

8 'b1100xx00: stat2;

8 'b00xx0011: stat3;

8 'bxx001100: stat4;

endcase

例:

always @ (al or d ) // 有锁存器

begin

if ( al ) q = d;

end

always @ (al or d ) // 无锁存器

begin

if ( al ) q = d;

else q = 0;

end

[例5]:条件语句举例

//第一类条件语句

if ( !lock ) buffer = data ;

if ( enable ) out = in ;

//第二类条件语句

if (number_queued < MAX_Q_DEPTH)

begin

data_queue = data ;

number_queued = number_queued + 1 ;

end

else

$display ( " Queue Full. Try again " ) ;

//第三类条件语句

//根据不同的算术逻辑单元的控制信号alu_control 执行不同的算术运算操作if ( alu_control = = 0 )

y = x + z ;

else if ( alu_control = = 1 )

y = x - z ;

else if ( alu_control = = 2 )

y = x * z ;

else

$ display ( " Invalid ALU control signal ");

reg [ 1: 0] alu_control ;

...

...

case (alu_control)

2 'd 0 : y = x + z ;

2 'd 1 : y = x - z ;

2 'd 2 : y = x * z ;

default : $display ( "Invalid ALU control signal ") ;

endcase

[例6]:使用case语句实现四选一多路选择器

module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);

// 根据输入/输出图的端口声明

output out;

input i0, i1, i2, i3;

input s1, s0;

//把输出变量声明为寄存器类型

reg out;

//任何输入信号改变,都会引起输出信号的重新计算

//使输出out 重新计算的所有输入信号必须写入always @(...)的变量列表中

always @(s1 or s0 or i0 or i1 or i2 or i3)

begin

case ({s1, s0})

2'b00: out = i0;

2'b01: out = i1;

2'b10: out = i2;

2'b11: out = i3;

default: out = 1'bx;

endcase

end

endmodule

parameter size=8,longsize=16;

reg [size:1] opa, opb;

reg [longsize:1] result;

begin: mult

reg [longsize:1] shift_opa, shift_opb;

shift_opa = opa;

shift_opb = opb;

result = 0;

repeat(size)

begin

if(shift_opb[1])

result = result + shift_opa;

shift_opa = shift_opa <<1;

shift_opb = shift_opb >>1;

end

end

begin: count1s

reg[7:0] tempreg;

count=0;

tempreg = rega;

while(tempreg)

begin

if(tempreg[0]) count = count + 1;

tempreg = tempreg>>1;

end

end

[例7]:begin: init_mem

reg[7:0] tempi;

for(tempi=0;tempi

memory[tempi]=0;

end

[例8]:parameter size = 8, longsize = 16;

reg[size:1] opa, opb;

reg[longsize:1] result;

begin:mult

integer bindex;

result=0;

for( bindex=1; bindex<=size; bindex=bindex+1 )

if(opb[bindex])

result = result + (opa<<(bindex-1));

end

/*在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个八位二进制数中值为1的位进行计数的另一种方法。见下例:*/

begin: count1s

reg[7:0] tempreg;

count=0;

for( tempreg=rega; tempreg; tempreg=tempreg>>1 )

if(tempreg[0])

count=count+1;

end

[例9] 顺序块

//说明1

reg x, y;

reg [1:0] z, w;

initial

begin

x = 1'b0;

y = 1'b1;

z = {x, y};

w = {y, x};

end

//说明2: 带延迟的顺序块

reg x, y;

reg [1:0] z, w;

initial

begin

x = 1'b0; //在仿真时刻0 完成

#5 y = 1'b1; //在仿真时刻5 完成

#10 z = {x, y}; // 在仿真时刻15 完成

#20 w = {y, x}; // 在仿真时刻35 完成

end

[例10] 并行块

//举例1: 带延迟的并行块

reg x, y;

reg [1:0] z, w;

initial

fork

x = 1'b0; // 在仿真时刻0 完成

#5 y = 1'b1; // 在仿真时刻5 完成

#10 z = {x, y}; // 在仿真时刻10 完成

#20 w = {y, x}; // 在仿真时刻20 完成

join

//故意引入竞争条件的并行块

reg x, y;

reg [1:0] z, w;

initial

fork

x = 1'b0;

y = 1'b1;

z = {x, y};

w = {y, x};

join

我们可以将并行块的关键字fork看成是将一个执行流分成多个独立的执行流;而关键字join 则是将多个独立的执行流合并为一个执行流。每个独立的执行流之间是并发执行的。

[例11]嵌套块

//嵌套块

initial

begin

x = 1'b0;

fork

#5 y = 1'b1;

#10 z = {x, y};

join

#20 w = {y, x};

end

endmodule

[例12]命名块

//命名块

module top ;

initial

begin : block1 //名字为block1的顺序命名块

integer i ; //整型变量i 是block1命名块的静态本地变量

//可以用层次名top.block1.i 被其他模块访问

...

...

end

initial

fork : block2 //名字为block2的并行命名块

reg i ; //寄存器变量i 是block2命名块的静态本地变量

//可以用层次名top.block2.i 被其他模块访问

...

...

join

[例13]命名块的禁用

//在(矢量)标志寄存器的各个位中从低有效位开始找寻第一个值为1的位

//从矢量标志寄存器的低有效位开始查找第一个值为1的位

reg [15:0] flag;

integer i; //用于计数的整数

initial

begin

flag = 16'b 0010_0000_0000_0000;

i = 0;

begin: block1 //while循环声明中的主模块是命名块block1

while(i < 16)

begin

if (flag[i])

begin

$display("Encountered a TRUE bit at element number %d", i);

disable block1; // 在标志寄存器中找到了值为真(1)的位,禁用block1 end

i = i + 1;

end

end

end

[例14]对两个N位总线变量进行按位异或

//本模块生成两条N位总线变量的按位异或

module bitwise_xor ( out , i0 , i1 ) ;

//参数声明语句。参数可以重新定义

parameter N = 32 ; // 缺省的总线位宽为32位

//端口声明语句

output [ N-1 : 0 ] out ;

input [ N-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块来替代

// reg [ N-1 : 0] out ;

// generate

// for ( j = 0 ; j < N ; j = j + 1 )

// begin : bit

// always @ ( i0 [ j ] or i1 [ j ] ) out [ j ] = i0 [ j ] ^ i0 [ j ] ; // end

// endgenerate

endmodule

[例15]用循环生成语句描述的脉动加法器

//本模块生成一个门级脉动加法器

module ripple_adder ( co , sum , a0 , a1 , ci ) ;

//参数声明语句,参数可以重新定义。

parameter N = 4 ; // 缺省的总线位宽为4

//端口声明语句

output [ N-1 : 0 ] sum ;

output co ;

input [N-1 : 0 ] a0 , a1 ;

input ci ;

//本地线网声明语句

wire [N-1 : 0 ] carry ;

//指定进位变量的第0位等于进位的输入

assign carry [0] = ci ;

//声明临时循环变量。该变量只用于生成块的计算。

//由于在仿真前,循环生成已经展平,所以用Verilog对

//设计进行仿真时,该变量已经不再存在。

genvar i ;

//用一个单循环生成按位异或门等逻辑

generate for ( i = 0 ; i < N ; i = i + 1 ) begin : r_loop

wire t1 , t2 , t3 ;

xor g1 ( t1 , a0[ i ] , a1 [ i ] ) ;

xor g2 ( sum [ i ] , t1 , carry [ i ] ) ;

and g3 ( t2 , a0[ i ] , a1 [ i ] ) ;

and g4 ( t3 , t1 , carry [ i ] ) ;

or g5 (carry [ i + 1 ] , t2 , t3 ) ;

end // 生成块内部循环的结束

endgenerate //生成块的结束

// 根据上面的循环生成,V erilog编译器会自动生成以下相对层次实例名

// xor : r_loop[0].g1 , r_loop[1].g1 , r_loop[2].g1 , r_loop[3].g1 ,

// r_loop[0].g2 , r_loop[1].g2 , r_loop[2].g2 , r_loop[3].g2 ,

// and : r_loop[0].g3 , r_loop[1].g3 , r_loop[2].g3 , r_loop[3].g3 ,

// r_loop[0].g4 , r_loop[1].g4 , r_loop[2].g4 , r_loop[3].g4 ,

// or : r_loop[0].g5 , r_loop[1].g5 , r_loop[2].g5 , r_loop[3].g5

// 上面生成的实例用下面这些生成的线网连接起来

// Nets : r_loop[0].t1 , r_loop[0].t2 , r_loop[0].t3

// r_loop[1].t1 , r_loop[1].t2 , r_loop[1].t3

// r_loop[2].t1 , r_loop[2].t2 , r_loop[2].t3

// r_loop[3].t1 , r_loop[3].t2 , r_loop[3].t3

assign co = carry [ N ] ;

endmodule

[例16]使用条件生成语句实现参数化乘法器

// 本模块实现一个参数化乘法器

module multiplier ( product , a0 , a1 ) ;

//参数声明,该参数可以重新定义

parameter a0_width = 8 ;

parameter a1_width = 8 ;

//本地参数声明

//本地参数不能用参数重新定义(defparam)修改,

//也不能在实例引用时通过传递参数语句,即#(参数1,参数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_width ) m0 ( product , a0 , a1 ) ;

else

tree_multiplier # ( a0_width , a1_width ) m0 ( product , a0 , a1 ) ;

endgenerate //生成块的结束

endmodule

[例17] CASE生成语句举例

//本模块生成N位的加法器

module adder ( co , sum , a0 , a1 , ci );

//参数声明,本参数可以重新定义

parameter N = 4 ; // 缺省的总线位宽为4

//端口声明

output [ N-1 : 0 ] sum ;

output co ;

input [ N-1 : 0 ] a0 , a1 ;

input ci ;

// 根据总线的位宽,调用(实例引用)相应的加法器

// 参数N在调用(实例引用)时可以重新定义,调用(实例引用)

// 不同位宽的加法器是根据不同的N来决定的。

generate

case ( N )

// 当N=1, 或2 时分别选用位宽为1位或2位的加法器

1 : adder_1bit adder1 ( co , sum , a0 , a1 , ci ) ; // 1位的加法器

2 : adder_2bit adder2 ( co , sum , a0 , a1 , ci ) ; // 2位的加法器

// 缺省的情况下选用位宽为N位的超前进位加法器

default : adder_cla # ( N ) adder3 ( co , sum , a0 , a1 , ci ) ;

endcase

endgenerate //生成块的结束

endmodule

[例18] 行为级描述的四选一多路选择器

// 四选一多路器,其端口列表完全根据输入/输出图编写

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 or s0 or i0 or i1 or i2 or i3)

begin

case ({s1, s0})

2'b00: out = i0;

2'b01: out = i1;

2'b10: out = i2;

2'b11: out = i3;

default: out = 1'bx;

endcase

end

endmodule

[例19]四位计数器的行为级描述

//四位二进制计数器

module counter ( Q , clock, clear );

// 输入/输出端口

output [3:0] Q;

input clock, clear;

// 输出变量Q被定义为寄存器类型

reg [3:0] Q;

always @( posedge clear or negedge clock)

begin

if (clear)

Q <= 4'd0 ; //为了能生成诸如触发器一类的时序逻辑,建议使用非阻塞赋值。

else

Q <= Q + 1 ; //Q是一个四位的寄存器,计数超过15后又会归零, 因此模16没有必要。end

endmodule

initial

begin

a = 1 'b0 ;

b = #10 1'b0 ;

c = #5 1'b0 ;

d = #20 { a , b , c } ;

end

initial

begin

b = 1 'b1 ;

c = 1 'b0 ;

#10 b = 1'b0 ;

end

initial

begin

d = # 25 ( b | c ) ; end

initial

begin

x = 1 'b0 ;

#5 y = 1 'b1 ;

fork

#20 a = x ;

#15 b = y ;

join

# 40 x = 1 'b1 ;

fork

#10 p = x ;

begin

#10 a = y ;

#30 b = x ;

end

#5 m = y ;

join

end

数字系统设计与verilog HDL课程设计

数字系统设计与verilog HDL课程设计 设计题目:实用多功能数字钟 专业:电子信息科学与技术 班级:0313410 学号:031341025 姓名:杨存智 指导老师:黄双林

摘要 本课程设计利用QuartusII软件Verilog VHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。 单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。 关键字:多功能数字钟、Verilog、模块、调试、仿真、功能

目录 1.课程设计的目的及任务............................................................. 错误!未定义书签。 1.1 课程设计的目的 (3) 1.2 课程设计的任务与要求 (4) 2.课程设计思路及其原理 (4) 3.QuartusII软件的应用 (5) 3.1工程建立及存盘 (5) 3.2工程项目的编译 (5) 3.3时序仿真 (6) 4.分模块设计、调试、仿真与结果分析 (7) 4.1 clk50mto1时钟分频模块 (7) 4.2 adder加法器模块 (7) 4.3 hexcounter16 进制计数器模块 (7) 4.4 counter_time 计时模块 (8) 4.5 alarm闹铃模块 (8) 4.6 sound_ddd嘀嘀嘀闹铃声模块 (9) 4.7 sound_ddd_du嘀嘀嘀—嘟声音模块 (9) 4.8 alarm_time闹钟时间设定模块 (10) 4.9 bitsel将输出解码成时分秒选择模块 (10) 4.10 switch去抖模块 (11) 4.11 led译码显示模块 (11) 4.12 clock顶层模块 (12) 5.实验总结 (13) 5.1调试中遇到的问题及解决的方法 (13) 5.2实验中积累的经验 (14) 5.3心得体会 (14) 6.参考文献 (14) 1.1 课程设计的目的 通过课程设计的锻炼,要求学生掌握V erilog HDL语言的一般设计方法,掌握VerilogHDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的

verilog数字系统设计教程习题答案

verilog 数字系统设计教程习题答案第二章 HDL 既是一种行为描述语言,也是一种结构描述语言。如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互联的结构模块。这意味着利用Verilog 语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。 2.模块的基本结构由关键词module和endmodule构成。 3.一个复杂电路系统的完整Verilog HDL 模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 HDL和VHDL乍为描述硬件电路设计的语言,其共同的特点在于:能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用。 5.不是

6.将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。 7.综合工具可以把HDL变成门级网表。这方面Synopsys工具占有较大的优势,它的Design Compile 是作为一个综合的工业标准,它还有另外一个产品叫Behavior Compiler ,可以提供更高级的综合。 另外最近美国又出了一个软件叫Ambit ,据说比Synopsys 的软件更有效,可以综合50万门的电路,速度更快。今年初Ambit 被Cadence 公司收购,为此Cade nee放弃了它原来的综合软件Syn ergy。随着FPGA 设计的规模越来越大,各EDA公司又开发了用于FPGA设计的综合软件,比较有名的有:Sy nopsys 的FPGAExpress,Cade nee 的Syn plity ,Mentor的Leonardo,这三家的FPGA综合软件占了市场的绝大部分。 8.整个综合过程就是将设计者在EDA平台上编辑输入的HDL文本、原理图或状态图形描述,依据给定的硬件结构组件和约束控制条件 进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述网表文件。用于适配,适配将由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件,如JEDEC Jam格式的 文件 9.在FPGA设计中,仿真一般分为功能仿真(前仿真)和时序仿真(后仿真)。功能仿真又叫逻辑仿真,是指在不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证;而时序仿真是在布局布线后进行,它与

#用Verilog语言编写的多功能数字钟

2009—2010学年第二学期 《数字电子技术课程设计》报告 专业班级:电气-08-1 姓名:曹操 学号:08051127 设计日期:2010年8月23日~27日 一.设计题目 多功能数字钟电路设计 二.设计任务及要求 多功能数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23时。 在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD 码)显示个位,对于小时因为他的范围是从0~23,所以可以用一个2位的二进制码显示十位,用一个4位的二进制码(BCD码)显示个位。

实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz 时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的1Hz 信号,必须对输入的系统时钟50Mhz进行分频。 对于整点报时功能,本实验设计的是当进行正点的倒计时5秒时,让LED来闪烁进行整点报时的提示。 调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。另外用S8按键作为系统时钟复位,复位后全部显示00—00—00。 管脚分配如下表: 端口名使用模块信号对应FPGA管脚说明 S1 按键开关S1 R16 调整小时 S2 按键开关S2 P14 调整分钟 RST 按键开关S8 M15 复位 LED LED模块D1 L14 整点倒计时 LEDAG0 数码管模块A段N4 时间显示 LEDAG1 数码管模块B段G4 LEDAG2 数码管模块C段H4 LEDAG3 数码管模块D段L5 LEDAG4 数码管模块E段L4 LEDAG5 数码管模块F段K4 LEDAG6 数码管模块G段K5 SEL0 数码管选择位1 M4 8个数码管

《verilog_数字系统设计课程》(第二版)思考题答案

Verilog数字系统设计教程思考题答案 绪论 1.什么是信号处理电路?它通常由哪两大部分组成? 信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应要求的电路。它通常有高速数据通道接口和高速算法电路两大部分组成。 2.为什么要设计专用的信号处理电路? 因为有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用处理器也无法在规定的时间内完成必要的运算。通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存储器中,然后在微处理器芯片控制下,按时钟的节拍,逐条取出指令分析指令和执行指令,直到程序的结束。微处理器芯片中的内部总线和运算部件也是为通用目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性也不可能为某一特殊的算法来设计一系列的专用的运算电路而且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因而其算法速度也受到限制所以要设计专用的信号处理电路。 3.什么是实时处理系统? 实时处理系统是具有实时响应的处理系统。 4.为什么要用硬件描述语言来设计复杂的算法逻辑电路? 因为现代复杂数字逻辑系统的设计都是借助于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。 5.能不能完全用C语言来代替硬件描述语言进行算法逻辑电路的设计? 不能,因为基础算法的描述和验证通常用C语言来做。如果要设计一个专用的电路来进行这种对速度有要求的实时数据处理,除了以上C语言外,还须编写硬件描述语言程序进行仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接口正确无误地交换数据。 6.为什么在算法逻辑电路的设计中需要用C语言和硬件描述语言配合使用来提 高设计效率? 首先C语言很灵活,查错功能强,还可以通过PLI编写自己的系统任务,并直接与硬件仿真器结合使用。C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比Verilog HDL更完整,此外,C语言有可靠地编译环境,语法完备,缺陷缺少,应用于许多的领域。比较起来,Verilog语言只是针对硬件描述的,在别处使用并不方便。而用Verilog的仿真,综合,查错等大部分软件都是商业软件,与C语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷。所以只有在C语言的配合使用下,Verilog才能更好地发挥作用。C 语言与Verilog HDL语言相辅相成,互相配合使用。这就是即利用C语言的完整性又要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的

数字电路时钟设计verilog语言编写--

电子线路设计与测试 实验报告 一、实验名称 多功能数字钟设计 二、实验目的 1.掌握可编程逻辑器件的应用开发技术 ——设计输入、编译、仿真和器件编程; 2.熟悉一种EDA软件使用; 3.掌握Verilog设计方法;

4.掌握分模块分层次的设计方法; 5.用Verilog完成一个多功能数字钟设计。 三、设计内容及要求 1.基本功能 具有“秒”、“分”、“时”计时功能,小时按24小时制计时。 具有校时功能,能对“分”和“小时”进行调整。 2.扩展功能 仿广播电台正点报时。在59分51秒、53秒、55秒、57秒发出低音512Hz 信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。 定时控制,其时间为23时58分。 3.选做内容 任意时刻闹钟(闹钟时间可设置)。 自动报整点时数。 四.系统框图与说明 数字钟框图

1.数字钟电路系统由主体电路和扩展电路两大部分所组成。 2.秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按照“24进制”规律计数。 3.计数器的输出经译码器送显示器。 五.设计步骤 1.列写多功能数字钟设计--层次结构图 2.拟定数字钟的组成框图,在Max+Plus II软件中,使用Verilog语言输入,采用分层次分模块的方法设计电路; 3.设计各单元电路并进行仿真; 4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合; 5.下载到Cyclone II FPGA实验平台上,实际测试数字钟的逻辑功能。

六.Verilog代码 //24进制时钟, 具有计时、校时、仿广播电台正点报时、固定时刻定时,任意时刻闹钟等功能 module clock_main(LED_Hour,LED_Minute,LED_Second,Alarm,CP_1KHz,Jsh_Min_key,Jsh_Hour_ke y,Set_Hour_key,Set_Min_key,Show,Ctrl_Bell); input CP_1KHz;//定义输入时钟 input Jsh_Min_key,Jsh_Hour_key;//定义校时按键 input Set_Hour_key,Set_Min_key;//定义闹钟定时按键 input Show; //定义显示模式按键 input Ctrl_Bell;//定义闹钟铃声控制 output [7:0]LED_Hour,LED_Minute,LED_Second;//定义输出变量 wire [7:0]LED_Hour,LED_Minute,LED_Second;//定义输出变量类型 wire [7:0]Hour,Minute,Second; wire [7:0]Set_Hour_Out,Set_Min_Out; wire Out_1Hz,Out_500Hz;//定义分频模块输出变量类型 reg Alarm_Ring,Alarm_Clock_1KHz;//定义仿广播电台报时和固定时刻定时铃声 output Alarm;//蜂鸣器输入 supply1Vdd; wire Alarm_Clock;//任意时刻闹钟闹铃 wire MinL_EN,MinH_EN,Hour_EN;//定义中间变量类型 //分频 fre_dividerFD0(Out_1Hz,Out_500Hz,Vdd,Vdd,CP_1KHz); //正常计时 counter10 U1(.Q(Second[3:0]),.nCR(Vdd),.EN(Vdd),.CP(Out_1Hz)); counter6 U2(.Q(Second[7:4]),.nCR(Vdd),.EN(Second[3:0]==4'h9),.CP(Out_1Hz)); assignMinL_EN=Jsh_Min_key?Vdd:(Second==8'h59); assign MinH_EN=(Jsh_Min_key&&(Minute[3:0]==4'h9))||(Minute[3:0]==4'h9)&&(Second==8'h59 ); counter10 U3(.Q(Minute[3:0]),.nCR(Vdd),.EN(MinL_EN),.CP(Out_1Hz)); counter6 U4(.Q(Minute[7:4]),.nCR(Vdd),.EN(MinH_EN),.CP(Out_1Hz)); assign Hour_EN=Jsh_Hour_key?Vdd:((Minute==8'h59)&&(Second==8'h59)); counter24 U5(Hour[7:4],Hour[3:0],Vdd,Hour_EN,Out_1Hz); //仿广播电台正点报时 baoshi BS1(Alarm_Ring,Minute,Second,Out_500Hz,CP_1KHz);//在59分51秒、53秒、55秒、57秒发出低音512Hz信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点 //固定时刻定时

基于verilog数字秒表的设计实现--生产实习报告

生产实习报告 班级:通信13-2班 姓名:闫振宇 学号:1306030222 成绩: 电子与信息工程学院 信息与通信工程系

基于verilog 数字秒表的设计实现 1. 概述 硬件描述语言HDL ( HardwareDescription Langyage) 是一种用形式化方法来描述数字电路和系统的语言。数字电路系统的设计这里用这种语言可以从上层倒下层逐层描述自设计思想用一系列分层的模块来表示极其复杂的数字系统,然后用EDA 工具逐层验证,把其中需要为具体物理电路的模块组合由自动综合工具转换到门级电路网表。Verilog HDL 是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。使用VERILOG 进行系统设计时采用的是从顶至下的设计,自顶向下的设计是从系统机开始巴西同划分为若干个基本单元,然后再把每个单元划分为下一层的基本单元,这样下去直到可以直接用EDA 元件库中的基本元件来实现为止。 2. 设计目的及要求 a. 有源晶振频率:50MHZ ; b. 测试计时范围:00' 00” 00 ~ 59 ',59显”示9的9 最长时间为59 分59 秒; c. 数字秒表的计时精度是10ms; d. 显示工作方式:六位BCD 七段数码管显示读数,两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)。 3. 设计原理秒表的逻辑结构较简单,它主要由四进制计数器、十六进制计数器、分频器、数据选择器、和显示译码器等组成。在整个秒表中最关键的是如何获得一个精确的100HZ 计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。 秒表有共有6个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有 6 个计数器与之相对应; 6 个计数器的输出全都为BCD 码输出,这样便与同显示译码器连接。 利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。所有数字逻辑功能都在CPLD 器件上用Verilog 语言实现。这样设计具有体积小,设计周期短,调试方 便,故障率地和修改升级容易等特点。 本设计采用依次采用以下设计方法: 1)按键输入缓存,键盘消抖设计;

多功能数字钟设计Verilog语言编写

多功能数字钟设计 院系:电光学院 班级:*** 学号: *** 姓名: *** 指导老师:*** 时间:2010.4.20.

摘要:利用QuartusII软件设计一个数字钟,利用模块化的程序设计思想,核心 模块均采用Verilog语言编写(译码显示模块采用原理图设计),软件仿真调试编译成功后,再下载到SmartSOPC实验系统中。经过硬件测试,查找软件设计缺陷,并进一步完善软件,最终设计得到较为满意的多功能数字钟。 关键词:QuartusII; 多功能数字钟; 模块化; Verilog; 可编程; Abstract:Using the QuartusII software design a digital bell with the blocking method.The design takes theory drawing instead of Verilog language.After emluating and debuging successfully,translate and edit the code.Then,download the result to the programmable SmartSOPC system and test it in hardware.Realizing the soul of designing hardware by software. Keywords:QuartusII; digital bell; blocking method; VHDL; programmable; hardware 目录 设计内容简介 (3) 设计要求说明 (3) 方案论证(整体电路设计原理) (3) 各子模块设计理 (5) 分频模块: (5) 计数模块: (7) --校准模块程序实现: (8) --秒计数模块程序实现: (9) --分计数模块程序实现: (10) --时计数模块程序实现: (10) 整点报时模块: (12) 闹钟设定模块: (13) --闹钟调节模块程序实现: (14) --输出信号选择模块程序实现: (14) 彩铃模块: (15) 译码显示模块: (18) 万年历模块: (19) --日计数模块程序设计: (20) --月计数模块程序设计: (23) --年计数模块程序设计: (23) --万年历波形仿真结果: (25) 结论: (26) 实验感想: (26) 附图: (27)

eda,verilog数字钟设计报告

数字钟 一、任务解析 用Verilog硬件描述语言设计数字钟,实现: 1、具有时、分、秒计数显示功能,以二十四小时循环计时。 2、具有调节小时,分钟的功能,调整时对应的数字闪烁。 3、具有整点报时及闹铃时间可调的功能。 4、数字钟具有四种模式:正常显示、时间调整、闹铃时间调整、秒表。 二、方案论证 没有闹铃功能 三、重难点解析 选择模式:module beii(clr,selin_key,beii_out); input clr,selin_key; output [1:0]beii_out; wire [1:0]beii_out; reg [1:0]selout_key; always@(negedge clr or posedge selin_key) begin if(!clr) selout_key=0; else begin if(selout_key==2) selout_key=0; else selout_key=selout_key+1;end end assign beii_out=selout_key; endmodule

头文件中: module clk_top(clr,clk,upkey,downkey,sel,a,b,c,d,e,f,g,p,clr_key,selin_key); clr:清零clk:50M时钟 upkey:向上调downkey:向下调 clr_key:恢复初始状态selin_key:模式选择 四、硬件资源分配 60进制module mycnt60(clr,clk,upkey,downkey,selout,q,c); input clk,clr,upkey,downkey;//upkey为加按键 input [1:0] selout; output[7:0] q;//60进制输出 output c;//进位溢出位 reg c; reg[7:0] q; wire new_clk1,ckb,ckc,ckd,cko; assign new_clk1=clk|((!selout[0]&selout[1])&(upkey|downkey)); LCELL AA(new_clk1,ckb);//信号延迟 LCELL BB(ckb,ckc); LCELL CC(ckc,ckd); LCELL DD(ckd,cko); initial c=0; always @(posedge cko or negedge clr )begin if(!clr) q=8'h00; else begin if(selout==2) begin if(upkey)begin if(q==8'h59) q=8'h00; else if(q==8'h?9) q=q+4'h7; else q=q+1; end else if(downkey)begin if(q==8'h00) q=8'h59; else if(q==8'h?0) q=q-4'h7; else q=q-1; end

verilog数字系统设计教程习题答案

verilog数字系统设计教程习题答案 第二章 1.Verilog HDL 既是一种行为描述语言,也是一种结构描述语言。如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互联的结构模块。这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。 2.模块的基本结构由关键词module和endmodule构成。 3.一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用 Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 4.Verilog HDL和VHDL作为描述硬件电路设计的语言,其共同的特点在于:能 形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用。 5.不是 6.将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组 合装配的过程。 7.综合工具可以把HDL变成门级网表。这方面Synopsys工具占有较大的优势,它的Design Compile是作为一个综合的工业标准,它还有另外一个产品叫Behavior Compiler,可以提供更高级的综合。 另外最近美国又出了一个软件叫Ambit,据说比Synopsys的软件更有效,可以 综合50万门的电路,速度更快。今年初Ambit被Cadence公司收购,为此Cadence 放弃了它原来的综合软件Synergy。随着FPGA设计的规模越来越大,各EDA公 司又开发了用于FPGA设计的综合软件,比较有名的有:Synopsys的FPGA Express,Cadence的Synplity, Mentor的Leonardo,这三家的FPGA综合软件占了市场的绝大部分。 8.整个综合过程就是将设计者在EDA平台上编辑输入的HDL文本、原理图或状态图形描述,依据给定的硬件结构组件和约束控制条件 进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述网表文件。用于适配,适配将由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件,如JEDEC、Jam格式的文件。

基于Verilog HDL设计的数字时钟

深圳大学考试答题纸 (以论文、报告等形式考核专用) 二○18 ~二○19 学年度第一学期 课程编 1602080001 课程名称 号 学 姓名李思豪专业年级电子科学与技术16级1班号 题目:基于Verilog HDL设计的数字时钟 摘要:本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ 6.0和cyclnoe II EP2C35F672C6完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中 关键词:Verilog HDL;硬件描述语言;FPGA

目录 一、实验任务 (3) 实验目的 (3) 实验要求 (3) 二、设计思路 (3) 三、实验结果 (10) 四、总结与收获 (14)

一、实验任务 实验目的 1.深入了解基于quartus ii工具的复杂时序逻辑电路的设计。 2.理解并熟练利用EDA工具进行综合设计。 3.熟练掌握芯片烧录的流程及步骤。 4.掌握Verilog HDL 语言的语法规范及时序电路描述方法。 实验要求 设计一个带秒表功能的24 小时数字钟,它包括以下几个组成部分: ①显示屏,由6 个七段数码管组成,用于显示当前时间(时:分,秒)或设置的秒表时间; ②复位键复位所有显示和计数 ③设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置 ④秒表键,用于切换成秒表功能 基本要求 (1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。 (2) 秒表功能:设置时间,进行倒计时功能 (3) 设置新的计时器时间:按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。 二、设计思路 1、总原理框图:

《verilog_数字系统设计课程》(第二版)思考题答案

绪论 1.什么是信号处理电路?它通常由哪两大部分组成? 信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应要求的电路。它通常有高速数据通道接口和高速算法电路两大部分组成。 2.为什么要设计专用的信号处理电路? 因为有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用处理器也无法在规定的时间内完成必要的运算。通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存储器中,然后在微处理器芯片控制下,按时钟的节拍,逐条取出指令分析指令和执行指令,直到程序的结束。微处理器芯片中的内部总线和运算部件也是为通用目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性也不可能为某一特殊的算法来设计一系列的专用的运算电路而且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因而其算法速度也受到限制所以要设计专用的信号处理电路。 3.什么是实时处理系统? 实时处理系统是具有实时响应的处理系统。 4.为什么要用硬件描述语言来设计复杂的算法逻辑电路? 因为现代复杂数字逻辑系统的设计都是借助于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。 5.能不能完全用C语言来代替硬件描述语言进行算法逻辑电路的设计? 不能,因为基础算法的描述和验证通常用C语言来做。如果要设计一个专用的电路来进行这种对速度有要求的实时数据处理,除了以上C语言外,还须编写硬件描述语言程序进行仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接口正确无误地交换数据。 6.为什么在算法逻辑电路的设计中需要用C语言和硬件描述语言配合使用来提高设计效率? 首先C语言很灵活,查错功能强,还可以通过PLI编写自己的系统任务,并直接与硬件仿真器结合使用。C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比Verilog HDL更完整,此外,C语言有可靠地编译环境,语法完备,缺陷缺少,应用于许多的领域。比较起来,Verilog语言只是针对硬件描述的,在别处使用并不方便。而用Verilog的仿真,综合,查错等大部分软件都是商业软件,与C语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷。所以只有在C语言的配合使用下,Verilog才能更好地发挥作用。C 语言与Verilog HDL语言相辅相成,互相配合使用。这就是即利用C语言的完整性又要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的

基于FPGA的VerilogHDL数字钟设计-

基于FPGA的Verilog HDL数字钟设计 专业班级姓名学号 一、实验目的 1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程; 2.熟悉一种EDA软件使用; 3.掌握Verilog设计方法; 4.掌握分模块分层次的设计方法; 5.用Verilog完成一个多功能数字钟设计; 6.学会FPGA的仿真。 二、实验要求 ?功能要求: 利用实验板设计实现一个能显示时分秒的多功能电子钟,基本功能: 1)准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间围模式; 2)计时时间围 00:00:00-23:59:59 3)可实现校正时间功能; 4)可通过实现时钟复位功能:00:00:00 扩展功能: 5)定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用板上LED或外接电路实 现。 6)仿广播电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)] ---用板上LED或 外接 7)报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动---用板上LED或外接 8)手动输入校时; 9)手动输入定时闹钟; 10)万年历; 11)其他扩展功能; ?设计步骤与要求: 1)计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。 2)在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电 路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。 3)对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快 得出仿真结果)。 4)输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit文件。 5)在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。

实现数字时钟设计的Verilog代码

下面给出实现数字时钟设计的Verilog代码 module top(inc_hour,sub_hour,inc_min,sub_min,rst,clk,sel,q); input inc_hour,sub_hour,inc_min,sub_min; input rst,clk; output reg [2:0] sel; output reg [6:0] q; reg [9:0] scan; reg [2:0] scan_clk; reg div_clk; reg [19:0] counter_clk; reg [3:0] sec_counter1,sec_counter2; reg [3:0] min_counter1,min_counter2; reg [3:0] hour_counter1,hour_counter2; always @ (negedge rst or posedge clk) begin if(~rst) begin counter_clk<=20'h00000; div_clk<=1'b0; end else begin if(counter_clk==20'h7a11f) begin counter_clk<=20'h00000; div_clk<=~div_clk; end else counter_clk<=counter_clk+1; end end always @(negedge rst or posedge div_clk) begin if(~rst) begin sec_counter1<=4'h0; sec_counter2<=4'h0; min_counter1<=4'h0; min_counter2<=4'h0; hour_counter1<=4'h0; hour_counter2<=4'h0; end

Verilog数字系统设计-课程设计报告

Verilog HDL数字系统设计 课程设计 课题:RISC_CPU设计与验证 第一章:RISC_CPU概述(5 1.1课题的由来和设计环境介绍(5 1.2什么是CPU (5 第二章:RISC_CPU结构(6 2.1 RISC_CPU整体结构(6 2.2 时钟发生器(7 2.2.1 时钟发生器的介绍(7 2.2.2 时钟发生器symbol(8 2.2.3 时钟发生器RTL(8 2.2.4 时钟发生器源代码(8 2.2.5 时钟发生器测试代码(9 2.2.6 时钟发生器仿真波形(10 2.3指令寄存器(10 2.3.1 指令寄存器介绍(10 2.3.2 指令寄存器symbol(11 2.3.3 指令寄存器RTL(11

2.3.4 指令寄存器源代码(11 2.3.5 指令寄存器测试代码(12 2.3.6指令寄存器仿真波形(13 2.4 累加器(13 2.4.1 累加器介绍(13 2.4.2 累加器symbol(13 2.4.3 累加器RTL(14 2.4.4 累加器源代码(14 2.4.5 累加器仿真代码(14 2.4.6 累加器仿真波形(15 2.5 算术运算器(15 2.5.1 算术运算器介绍(15 2.5.2 算术运算器symbol(16 2.5.3 算术运算器RTL(17 2.5.4 算术运算器源代码(18 2.5.5 算术元算器测试代码(19 2.5.6 算术运算器仿真波形(20 2.6数据控制器(20 2.6.1 数据控制器介绍(20

2.6.2 数据控制器smybol(20 2.6.3 数据控制器RTL(21 2.6.4 数据控制器源代码(21 2.6.5 数据控制器测试代码(22 2.6.6 数据控制器仿真波形(22 2.7 地址多路器(22 2.7.1地址多路器介绍(22 2.7.2 地址多路器smybol(23 2.7.3 地址多路器RTL(23 2.7.5 地址多路器测试代码(23 2.7.6 地址多路器仿真波形(24 2.8程序计数器(24 2.8.1 程序计数器介绍(24 2.8.2 程序计数器symbol(25 2.8.3 程序计数器RTL(25 2.8.4 程序计数器源代码(25 2.8.5 程序计数器测试代码(26 2.8.6 程序计数器仿真波形(26 2.9 状态控制器(27

基于某verilog数字钟设计资料报告材料

一、课程设计目标 1. 熟悉并掌握verilog 硬件描述语言 2. 熟悉quartus 软件开发环境 3.学会设计大中规模的数字电路,并领会其中的设计思想 二、课程设计实现的功能 (1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式);(2)可以调节小时,分钟。 (3)能够进行24小时和12小时的显示切换。 (4)可以设置任意时刻闹钟,并且有开关闹钟功能。 (5)有整点报时功能,几点钟LED灯闪亮几下。 (6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。 三、设计原理: 1、总原理框图: 2、各个子模块设计:

(1)、分频模块: 分频模块的作用主要是要获得各种频率的时钟信号。输入信号为50MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对50MHZ信号分频。通过计数的方式,当计数从0开始到24 999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。 部分代码如下: always(posedge _50MHZ or negedge nCR)begin if(~nCR) begin Q1<=32'd0; end else if(Q1>=32'd2*******) begin Q1<=32'd0; _1HZ=~_1HZ; end else begin Q1<=Q1+1'd1; end (2)、计数模块: 秒计数:在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。 分钟计数:在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。 小时计数:脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。 如果有复位信号,则时分秒全部清零。 部分代码如下: module second(cp,reset,mode_flag,BT2,SH,SL,co); input cp,reset,BT2; input[3:0]mode_flag; output co=1'b0; //输出脉冲信号 reg co; output [3:0]SL,SH; //输出秒计时的十位、各位 reg[3:0]SH,SL; reg[7:0]cnt; always(posedge cp or negedge reset ) begin if(!reset) begin //有复位,清零 t<=8'd0;

基于Verilog HDL的闹钟设计

封面删除~你懂的

摘要 随着微电子技术、计算机技术、半导体技术的发展,很多传统的数字门电路的设计已经被可编程逻辑器件替代。而对于传统的模拟控制技术,也被数字控制系统所取代。数字系统在各个领域显示出了无穷的魅力与优势,如今已经被广泛应用于实际工程中。本文利用Verilog HDL 语言自顶向下的设计方法设计多功能数字钟, 实现时、分、秒的计时和校时,以及整点报时和闹钟的功能。突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点, 并通过ModelSim SE 6.5 完成综合、仿真。通过Verilog HDL语言完成数字钟的层次化设计。 关键词:数字电子时钟,有限状态机,功能仿真 Abstract As the microelectronics, computer technology, semiconductor technology, many traditional design of digital gate programmable logic device has been replaced. As for the traditional analog control, digital control systems have also been replaced. Digital systems in various fields has shown infinite charm and advantages, and now has been widely used in practical projects. In this paper, Verilog HDL, the design of top-down multi-functional digital clock designed to achieve the hours, minutes, seconds, time and school, as well as the whole point timekeeping and alarm functions. Highlighted as a hardware description language, good readability, portability and ease of understanding, etc., and through the ModelSim SE 6.5 complete the comprehensive, simulation. Completed by Verilog HDL, the level of the digital clock design. Key words: Digital electronic clock, finite state machine, functional simulation .

Verilog数字钟设计实验报告

基于FPGA实现多功能数字钟 ——电子系 071180094 王丛屹 摘要 本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,并通过ISE完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中,实现了基本的计时显示和设置,调整时间,闹钟设置的功能。 [关键词] FPGA;Verilog HDL;数字钟

一、多功能数字钟的设计 设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。数字中系统主要由系统时钟,三个功能按键(mode ,turn ,change ),FPGA ,数码管和蜂鸣器部分组成。 图: 多功能数字钟总体设计模块 以下就各个模块说明其功能 1. 分频模块

由于FPGA内部提供的时钟信号频率大约为50MHz,在这需要将它转化成1Hz的标准时钟信号供数字钟的计时显示;在此我采用了级联分频法。 RTL图如下:

最终输出的是1Hz,100Hz,1kHz的标准时钟信号clk_1Hz ,clk_100Hz,clk_1k。 2、计时模块 原理:m是模式按键,当m=0时,进入计时模式,在计时模式下可以进行时间调整。num3,num4产生加速调整时间,当其值为1时,可以快速调整时间,该调整时间的频率由clk提供。counta,count1是手动调节时间。Turn接按键,可以改变当前调节的是小时还是分钟,长按turn键还可以使秒钟信号清零。sec1,min1,hour1输出的是计时的秒,分,时。 RTL图如下: 代码如下:

相关主题
文本预览
相关文档 最新文档