Verilog及FPGA学习考试必备经典程序(三)

Verilog及FPGA学习考试必备经典程序(三)
Verilog及FPGA学习考试必备经典程序(三)

目录

1. $time 与$realtime 的区别 (2)

2. $random 函数的使用 (2)

3. 1 位全加器进位输出UDP 元件 (2)

4. 包含x 态输入的1 位全加器进位输出UDP 元件 (3)

5. 用简缩符“?”表述的1 位全加器进位输出UDP 元件 (4)

6. 3 选1 多路选择器UDP 元件 (4)

7. 电平敏感的1 位数据锁存器UDP 元件 (5)

8. 上升沿触发的D 触发器UDP 元件 (6)

9. 带异步置1 和异步清零的上升沿触发的D 触发器UDP 元件 (6)

10. 延迟定义块举例 (7)

11. 激励波形的描述 (8)

12. 用always 过程块产生两个时钟信号 (8)

13. 存储器在仿真程序中的应用 (9)

14. 8 位乘法器的仿真程序 (9)

15. 8 位加法器的仿真程序 (10)

16. 2 选1 多路选择器的仿真 (11)

17. 8 位计数器的仿真 (12)

1

1.$time 与$realtime 的区别

`timescale 10ns/1ns

module time_dif;

reg ts;

parameter delay=2.6;

initial

begin

#delay ts=1;

#delay ts=0;

#delay ts=1;

#delay ts=0;

end

initial $monitor($time,,,"ts=%b",ts); //使用函数$time endmodule

2.$random 函数的使用

`timescale 10ns/1ns

module random_tp;

integer data;

integer i;

parameter delay=10;

initial $monitor($time,,,"data=%b",data);

initial begin

for(i=0; i<=100; i=i+1)

#delay data=$random; //每次产生一个随机数

end

endmodule

3. 1 位全加器进位输出UDP 元件

primitive carry_udp(cout,cin,a,b);

2

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;

endtable

endprimitive

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;

0 1 0 : 0;

0 0 1 : 0;

0 1 1 : 1;

1 0 0 : 0;

1 0 1 : 1;

1 1 0 : 1;

3

1 1 1 : 1;

0 0 x : 0; //只要有两个输入为0,则进位输出肯定为0

0 x 0 : 0;

x 0 0 : 0;

1 1 x : 1; //只要有两个输入为1,则进位输出肯定为1

1 x 1 : 1;

x 1 1 : 1;

endtable

endprimitive

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,则进位输出肯定为0

0 ? 0 : 0;

0 0 ? : 0;

? 1 1 : 1; //只要有两个输入为1,则进位输出肯定为1

1 ? 1 : 1;

1 1 ? : 1;

endtable

endprimitive

6. 3 选1 多路选择器UDP 元件

4

primitive mux31(Y,in0,in1,in2,s2,s1);

input in0,in1,in2,s2,s1;

output Y;

table

//in0 in1 in2 s2 s1 : Y

0 ? ? 0 0 : 0; //当s2s1=00时,Y=in0

1 ? ? 0 0 : 1;

? 0 ? 0 1 : 0; //当s2s1=01时,Y=in1 ? 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;

endtable

endprimitive

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,则不管其他端口为什么值,输出都为0

5

0 0 0 : ? : 0 ; //clk=0,锁存器把D端的输入值输出

0 0 1 : ? : 1 ;

1 0 ? : ? : - ; //clk=1,锁存器的输出保持原值,用符号“-”表示

endtable

endprimitive

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保持原值

? (??) : ? : - ; //时钟不变,输出也不变

endtable

endprimitive

9.带异步置1 和异步清零的上升沿触发的D 触发器UDP

元件

primitive DFF_UDP(Q,D,clk,clr,set);

output Q;

input D,clk,clr,set;

reg Q;

table

6

// clk D clr set : 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; //异步置1

n ? 0 0 : ? : -;

? * ? ? : ? : -;

? ? (?0) ? : ? : -;

? ? ? (?0): ? : -;

? ? ? ? : ? : x;

endtable

endprimitive

10.延迟定义块举例

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;

7

(b=>out)=3;

(c=>out)=1;

endspecify

endmodule

11.激励波形的描述

'timescale 1ns/1ns

module test1;

reg A,B,C;

initial

begin //激励波形描述

A = 0;

B = 1;

C = 0;

#100 C = 1;

#100 A = 1; B = 0;

#100 A = 0;

#100 C = 0;

#100 $finish;

end

initial $monitor($time,,,"A=%d B=%d C=%d",A,B,C); //显示endmodule

12.用always 过程块产生两个时钟信号module test2;

reg clk1,clk2;

parameter CYCLE = 100;

always

begin

{clk1,clk2} = 2'b10;

#(CYCLE/4) {clk1,clk2} = 2'b01;

#(CYCLE/4) {clk1,clk2} = 2'b11;

8

#(CYCLE/4) {clk1,clk2} = 2'b00;

#(CYCLE/4) {clk1,clk2} = 2'b10;

end

initial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2);

endmodule

13.存储器在仿真程序中的应用

module ROM(addr,data,oe);

output[7:0] data; //数据信号

input[14:0] addr; //地址信号

input oe; //读使能信号,低电平有效

reg[7:0] mem[0:255]; //存储器定义

parameter DELAY = 100;

assign #DELAY data=(oe==0) ? mem[addr] : 8'hzz;

initial $readmemh("rom.hex",mem); //从文件中读入数据endmodule

14.8 位乘法器的仿真程序

`timescale 10ns/1ns

module mult_tp; //测试模块的名字

reg[7:0] a,b; //测试输入信号定义为reg型wire [15:0] out; //测试输出信号定义为wire型integer i,j;

mult8 m1(out,a,b); //调用测试对象

//激励波形设定initial

begin

9

a=0;b=0;

for(i=1;i<255;i=i+1)

#10 a=i;

end

initial

begin

for(j=1;j<255;j=j+1)

#10 b=j;

end

initial //定义结果显示格式begin

$monitor($time,,,"%d * %d= %d",a,b,out);

#2560 $finish;

end

endmodule

module mult8(out, a, b); //8位乘法器源代码

parameter size=8;

input[size:1] a,b; //两个操作数

output[2*size:1] out; //结果

assign out=a*b; //乘法运算符

endmodule

15.8 位加法器的仿真程序

`timescale 1ns/1ns

module add8_tp; //仿真模块无端口列表

reg[7:0] A,B; //输入激励信号定义为reg型reg cin;

10

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); endmodule

module 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

16.2 选1 多路选择器的仿真

`timescale 1ns/1ns

module mux_tp;

reg a,b,sel;

11

wire out;

MUX2_1 m1(out,a,b,sel); //调用待测试模块

initial

begin

a=1'b0; b=1'b0; sel=1'b0;

#5 sel=1'b1;

#5 a=1'b1; sel=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;

end

initial $monitor($time,,,"a=%b b=%b sel=%b out=%b",a,b,sel,out);

endmodule

module 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

17.8 位计数器的仿真

`timescale 10ns/1ns

module count8_tp;

12

reg clk,reset; //输入激励信号定义为reg型wire[7:0] qout; //输出信号定义为wire型parameter DELY=100;

counter C1(qout,reset,clk); //调用测试对象

always #(DELY/2) clk = ~clk; //产生时钟波形

initial

begin //激励波形定义

clk =0; reset=0;

#DELY reset=1;

#DELY reset=0;

#(DELY*300) $finish;

end

//结果显示

initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout); endmodule

module 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;

end

endmodule

13

基于FPGA的Verilog HDL数字钟设计 -

基于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实现的基于FPGA的五层楼电梯运行控制逻辑毕业设计论文

五层楼电梯运行控制逻辑设计 摘要:电梯是高层建筑不可缺少的运输工具,用于垂直运送乘客和货物,传统的电梯控制系统主要采用继电器,接触器进行控制,其缺点是触点多,故障率高、可靠性差、维修工作量大等,本设计根据电梯自动控制的要求利用Verilog语言编写并完成系统设计,在利用软件仿真之后,下载到了FPGA上进行硬件仿真。FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了之前的可编程器件门电路数有限及速度上的缺点。 关键词:电梯控制FPGA Verilog软件设计硬件设计 在当今社会,随着城市建设的不断发展,高层建筑的不断增多,电梯作为高层建筑中垂直运行的交通工具已与人们的日常生活密不可分。目前电梯控制系统主要有三种控制方式:继电路控制系统(早期安装的电梯多位继电器控制系统),FPGACPLD [1] 的控制系统、微机控制系统。继电器控制系统由于故障率高、可靠性差、控制方式不灵活以及消耗功率大等缺点,目前已逐渐被淘汰,而微机控制系统虽在智能控制方面有较强的功能,但也存在抗扰性差,系统设计复杂,一般维修人员难以掌握其维修技术等缺陷。而FPGACPLD控制系统由于运行可靠性高,使用维修方便,抗干扰性强,设计和调试周期较短等优点 [2] ,倍受人们重视等优点,已经成为目前在电梯控制系统中使用最多的控制方式,目前也广泛用于传

统继电器控制系统的技术改造。 随着现代化城市的高度发展,每天都有大量人流及物流需要输送,因此在实际工程应用中电梯的性能指标相当重要,主要体现在:可靠性,安全性,便捷快速性。电梯的可靠性非常重要,直接或间接的影响着人们的生产,生活,而电梯的故障主要表现在电力拖动控制系统中,因此要提高可靠性也要从电力拖动控制系统入手。 本次设计尝试用Verilog实现电梯控制器部分,进行了多层次的电梯控制,也进行了软件及硬件上的仿真验证,时序分析以保证设计的正确。在设计中先用软件进行模拟仿真,然后又下载到FPGA开发板上进行硬件仿真,以确保设计的正确性。 1电梯的设计分析 1.1 系统的需求分析及系统描述 设计一个电梯运行控器,该电梯有5层楼,设计的电梯调度算法满足提高服务质量、降低运行成本的原则;电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭;除1层和5层分别只有上和下按钮外,其余每个楼层(电梯门口旁)的召唤面板都有两个按钮,分别指示上楼和下楼请求。当按下后,对应按钮灯亮。如果电梯已经到达该楼层,按钮灯熄灭;电梯的外部面板会显示电梯当前所在的楼层,及上行还是下行(暂停显示刚才运行时的状态);电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前方无请求时,才对反方向的请求进行应答。当前内部控制面板上有的请求,只要经过所在楼层均会立即响应.

基于FPGA的verilog的电子密码锁设计

一、概述 1.1 电子密码锁的现状 随着我国对外开放的不断深入,高档建筑发展很快,高档密码锁具市场的前景乐观。我国密码锁具行业对密码锁具高新技术的投入正逐年增大,高档密码锁的市场需求也逐年增加。在安防工程中,锁具产品是关系到整个系统安全性的重要设备,所以锁具产品的优劣也关系了整个安防工程的质量和验收。 目前,市场上比较先进的智能电子密码锁分别有:IC卡电子密码锁、射频卡式电子密码锁、红外遥控电子密码锁、指纹识别电子密码锁和瞳孔识别电子密码锁等。IC卡电子密码锁成本低,体积小,卡片本身无须电源等优点占领了一定的市场份额,但是由于有机械接触,会产生接触磨损,而且使用不太方便,在一定程度上限制了它的应用;射频卡式电子密码锁是非接触式电子密码锁,成本也不太高,体积跟IC卡密码锁相当,卡片使用感应电源,重量很轻,技术成熟,受到了广泛的欢迎,但是与IC卡电子密码锁相比,成本偏高;指纹识别电子密码锁和瞳孔识别电子密码锁可靠性很高,安全性是目前应用系统中最高的,但是成本高昂,还没进入大众化使用阶段。 在国外,美国、日本、德国的电子密码锁保密性较好,并结合感应卡技术,生物识别技术,使电子密码锁系统得到了飞跃式的发展。这几个国家的密码锁识别的密码更复杂,并且综合性比较好,已经进入了成熟期,出现了感应卡式密码锁,指纹式密码锁,虹膜密码锁,面部识别密码锁,序列混乱的键盘密码锁等各种技术的系统,它们在安全性,方便性,易管理性等方面都各有特长,新型的电子密码锁系统的应用也越来越广。 基于FPGA的电子密码锁是新型现代化安全管理系统,它集微机自动识别技术和现代安全管理措施为一体,它涉及电子,机械,计算机技术,通讯技术,生物技术等诸多新技术。它是解决重要部门出入口实现安全防范管理的有效措施,适用各种场合,如银行、宾馆、机房、军械库、机要室、办公间、智能化小区、工厂、家庭等。 在数字技术网络技术飞速发展的今天,电子密码锁技术得到了迅猛的发展。它早已超越了单纯的门道及钥匙管理,逐渐发展成为一套完整的出入管理系统。它在工作环境安全、人事考勤管理等行政管理工作中发挥着巨大的作用。在该系统的基础上增加相应的辅助设备可以进行电梯控制、车辆进出控制,物业消防监控、餐饮收费、私家车库管理等,真正实现区域内一卡智能管理。

基于FPGA的VerilogHDL数字钟设计

基于FPGA的Verilog-HDL数字钟设计--

————————————————————————————————作者:————————————————————————————————日期:

基于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文件,观察验证所设计的电路功能。 三、实验设计 功能说明:实现时钟,时间校时,闹铃定时,秒表计时等功能 1.时钟功能:完成分钟/小时的正确计数并显示;秒的显示用LED灯的闪烁做指示; 时钟利用4位数码管显示时分; 2.闹钟定时:实现定时提醒及定时报时,利用LED灯代替扬声器发出报时声音; 3.时钟校时:当认为时钟不准确时,可以分别对分钟和小时位的值进行调整; 4.秒表功能:利用4个数码管完成秒表显示:可以实现清零、暂停并记录时间等功能。 秒表利用4位数码管计数; 方案说明:本次设计由时钟模块和译码模块组成。时钟模块中50MHz的系统时钟clk分频产

基于FPGA的SDRAM实验Verilog源代码

// megafunction wizard: %ALTPLL% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: altpll // ============================================================ // File Name: clk_ctrl.v // Megafunction Name(s): // altpll // // Simulation Library Files(s): // altera_mf // ============================================================ // ************************************************************ // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! // // 11.0 Build 208 07/03/2011 SP 1 SJ Full Version // ************************************************************ //Copyright (C) 1991-2011 Altera Corporation //Your use of Altera Corporation's design tools, logic functions //and other software and tools, and its AMPP partner logic //functions, and any output files from any of the foregoing //(including device programming or simulation files), and any //associated documentation or information are expressly subject //to the terms and conditions of the Altera Program License //Subscription Agreement, Altera MegaCore Function License //Agreement, or other applicable license agreement, including, //without limitation, that your use is for the sole purpose of //programming logic devices manufactured by Altera and sold by //Altera or its authorized distributors. Please refer to the //applicable agreement for further details. // synopsystranslate_off `timescale 1 ps / 1 ps // synopsystranslate_on moduleclk_ctrl ( areset, inclk0, c0, c1, c2,

基于FPGA的verilog频率计设计

电子科技大学 (基于FPGA的频率计设计) 题目:简易频率计的设计 指导教师:皇晓辉 姓名:张旗 学号:2905201003 专业:光电学院一专业

摘要 本文主要介绍了基于FPGA 的简易多量程频率计的设计,使用硬件描述语言verilog来实现对硬件的控制,在软件ISE上实现编程的编译综合,在系统时钟48Mhz下可正常工作。该数字频率计采用测频的方法,能准确的测量频率在10Hz到100MHz之间的信号。使用ModelSim仿真软件对Verilog程序做了仿真,并完成了综合布局布线,通过ISE下载到Spartan3A开发板上完成测试。 关键词:FPGA ,verilog,ISE,测频方法

Abstract This paper mainly introduces the simple more range based on FPGA design of frequency meter,Use hardware description language verilog to realize the control of hardware,In the software realize the compilation of the programming ISE on comprehensive,In the system clock can work normally under 48 Mhz。The digital frequency meter frequency measurement method used, can accurate measurement frequency in 10 Hz to 100 MHz of signals between。Use ModelSim simulation software Verilog program to do the simulation, and completed the overall layout wiring,Through the ISE downloaded to Spartan3A development board complete test。 Keywords: FPGA, Verilog, ISE, F requency M easurement

基于FPGA的DS18B20控制程序设计及其Verilog实现(汇编)

基于FPGA的DS18B20控制程序设计及其Verilog实现 一,总体介绍 DS18B20是一个1-wire总线,12bit的数字温度传感器,其详细的参数这里不做具体的介绍,只讨论其基于Verilog的控制程序的设计。 实际上,对DS18B20的控制,主要是实现1-wire总线的初始化,读,写等操作,然后再根据DS18B20的控制要求,实现对其控制的verilog逻辑。 在1-Wire总线上,有一个master,可以有1个或者多个slave。而对于FPGA+DS18B20的温度测试设计来讲,需要在FPGA上实现一个1-Wire总线的master。DS18B20作为1-wire 总线的slave设备存在,可以有一个或者多个,不过为了简化程序,例程里假定只存在一个DS18B2020。 1-Wire总线的操作形式上相对简单,但操作本身相对却又比较复杂。用Verilog做控制程序设计时,可以采用多层次嵌套的状态机来实现。 二,FPGA + DS18B20的硬件设计 硬件的设计非常简单,只需要将DS18B20的DQ与FPGA的一个IO连接,并加4.7K左右的上拉电阻就可以了。VDD和VPU可以为3.0~5.0V。这里我们参照FPGA本身的IO电压,选择3.3V。 另外要注意的一点是,由于DQ的数据是双向的,所以FPGA的该IO要设定为inout类型。 三,1-Wire总线的基本操作及Verilog实现。 根据1-Wire总线的特点,可以把1-Wire总线的操作归结为初始化,单bit读操作,单bit写操作等最基础的几种。下面分别是几种基本操作的介绍和verilog实现。由于DS18B20的时序操作的最小单位基本上是1us,所以在该设计中,全部采用1MHz的时钟。 1. 初始化 初始化实际上就是1-wire总线上的Reset操作。由master发出一定长度的初始化信号。Slave 看到该初始化信号后,在一定时间内发出规定长度的响应信号,然后初始化操作就结束了。下图是DS18B20的datasheet上给出的初始化的时序要求图示。

基于FPGA的I2C实验Verilog源代码

`timescale 1ns / 1ps module i2c_drive( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output [7:0] dis_data; //输出指定单元的数据 //-------------------------------------------- //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 always @ (posedge clk or negedge rst_n) if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟

基于FPGA的四路抢答器的Verilog HDL代码

module qiangda4(clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4,Led1,Led2,Led3,B uzzer); // 开始声明各个端口 //输入口 input clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4; //输出口 output [0:7] Led1; //倒计时时使用的LED控制端 output [0:7] Led2; //数码管控制端 output [0:7] Led3; //分数显示数码管控制端 output Buzzer; //蜂鸣器 //各个寄存器变量声明 reg [0:7] Led1; reg [0:7] Led2; reg [0:7] Led3; reg cnt=32'b0; reg Buzzer; reg score=4’hf;//分数显示寄存器 //配置寄存器,EnFlat是表明开始抢答的标志位 reg EnFlat=1'b0; //BuClk是蜂鸣器的标志位 reg BuClk=1'b0; //BuL是做蜂鸣器的延时用 reg [0:7]BuL=8'd0; //抢答选手标志位 reg answer=3’d0; //各组分数标志位 reg score1=4’d5; reg score2=4’d5; reg score3=4’d5; reg score4=4’d5; //------------初始化模块--------------- always @ (posedge clk)//捕捉时钟 begin //初始化各按键并开始抢答 begin if(inputEn==1'b0) begin //初始化各个标志位和参数

FPGA基于verilog HDL的密码锁

EDA课程设计 课设名称:密码锁 课设日期: 2014.6.23——7.5 姓名:陈飞 学号:110250101 哈尔滨工业大学(威海) 信电学院电子信息工程 2014.6

一. 所用软件与硬件介绍 1.1所用软件介绍 QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD 设计流程。 QuartusII可以在XP、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。 QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。 此外,QuartusII 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。 Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对MaxplusII 的更新支持,QuartusII 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在QuartusII 中包含了许多诸如SignalTapII、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII 友好的图形界面及简便的使用方法。 1.2所用硬件介绍 硬件的总体设计: 故由上图,将整个硬件电路部分主要分成五个部分,即:FPGA电路设计,数码管显示驱动电路设计,温度传感器电路设计,报警电路设计,键盘矩阵

基于FPGA的洗衣机控制器 verilog hdl 语言描述的设计与开发.doc

编号: 1 电机控制综合课程设计 报告书 课题:基于FPGA的洗衣机控制器 院(系):机电工程学院 专业:电气工程及其自动化 学生姓名:蒋岷君 学号:0800120313 题目类型:?理论研究?实验研究?工程设计?工程技术研究?软件开发 2011 年7月6 日

前言 一、洗衣机控制器主要内容 l.任务要求和内容 设计制作一个洗衣机的正反转定时控制线路。 1)控制洗衣机的电机作如下运转 定时开始――正转10S――暂停5S――反转10S――暂停5S――定时到停止 定时未到 2)用2位七段数码管显示定时时间(S)。 2.洗衣机控制器的使用步骤: (1)电路上电后,在Start拨码开关未闭合前可以由UpKey和DownKey按键开关“+”“-”设置总的工作时间,确定洗衣机控制器工作允许时间。 (2)设定好允许工作时间后,闭合Start开关,洗衣机控制器开始工作。 (3)可以看见指示正转LED灯亮10s,停转LED灯亮5S,反转LED灯亮10s,停转LED亮5s,如此反复直至工作允许时间为0,蜂鸣器发出警报。 二、设计原理简介 洗衣机控制器的设计主要是时序控制和定时器的设计,由一片FPGA和外围电路构成电器控制部分。FPGA接收键盘的控制命令,控制洗衣机的正转、反转、停机和定时时间为0报警的工作状态、控制并显示工作状态以及显示定时时间。对FPGA芯片的编程采用模块化的Verilog HDL (硬件描述语言)进行设计,设计由分频模块,按键消抖模块,定时时间自减模块,时序中心控制模块,数码管显示模块组成,顶层实现整个芯片的功能。顶层使用原理图实现,底层由Verilog HDL语句实现。 FPGA的输入时钟为20M hz,因此使用了分频模块输出1hz的方波给定时器设定自减模块提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块和时序控制模块,通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。通过按键消抖模块可以准确无抖动的设定定时器的工作时间。

利用Verilog HDL实现基于FPGA的分频方法

利用Verilog HDL实现基于FPGA的分频方法 许文建,陈洪波,李晓 中国矿业大学信息与电气工程学院,江苏徐州(221008) E-mail:bachelor122@https://www.360docs.net/doc/1a16622151.html, 摘要:本文从实际应用出发,分别介绍了利用Verilog HDL硬件语言实现的整数和半整数分频的通用方法。并在Quartus II软件环境下,利用Altera 公司的ACEX1K系列器件进行了仿真和调试。 关键词:Verilog HDL;分频;FPGA 1. 引言 在复杂数字逻辑电路设计中,经常会用到多个不同的时钟信号。一般可分为奇数、偶数、半整数分频。本文首先简要介绍了FPGA 器件的特点和应用范围。接着分别介绍了整数和分数分频的常用方法,并在QuartusII开发软件下,利用Verilog硬件描述语言来设计数字逻辑电路。 在数字逻辑电路设计中,分频器是一种基本电路。我们常会遇到偶数分频、奇数分频、半整数分频等,在同一个设计中有时要求多种形式的分频。通常由计数器或计数器的级联构成各种形式的偶数分频和奇数分频,实现较为简单。但对半整数分频分频实现较为困难。 FPGA(Field programmable Gates Array,现场可编程门阵列)【1】都是可编程逻辑器件,它们是在PAL、GAL 等逻辑器件基础上发展起来的。同以往的PAL、GAL 相比,FPGA/CPLD 的规模比较大,适合于时序、组合等逻辑电路的应用。它可以替代几十甚至上百块通用IC 芯片。这种芯片具有可编程和实现方案容易改动等特点。由于芯片内部硬件连接关系的描述可以存放在磁盘、ROM、PROM、或EPROM 中,因而在可编程门阵列芯片及外围电路保持不动的情况下,换一块EPROM 芯片,就能实现一种新的功能。它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及实时在检验等优点,因此,可广泛应用于产品的原理设计和产品生产之中。几乎所有应用门阵列、PLD 和中小规模通用数字集成电路的场合均可应用FPGA 和CPLD 器件。在现代电子系统中,数字系统所占的比例越来越大。系统发展的趋势是数字化和集成化,而FPGA 作为可编程ASIC(专用集成电路)器件,它将在数字逻辑系统中发挥越来越重要的作用。 2. 整数分频原理 整数分频包括偶数分频和奇数分频,对于偶数N分频,通常是由模N/2 计数器实现一个占空比为1:1的N分频器,分频输出信号模N/2 自动取反。对于奇数N 分频,上述方法就不适用了,N奇数分频,要使占空比为50%,以如下思路实现: 1、以原时钟周期的N倍作为一个处理周期;(用计数器计数的作用) 2、生成占空比为N2 :N2+1(除法取整)的波形;(以计数器值采样) 3、将B生成的波形相移原时钟的半个周期;(用负沿打的作用) 4、若高电平占N2宽,输出将B和C的波形相或;若高电平占N2+1宽,输出将B和C 的波形相与 下面分别以两个程序分别介绍偶数和奇数分频方法:

基于FPGA与PC串口自收发通信-Verilog

FPGA与PC串口自收发通信 实现的功能如题,就是FPGA里实现从PC接收数据,然后把接收到的数据发回去。 使用的是串口UART协议进行收发数据。上位机用的是通用的串口调试助手。 发送数据的波特率可选9600bps,19200bps,38400bps,57600bps,115200bps等,是可调的。发送格式为:1bit起始位,8bit数据,1bit停止位,无校验位。 以下的代码有比较详细的注释,经过下载验证,存在误码率(<5%),仅供学习!代码如下: (顶层模块): module my_uart_top(clk,rst_n,rs232_rx,rs232_tx); input clk; // 50MHz主时钟 input rst_n; //低电平复位信号 input rs232_rx; // RS232接收数据信号 output rs232_tx; // RS232发送数据信号 wire bps_start; //接收到数据后,波特率时钟启动信号置位 wire clk_bps; // clk_bps的高电平为接收或者发送数据位的中间采样点 wire[7:0] rx_data;

//接收数据寄存器,保存直至下一个数据来到 wire rx_int; //接收数据中断信号,接收到数据期间始终为高电平 //---------------------------------------------------- speed_select speed_select( .clk(clk), //波特率选择模块,接收和发送模块复用,不支持全双工通信.rst_n(rst_n), .bps_start(bps_start), .clk_bps(clk_bps) ); my_uart_rx my_uart_rx( .clk(clk), //接收数据模块 .rst_n(rst_n), .rs232_rx(rs232_rx), .clk_bps(clk_bps),

基于FPGA的四路抢答器的Verilog-HDL代码

基于FPGA的四路抢答器的Verilog-HDL代码

module qiangda4(clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4,Led1,Led2,L ed3,Buzzer); // 开始声明各个端口 //输入口 input clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4; //输出口 output [0:7] Led1; //倒计时时使用的LED控制端 output [0:7] Led2; //数码管控制端 output [0:7] Led3; //分数显示数码管控制端 output Buzzer; //蜂鸣器 //各个寄存器变量声明 reg [0:7] Led1; reg [0:7] Led2; reg [0:7] Led3; reg cnt=32'b0; reg Buzzer; reg score=4’hf;//分数显示寄存器 //配置寄存器,EnFlat是表明开始抢答的标志位 reg EnFlat=1'b0; //BuClk是蜂鸣器的标志位 reg BuClk=1'b0; //BuL是做蜂鸣器的延时用 reg [0:7]BuL=8'd0; //抢答选手标志位 reg answer=3’d0; //各组分数标志位 reg score1=4’d5; reg score2=4’d5; reg score3=4’d5; reg score4=4’d5; //------------初始化模块--------------- always @ (posedge clk)//捕捉时钟 begin //初始化各按键并开始抢答 begin if(inputEn==1'b0) begin //初始化各个标志位和参数

基于FPGA的verilog的流水灯程序

基于FPGA的流水灯verilog程序 `define cnt 17d7840 //cnt是计数量此处计时0.5s。我调试的板子晶振频 率是50MHZ。32’h17d7840就是0.5s 。这个十六 进制的数值你可以用电脑自带的计数器转换的。`define cnt_n 17d7841 //cnt值加一,用于下边的计数寄存器led_cnt的复位module led_new (clk,rest,led); input clk; input rest; output [7:0]led; reg [7:0]led; reg [7:0]led_n; reg [31:0] led_cnt; always@(posedge clk or negedge rest) begin if(!rest) led<=8'h80; else led<=led_n; end always@(*) begin if(!rest) led_n=8'h00; else if(led_cnt==32'h`cnt) led_n={led[6:0],led[7]}; else led_n=led; end always@(posedge clk or negedge rest) begin if(!rest) led_cnt<=32'h0; else if(led_cnt==32'h`cnt_n) led_cnt<=32'h0; else led_cnt<=led_cnt+1'b1; end endmodule

十进制数转换成十六进制的操作: 先在电脑的开始》附件》计数器;打开计数器,点击“科学型”,窗口右边的键盘输入你想要的计数值,然后再点十六进制就行了 QUARTUS II里面的引脚绑定 其中clk是芯片内部时钟,仔细观察板子,观察晶振连进板子的那个引脚就是时钟引脚了。我板子上边标示的是clk0/17。 注意:把程序复制进去的时候请把那些注释删掉,因为我写那些注释只是在WORD文档写而已的。格式不对

基于FPGA乒乓球游戏机Verilog设计说明

基于FPGA乒乓球游戏机Verilog设计 整理者:G゛佑咡江西师范大学电子信息工程 前言:此类程序鉴于网上大多是VHDL设计,所以我整理一份Verilog设计供初学者参考,因为时间关系,程序没有优化,也没有注释,如有不妥的地方,请大家多提意见。 摘要:本文使用 FPGA 芯片来模拟实际的乒乓球游戏。本设计是基于 Altera 公司的FPGA Cyclone II 芯片 EP2C5T144C8 的基础上实现,运用 Verilog HDL 语言编程,在Quartus II 软件上进行编译、仿真,最终在开发板上成功实现下载和调试。 1 乒乓球游戏机系统组成 乒乓球比赛游戏机的组成如图1 所示。比赛规则约定:五局三胜; 1 分一局; 裁判发出比赛开始信号,触发FPGA 内部随机数发生器模块产生首次发球权方;比赛进行中,选手连续两次获得发球权后, 发球权交予对方,如未获发球权方发球, 裁判端犯规音响电路鸣响;6 个LED 排列成行模拟乒乓球台(因为我的开发板上只有6个LED灯,比赛开始时候中间两个灯亮,如果有条件的话有10来个灯最好了); 点亮的LED 模拟乒乓球,受 FPGA 控制从左到右或从右到左移动; 比赛选手通过按钮输入模拟击球信号, 实现 LED 移位方向的控制; 若发亮的LED 运动在球台中点至对方终点之间时,对方未能及时按下击球按钮使其向相反方向移动, 即失去一分。 2 功能模块设计 图1 中,基于FPGA 设计的控制端为整个系统的核心,其内部主要由简易随机数发生器、发球权控制器、乒乓球位置控制器、甲乙方计分控制器、犯规音响控制器等模块组成。整个控制端采用模块化设计,先用 Verilog 语言编写功能模块,然后用顶层原理图将各功能模块连接起来。设计的难点在于协调各模块工作,严格遵守各信号间时序关系。本系统采用

基于FPGA的verilog万年历程序

/* -------------------------------------------------------------------------------- -- -- -- -------------------------------------------------------------------------------- */ `timescale 1ns/100ps module clock #( parameter FEQ_CLOCK = 2_000_000 //20M//1.6384MHz //32768Hz ) ( input sysclk, input reset_n, input [3:0] config_addr, input data_config_wr, input data_config_rd, inout [7:0] config_data, output alarm_flag ); // parameter para_1us = FEQ_CLOCK/1000000; parameter para_1ms = 1000;//1000 parameter para_1s = 1000;//1000 parameter para_1m = 60;//60 parameter para_1h = 60;//60 parameter para_1d = 24;//24 reg [15:0] year_h = 8'd20; reg [7:0] year_l = 8'd08; reg [3:0] month = 4'd1; reg [4:0] day = 5'd30; reg [4:0] hour = 5'd16; reg [5:0] minute = 6'd20; reg [5:0] second = 6'd20; reg [9:0] msec = 10'd80; reg [9:0] usec = 10'd20; reg [5:0] Hz_cnt = 6'd0; //------------------------------------------------------------------------------

基于Verilog的FPGA的电子密码锁的设计

基于FPGA的电子密码锁的设计报告 摘要:基于FPGA设计的电子密码锁是一个小型的数字系统,与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件。在实际应用中,程序容易跑飞,系统的可靠性较差。本文介绍的一种基于现场可编辑门阵列FPGA器件的电子密码锁的设计方法,采用VHDL语言对系统进行描述,并在EP3C10E144C8上实现。 通过仿真调试,利用可编程逻辑器件FPGA的电子密码锁的设计基本达到了预期目的。当然,该系统在一些细节的设计上还需要不断地完善和改进,特别是对系统的扩展有很好的使用系统和设计的价值。 关键词:现场可编程门阵列;VHDL语言;电子密码锁 The Report Of Electronic Code Lock Design Abstract:FPGA-based design of the electronic code lock is a small digital system. It has many unique advantages:good privacy and security , it do not need the key but remember password to unlock, and so on while it compare to ordinary mechanical locks. At present, the electronic code lock is most used of SCM technology .In practice, however, the process easy run to fly. So the reliability of this system is poor. The paper introduced a field programmable gate arrays FPGA devices to design electronic password lock. The VHDL language is used to describe the system and achieved in EP3C10E144C8. Though the simulation tests, using FPGA-based design of the electronic code lock can achieve the expected goal. Of course, some of the details of the system in the design of the need to constantly refined and improved, in particular the expansion of the system have a good design and practical value. Keyword: FPGA; VHDL language; electronic password lock

相关主题
相关文档
最新文档