verilog hdl 实验报告
数电实验报告2.1—基于Verilog HDL显示译码器设计

<基于Verilog HDL显示译码器设计>实验报告学生姓名:班级学号:指导老师:<实验报告内容>一、实验名称:基于Verilog HDL 显示译码器设计二、实验学时:4学时 三、实验目的:进一步掌握QuartusII 软件逻辑电路设计环境及Verilog HDL 的基本语法,熟悉设计流程及思路。
掌握显示译码器的工作原理及应用。
(提示:本实验将涉及到verilog 的条件语句(如if …else, case ….end case, for ….等)、赋值语句(如assign 等)和二进制变量位宽的定义等内容,请大家实验前做好本部分预习和自学,可参考本课本第九章内容,也可自行查找有关Verilog 设计基础的相关内容,推荐参考书:北京航空航天出版社,夏宇闻编著 )。
通过对所设计逻辑电路功能仿真,分析所设计电路逻辑功能是否正确,掌握逻辑功能仿真的方法。
四、实验内容:基于verilog 的显示译码器逻辑设计及功能仿真五、实验原理:(1)半导体发光二极管(LED )数码显示器:半导体发光二极管数码显示器由7(或8)个LED 排成“日”字形,称为七段(或八段),封装成数码管,如错误!未找到引用源。
所示。
LED 数码管内部有共阴极和共阳极两种接法。
如错误!未找到引用源。
(2)常用显示译码器管脚功能(74LS148):LCD —七段显示译码器:介绍常用的74LS148七段显示译码器,图 3为74LS4874LS48(a )图 1 图 2 CC fg a bcd e BI 7123456图 3(3)74LS48的逻辑功能:如表1:表1其译码器输出(Ya~Yg)是高电平有效,适用于驱动共阴极LED数码管,显示的字形表中所示。
因其译码器输出端的内部有上拉电阻(是2K的限流电阻),因此在与LED管连接时无需再外接限流电阻。
具体功能介绍及内部设计图,请自行上网查阅74LS48的DATASHEET。
VerilogHDL实验报告

VerilogHDL实验报告实验一Modelsim仿真软件的使用一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。
2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真3、方法moduleyihuo (a,b,c);inputa,b;output c;assign c=a^b;endmodule测试程序:module t_yihuo;reg a,b; wire c;initial begin a=0; forever #20 a=~a; end initial begin b=0; forever #30 b=~b; endyihuou1(a,b,c);endmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim软件,掌握了Modelsim软件的编译、仿真方法。
同时在编写程序的过程中,加深了我对课上所讲的HDL的语法的认识。
实验二简单组合电路设计一、实验目的(1)掌握基于Modelsim的数字电路设计方法(2)熟练掌握HDL 程序的不同实现方法二、实验内容1、实验要求设计一个三人表决器(高电平表示通过),实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。
使用 Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真。
2、方法module test(a,b,c,s);inputa,b,c;output s;assign s=c|(b&a);endmodulemodulet_test;rega,b,c;wire s;initialbegina=0;forever#10 a=~a;endinitialbeginb=0;forever #20 b=~b;endinitialbeginc=0;forever#40 c=~c;endtest u1(a,b,c,s);endmodule三、实验结果四、分析和心得通过本次实验,我掌握基于Modelsim的简单数字电路设计方法,且尝试了用不同方法实现功能,三人表决器可以通过testbench测试程序实现,也可以利用always模块实现,可见程序的设计思想是很重要的。
Verilog HDL 实验报告

Verilog实验报告班级:学号:姓名:实验1 :用 Verilog HDL 程序实现直通线1 实验要求:(1) 编写一位直通线的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 建议用模式 52 试验程序:module wl(in,out);input in;output out;wire out;assign out=in;endmodule3 测试基准:`include “wl.v”module wl_tb;reg in_tb;wire out_tb;initialbeginin_tb =0;#100 in_tb =1;#130 in_tb =0;endendmodule4 仿真图形:实验2 :用 Verilog HDL 程序实现一位四选一多路选择器1实验要求:(1) 编写一位四选一多路选择器的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4)建议用模式 52 试验程序:module mux4_to_1 (out,i0,i1,i2,i3,s1,s0);output out;input i0,i1,i2,i3;input s1, s0;reg out;always @ (s1 or s0 or i0 or i1 or i2 or i3)begincase ({s1, s0})2'b00: out=i0;2'b01: out=i1;2'b10: out=i2;2'b11: out=i3;default: out=1'bx;endcaseendendmodule3 测试基准:`include "mux4_to_1.v"module mux4_to_1_tb1;reg ain,bin,cin,din;reg[1:0] select;reg clock;wire outw;initialbeginain=0;bin=0;cin=0;din=0;select=2'b00;clock=0;endalways #50 clock=~clock;always @(posedge clock)begin#1 ain={$random} %2;#3 bin={$random} %2;#5 cin={$random} %2;#7 din={$random} %2;endalways #1000 select[0]=!select[0];always #2000 select[1]=!select[1];mux4_to_1 m(.out(outw),.i0(ain),.i1(bin),.i2(cin),.i3(din),.s1(select[1]),.s0(select[0])); endmodule4 仿真图形:实验3:用 Verilog HDL 程序实现十进制计数器1实验要求:(1) 编写十进制计数器的 Veirlog HDL 程序. 有清零端与进位端, 进位端出在输出为 9 时为高电平.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2 实验程序:module counter_10c (Q, clock, clear, ov);output [3:0] Q;output ov;input clock, clear;reg [3:0] Q;reg ov;initial Q=4'b0000;always @ (posedge clear or negedge clock)beginif (clear)Q<=4'b0;else if (Q==8)beginQ<=Q+1;ov<=1'b1;endelse if (Q==9)beginQ<=4'b0000;ov<=1'b0;endelsebeginQ<=Q+1;ov<=1'b0;endendendmodule3 测试基准:`include"./counter_10c.v"module counter_10c_tb;wire[3:0] D_out;reg clk,clr;wire c_out;reg[3:0] temp;initialbeginclk=0;clr=0;#100 clr=1;#20 clr=0;endalways #20 clk=~clk;counter_10c m_1(.Q(D_out),.clear(clr),.clock(clk),.ov(c_out)); endmodule4 仿真波形:实验4 :用 Verilog HDL 程序实现序列检测器1 实验要求:、(1) 编写序列检测器的 Veirlog HDL 程序. 检测串行输入的数据序列中是否有目标序列5'b10010, 检测到指定序列后, 用一个端口输出高电平表示.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2试验程序:module e15d1_seqdet( x, z, clk, rst);input x,clk, rst;output z;reg [2:0] state;wire z;parameter IDLE = 3 'd0,A = 3'd1,B = 3'd2,C = 3'd3,D = 3'd4,E = 3'd5,F = 3'd6,G = 3'd7;assign z =(state==D && x==0)?1:0;always @(posedge clk or negedge rst)if(!rst)beginstate<=IDLE;endelsecasex(state)IDLE: if(x==1)state<=A;else state<=IDLE;A: if (x==0)state<=B;else state<=A;B: if (x==0)state<=C;else state<=F;C: if(x==1)state<=D;else state<=G;D: if(x==0)state<=E;else state<=A;E: if(x==0)state<=C;else state<=A;F: if(x==1)state<=A;else state<=B;G: if(x==1)state<=F;else state <=G;default: state<=IDLE;endcaseendmodule3测试基准:`include"e15d1_seqdet.v"`timescale 1ns/1ns`define halfperiod 20module e15d1_seqdet_tb;reg clk, rst;reg [23:0] data;wire z;reg x;initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data= 20 'b1100_1001_0000_1001_0100;#(`halfperiod*1000) $stop;endalways #(`halfperiod) clk=~clk;always @ (posedge clk)begin#2 data={data[22:0],data[23]};x=data[23];ende15d1_seqdet m(.x(x),.z(z),.clk(clk),.rst(rst)); endmodule4仿真波形:。
verilog实验报告

verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。
它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。
本实验报告将介绍我在学习Verilog过程中进行的实验内容和所获得的结果。
实验一:基本门电路设计在这个实验中,我使用Verilog设计了基本的逻辑门电路,包括与门、或门和非门。
通过使用Verilog的模块化设计,我能够轻松地创建和组合这些门电路,以实现更复杂的功能。
我首先创建了一个与门电路的模块,定义了输入和输出端口,并使用逻辑运算符和条件语句实现了与门的功能。
然后,我创建了一个测试模块,用于验证与门的正确性。
通过输入不同的组合,我能够验证与门的输出是否符合预期。
接下来,我按照同样的方法设计了或门和非门电路,并进行了相应的测试。
通过这个实验,我不仅学会了使用Verilog进行基本门电路的设计,还加深了对逻辑电路的理解。
实验二:时序电路设计在这个实验中,我学习了如何使用Verilog设计时序电路,例如寄存器和计数器。
时序电路是一种具有状态和时钟输入的电路,能够根据时钟信号的变化来改变其输出。
我首先设计了一个简单的寄存器模块,使用触发器和组合逻辑电路实现了数据的存储和传输功能。
然后,我创建了一个测试模块,用于验证寄存器的正确性。
通过输入不同的数据和时钟信号,我能够观察到寄存器的输出是否正确。
接下来,我设计了一个计数器模块,使用寄存器和加法电路实现了计数功能。
我还添加了一个复位输入,用于将计数器的值重置为初始状态。
通过测试模块,我能够验证计数器在不同的时钟周期内是否正确地进行计数。
通过这个实验,我不仅学会了使用Verilog设计时序电路,还加深了对触发器、寄存器和计数器的理解。
实验三:组合电路设计在这个实验中,我学习了如何使用Verilog设计组合电路,例如多路选择器和加法器。
组合电路是一种没有状态和时钟输入的电路,其输出只取决于当前的输入。
Verilog-HDL实验报告

HDL实验报告专业电子科学与技术姓名学号指导老师1 实验一Modelsim仿真软件的使用1.1 实验目的(1)熟悉Modelsim 软件;(2)掌握Modelsim 软件的编译、仿真方法;(3)熟练运用Modelsim 软件进行HDL 程序设计开发。
1.2 实验步骤(1)学习使用Modelsim软件;(2)分析原理及功能;(3)用Verilog HDL编写程序;(4)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
1.3 实验内容用Verilog HDL 程序实现一个异或门,Modelsim 仿真,观察效果。
1.4.1 程序module my_xor(ina,inb,out);input ina,inb;output out;assign out=ina^inb;endmodulemodule t_xor;reg ina,inb;wire out;initialbeginina=1'b0;forever #20 ina=~ina;endinitialbegininb=1'b0;forever #10 inb=~inb;endmy_xor tt(.ina(ina),.inb(inb),.out(out));endmodule2 实验二简单组合电路设计2.1 实验目的(1)掌握基于Modelsim 的数字电路设计方法;(2)熟练掌握HDL 程序的不同实现方法2.2 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
2.3 实验内容设计一个三人表决器(高电平表示通过) ,实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。
使用Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真(要求:至少使用两种方法实现上述实验内容和testbench)。
verilog HDL课题报告

一、实验目的通过此设计的编程和下载运行,初步掌握Verilog HDL语言的always 块语句及基本编程结构。
二、实验过程(1)新建工程;通过“file”→“new project wizard…”菜单命令启动新项目向导,利用向导,建立一个新项目。
(2)输入设计程序在file菜单下,单击“new”命名,弹出对话框,选择Verilog HDL File 选项,建立Verilog HDL文件,输入下面程序:module liushuideng(ledout,clk);output[8:0]ledout;input clk;reg[8:0]ledout;reg[23:0]counter;initialledout=8'b11111111;always@(posedge clk)begincounter=counter+1;if(counter==24'b110000000000000000000000)beginledout=ledout<<1;if(ledout==8'b00000000)ledout=8'b11111111;counter=0;endendendmodule(3)指定管脚和设置不用引脚启动pin planner工具,弹出对话框,在“location”列,选择要分配的位置,为每个电路端子都分配适当的脚位。
在Assignments菜单下,单击Device…命令,进入Device & Pin Options对话框,在切换到Unused Pins页,在Reserved all unused pins栏目中,选择As input tri-stated,回到Setting对话框,单击“确定”。
(4)编译在processing菜单下,单击Start Compilation命令,开始编译项目,若编译成功,单击“确定”。
(5)仿真在file菜单下,单击“new”,弹出对话框,切换到other files页。
时序逻辑电路的Verilog_HDL实现实验报告

时序逻辑电路的Verilog HDL 实现一.实验要求(1):编写JK 触发器、8位数据锁存器、数据寄存器的Verilog HDL 程序,并实现其仿真及其测试程序;(2):在实验箱上设计含异步清零和同步使能的计数器。
(3):进行波形仿真测试后;画出仿真波形。
(4):写出实验心得二.实验内容:(1)1.JK 触发器的元件符号如图7.14所示,其中J 、K 是数据输入端,CLR 是复位控制输入端,当CLR=0时,触发器的状态被置为0态;CLK 是时钟输入端;Q 和QN 是触发器的两个互补输出端。
JK 触发器的状态方程为Q n+1 =J Q n +K Q nJK 触发器的verilog HDL 程序module jkff_rs(clk,j,k,q,rs,set); input clk,j,k,set,rs;output reg q;always@(posedge clk,negedge rs,negedge set)begin if(!rs) q<=1'b0;else if(!set) q<=1'b1;else case({j,k})2'b00:q<=q;2'b01:q<=1'b0;2'b10:q<=1'b1;2'b11:q<=~q;default:q<=1'bx;endcaseendendmoduleJK 触发器的功能:带异步清0,异步置1(低电平有效)JK 触发器的仿真结果JK 触发器的元件符号2.8位数据锁存器锁存器元件符号如图所示。
CLR是复位控制输入端,当CLR=0时,8位数据输出Q[7..0]=00000000。
ENA是使能控制输入端,当ENA=1时,锁存器处于工作状态,输出Q[7..0]=D[7..0];ENA=0时,锁存器的状态保持不变。
OE是三态输出控制端,当OE=1时,输出为高阻态;OE=0时,锁存器为正常输出状态。
VHDL实验报告汇总

实验一4选一多路选择器一:实验目的及实验环境目的1、熟悉ModelSim SE 6.5c的verilog 的文本设计流程,组合电路的设计、仿真和测试。
2、用verilog语言完成设计4选一多路选择器。
3、熟悉文本输入及仿真步骤。
4、初步了解可编程器件设计的全过程。
环境1、P C 机一台2、M odelSim SE 6.5c二. 实验内容1、用verilog语言完成设计4选一多路选择器,2、用结构建模及数据流建模两种方法实现。
3、对于所设计的程序进行编译,检查纠错。
4、程序完善之后进行程序的仿真并进行波形的记录与分析三.实验步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真四.运行结果五.总结本次实验让我更加的熟悉modelsim使用方法,以及使用时应该注意的问题。
在试验中也学习到了Verilog语法。
在实验中我们应该注意verilog的格式要求,在用编程语言编程的时候,要自习留意语法标准,整理好逻辑思维的同时保证格式的正确。
否则就会浪费大量的时间来完成实验。
试验开始到结束这一过程中,我遇到了很多困难,后来都在同学的提醒和帮助下克服了。
相信有了这次对这个语言和这个软件的接触,我们都有了更加深入的理解。
六.源代码module mux41(a,b,c,d,s1,s0,out);input[1:0] a,b,c,d;input s1,s0;output[1:0] out;reg[1:0] out;always @(a or b or c or d or s1 or s0)begin :mux41case({s1,s0})2'b00: out<=a;2'b01: out<=b;2'b10: out<=c;2'b11: out<=d;default: out=a;endcaseendendmodulemodule sti;reg[1:0] a,b,c,d;reg s0,s1;wire[1:0] out;mux41 dtg(a,b,c,d,s0,s1,out);initialbegina=3'd0;b=3'd1;c=3'd2;d=3'd3;s0=0;s1=0;#100 a=3'd0;b=3'd1;c=3'd2;d=3'd3;s0=0;s1=1;#100 a=3'd0;b=3'd1;c=3'd2;d=3'd3;s0=1;s1=0;#100 a=3'd0;b=3'd1;c=3'd2;d=3'd3;s0=1;s1=1;endendmodule实验二、Verilog HDL设计分频器及计数器一.实验目的及实验环境1)实验目的1、掌握较复杂数字电路或系统的纯Verilog HDL实现方法;2、体会纯Verilog HDL语言输入设计与原理图输入设计的差别;3、更加熟练的使用modelsim软件;2)实验环境计算机一台,使用modelsim软件进行实验仿真3)实验内容1、使用modelsim设计二分频器;2、使用modelsim设计模8计数器;三.测试数据及运行结果1、分频器正常测试数据(3组)及运行结果;2、计数器正常测试数据(3组)及运行结果通过本次实验,进一步熟悉并加深了对verilong语言的认识,初步运用并熟悉了整个程序及操作,加深对分频器的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog HDL数字系统设计实验报告汇总任课教师实验者姓名学号实验指导教师Verilog HDL 数字系统设计报告 1 姓名 学号 时间 地点实验题目 阻塞赋值与非阻塞赋值的区别一. 实验目的与要求(1) 通过实验,掌握阻塞赋值与非阻塞赋值的概念与区别; (2) 了解非阻塞赋值和阻塞赋值的不同使用场合; (3) 学习测试模块的编写,综合和不同层次的仿真。
二.实验环境仿真软件:modlsim6.2SE三.实验内容阻塞赋值与非阻塞赋值,在教材中已经了解了他们之间在语法上的区别以及综合后所得到的评 阅电路结构上的区别。
在always块中,阻塞赋值可以理解为赋值语句是并发执行的。
时序逻辑设计中,通常都使用非阻塞赋值语句,而在实现组合逻辑的assign结构中,或者always快结构中都必须采用阻塞赋值语句。
四.系统框图五.实验波形图六.实验体会(1)一开始使用modelsimSE6.2时候不知道建立工作区的方法。
后面请教了毕老师才知道如何来建立工作区。
(2)编译时候错误看不懂,细心找才发现‘ ` 两个符号有区别(3)波形找不到,后来发现时没有放大。
七.代码附录:源代码:// ---------- 模块源代码:----------------------// ------------- blocking.v ---------------module blocking(clk,a,b,c);output [3:0] b,c;input [3:0] a;input clk;reg [3:0] b,c;always @(posedge clk)begin b = a;c = b;$display("Blocking: a = %d, b = %d, c = %d ",a,b,c);endendmodule//------------- non_blocking.v -------------------module non_blocking(clk,a,b,c);output [3:0] b,c;input [3:0] a;input clk;reg [3:0] b,c;always @(posedge clk)beginb <= a;c <= b;$display("Non_Blocking: a = %d, b = %d, c = %d ",a,b,c); endendmodule测试模块:// ---------- 测试模块源代码:--------------------------//------------- compareTop.v -----------------------------`timescale 1ns/100ps`include "./blocking.v"`include "./non_blocking.v"module compareTop;wire [3:0] b1,c1,b2,c2;reg [3:0] a;reg clk;initialbeginclk = 0;forever #50 clk = ~clk; //思考:如果在本句后还有语句,能否执行?为什么?endinitialbegina = 4'h3;$display("____________________________");# 100 a = 4'h7;$display("____________________________");# 100 a = 4'hf;$display("____________________________");# 100 a = 4'ha;$display("____________________________");# 100 a = 4'h2;$display("____________________________");# 100 $display("____________________________");$stop;endnon_blocking non_blocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmoduleVerilog HDL 数字系统设计报告 2姓名 学号 时间 地点实验题目 利用状态机实现比较复杂的接口设计一:实验目的与要求(1)学习运用由状态机控制的逻辑开关,设计出一个比较复杂的接口逻辑; (2)在复杂设计中使用任务(task)结构,以提高程序的可读性; (3)加深对可综合风格模块的认识。
二.实验环境仿真软件:modlsim6.2SE三.实验内容评 阅设计一个并行数据转换为串行位流的变换器,利用双向总线输出。
(1)把并行地址存入寄存器。
(2)把并行数据存入寄存器。
(3)连接串行单总线(4)地址的串行输出(5)数据的串行输出(6)给信号源应答(7)让信号源给出下一个操作对象(8)结束操作四.系统框图inputs outputs 状态译码器状态寄存器输出译码器clk五.实验波形图六.实验体会(1)实验代码很长,在检验的时候由于注前面的中文注释用的空格是中文空格而导致了程序的错误,还有begin end 的模块没有匹配,少了end也导致了程序的错误。
(2)在start simuiation时候,第一次忘了把enable optimization勾打掉,让其最优化设计,导致波形输出不对。
后来才修正了这个错误。
七.代码附录://--------- 模块源代码:----------------------------module writing(reset,clk,address,data,sda,ack);input reset,clk;input[7:0] data,address;output sda,ack;//sda负责串行数据输出;//ack是一个对象操作完毕后,模块给出的应答信号。
reg link_write;//link_write 决定何时输出。
reg[3:0] state;//主状态机的状态字。
reg[4:0] sh8out_state;//从状态机的状态字。
reg[7:0] sh8out_buf; //输入数据缓冲。
reg finish_F; //用以判断是否处理完一个操作对象。
reg ack;parameteridle=0,addr_write=1,data_write=2,stop_ack=3;parameterbit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;assign sda = link_write? sh8out_buf[7] : 1'bz;always @(posedge clk)beginif(!reset) //复位。
beginlink_write<= 0; //挂起串行单总线state <= idle;finish_F <= 0; //结束标志清零sh8out_state<=idle;ack<= 0;sh8out_buf<=0;endelsecase(state)idle:beginlink_write <= 0; //断开串行单总线finish_F <= 0;sh8out_state<=idle;ack<= 0;sh8out_buf<=address; //并行地址存入寄存器state <= addr_write; //进入下一个状态endaddr_write: //地址的输入。
beginif(finish_F==0)begin shift8_out; end //地址的串行输出elsebeginsh8out_state <= idle;sh8out_buf <= data; //并行数据存入寄存器state <= data_write;finish_F <= 0;endenddata_write: //数据的写入。
beginif(finish_F==0)begin shift8_out; end //数据的串行输出elsebeginlink_write <= 0;state <= stop_ack;finish_F <= 0;ack <= 1; //向信号源发出应答。
endendstop_ack: //向信号源发出应答结束。
beginack <= 0;state <= idle;endendcaseendtask shift8_out; // 地址和数据的串行输出。
begincase(sh8out_state)idle:beginlink_write <= 1; //连接串行单总线,立即输出地址或数据的最高位(MSB)sh8out_state <= bit7;endbit7:beginlink_write <= 1; //连接串行单总线sh8out_state <= bit6;sh8out_buf <= sh8out_buf<<1; //输出地址或数据的次高位(bit 6)endbit6:beginsh8out_state<=bit5;sh8out_buf<=sh8out_buf<<1;endbit5:beginsh8out_state<=bit4;sh8out_buf<=sh8out_buf<<1;endbit4:beginsh8out_state<=bit3;sh8out_buf<=sh8out_buf<<1;endbit3:beginsh8out_state<=bit2;sh8out_buf<=sh8out_buf<<1;endbit2:beginsh8out_state<=bit1;sh8out_buf<=sh8out_buf<<1;endbit1:beginsh8out_state<=bit0;sh8out_buf<=sh8out_buf<<1; //输出地址或数据的最低位(LSB)endbit0:beginlink_write<= 0; //挂起串行单总线finish_F<= 1; //建立结束标志endendcaseendendtaskendmodule// ------------- 测试模块源代码:----------------`timescale 1ns/100ps`define clk_cycle 50module writingTop;reg reset,clk;reg[7:0] data,address;wire ack,sda;always #`clk_cycle clk = ~clk;initialbeginclk=0;reset=1;data=0;address=0;#(2*`clk_cycle) reset=0;#(2*`clk_cycle) reset=1;#(100*`clk_cycle) $stop;endalways @(posedge ack) //接收到应答信号后,给出下一个处理对象。