可编程FPGA数字系统设计实验指导书 - 图文(7)

2019-05-24 11:21

always #10 clk = ~clk; always @(posedge clk)

data={data[22:0],data[23]}; initial begin clk=0; rst=1; #2 rst=0; #30 rst=1; data ='b1100_1001_0000_1001_0100; #500 $stop; end seqdet m(x,z,clk,rst,state);

endmodule

3,设计题

设计一个串行数据检测器。要求是:连续4个或4个以上的1时输出为1,其他输入情况下为0。编写测试模块并给出仿真波形。

四、实验报告要求

1、简要描述Verilog HDL中状态机的相关概念和设计要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和QuatusII环境下综合得到RTL级电路图; 3、实验报告应附硬件仿真的波形或显示的照片。

3 1

实验五 基于模块多层次引用的结构化电路设计 一 、实验目的

1、了解复杂电路与系统的“top-down”设计思想; 2、掌握简单多层次电路的描述方法。

二、实验原理、内容及步骤

1、多层次结构电路的设计

复杂数字系统可采用“top-down”的方法进行设计:首先把系统分为几个模块,每个模块在分为几个子模块,依次类推,知道易于实现为止。

这种“top-down”的方法能够把复杂的设计分为许多简单的设计来实现,同时也适合于多人进行合作开发。

多层次结构电路的描述既可以采用文本方式,也可以采用图形和文本混合设计的方式。 被调用模块的指定方式:1)文件复制方式;2)使用`include语句;3)库管理方式。 2、 设计实例分析

这个实例的功能是将并行数据转化为串行数据送交外部电路编码,并将解码后得到的串行数据转化为并行数据交由CPU处理。显而易见,这实际上是两个独立的逻辑功能,分别设计为独立的模块,然后再合并为一个模块显得目的明确、层次清晰。

模块源代码

// ---------------- p_to_s.v --------------------------------- module p_to_s(D_in,T0,data,SEND,ESC,ADD_100); output D_in,T0; // D_in是串行输出,T0是移位时钟并给 // CPU中断,以确定何时给出下个数据。 input [7:0] data; //并行输入的数据。 input SEND,ESC,ADD_100; //SEND、ESC共同决定是否进行并到串 //的数据转化。ADD_100决定何时置数。 wire D_in,T0; reg [7:0] DATA_Q,DATA_Q_buf; assign T0 = ! (SEND & ESC); //形成移位时钟。. assign D_in = DATA_Q[7]; //给出串行数据。 always @(posedge T0 or negedge ADD_100) //ADD_100下沿置数,T0上沿移位。 begin if(!ADD_100) DATA_Q = data; else begin DATA_Q_buf = DATA_Q<<1; //DATA_Q_buf作为中介,以令综合器 DATA_Q = DATA_Q_buf; //能辨明。 end end

3 2

endmodule

在p_to_s.v中,由于移位运算虽然可综合,但是不是简单的RTL级描述,直接用DATA_Q<=DATA_Q<<1的写法在综合时会令综合器产生误解。另外,在该设计中,由于时钟T0的频率较低,所以没有象以往那样采用低电平置数,而是采用ADD_100的下降沿置数。

//--------------------- s_to_p.v ---------------------------

module s_to_p(T1, data, D_out,DSC,TAKE,ADD_101);

output T1; //给CPU中断,以确定CPU何时取转化 //得到的并行数据。 output [7:0] data;

input D_out, DSC, TAKE, ADD_101; //D_out提供输入串行数据。DSC、TAKE //共同决定何时取数。 wire [7:0] data;

wire T1,clk2;

reg [7:0] data_latch, data_latch_buf;

assign clk2 = DSC & TAKE ; //提供移位时钟。 assign T1 = !clk2;

assign data = (!ADD_101) ? data_latch : 8'bz; always @(posedge clk2) begin

data_latch_buf = data_latch << 1; //data_latch_buf作缓冲 data_latch = data_latch_buf; //,以令综合器能辩明。 data_latch[0] = D_out; end

endmodule

将上面的两个模块合并起来的sys.v的源代码: //------------------- sys.v --------------------------- `include \`include \

module sys(D_in,T0,T1, data, D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101); input D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101; inout [7:0] data; output D_in,T0,T1; p_to_s

p_to_s(.D_in(D_in),.T0(T0),.data(data),.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100)); s_to_p

s_to_p(.T1(T1),.data(data),.D_out(D_out),.DSC(DSC),.TAKE(TAKE),.ADD_101(ADD_101)); endmodule

测试模块源代码:

//-------------Top test file for sys.v ------------------ `timescale 1ns/100ps `include \module Top; reg D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101; reg[7:0] data_buf; wire [7:0] data;

3 3

wire clk2; assign data = (ADD_101) ? data_buf : 8'bz;

//data在sys中是inout型变量,ADD_101 //控制data是作为输入还是进行输出。 assign clk2 =DSC && TAKE; initial begin SEND = 0; ESC = 0; DSC = 1; TAKE = 1; ADD_100 = 1; ADD_101 = 1; end initial begin data_buf = 8'b10000001; #90 ADD_100 = 0; #100 ADD_100 = 1; end always begin #50; SEND = ~SEND; ESC = ~ESC; end initial begin #1500 ; SEND = 0; ESC = 0; DSC = 1; TAKE = 1; ADD_100 = 1; ADD_101 = 1; D_out = 0; #1150 ADD_101 = 0; #100 ADD_101 =1; #100 $stop; end always begin #50 ; DSC = ~DSC; TAKE = ~TAKE; end

3

4

always @(negedge clk2) D_out = ~D_out;

sys sys(.D_in(D_in),.T0(T0),.T1(T1),.data(data),.D_out(D_out),

.ADD_101(ADD_101), .SEND(SEND),.ESC(ESC),.DSC(DSC),

.TAKE(TAKE),.ADD_100(ADD_100)); endmodule

3,设计题

1、设计一个序列发生器。要求根据输入的8位并行数据输出串行数据,如果输入数据在0—127之间则输出一位0,如果输入数据在128—255之间则输出一位1,同步时钟触发;并且和范例8的序列检测器搭接,形成一个封闭系统。编写测试模块,并给出仿真波形。

四、实验报告要求

1、简要描述Verilog HDL中基于模块多层次引用的结构化电路设计要点;

2、实验报告应包括Modelsim环境下仿真得到的波形和QuatusII环境下综合得到RTL级电路图; 3、实验报告应附硬件仿真的波形或显示的照片。

3 5


可编程FPGA数字系统设计实验指导书 - 图文(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:国家电网国网招聘综合能力测试考试笔试题内容试卷历年考试真题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: