当前位置:文档之家› verilog hdl 实验报告

verilog hdl 实验报告

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) //接收到应答信号后,给出下一个处理对象。

相关主题