练习十 通过模块实例调用实现大型系统设计

源代码

`timescale 1ns / 1ps
`define YES  1
`define  NO  0
//
// Company: 
// Engineer: 
// 
// Create Date:    14:40:24 07/31/2019 
// Design Name: 
// Module Name:    S_P 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 把在位流有效信号控制下的字节位流读入模块,在时钟节拍控制下
//						转换为并行的字节数据,输出到并行数据口
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module S_P(
				data,      
				Dbit_in,    
				Dbit_ena,    
				clk
    );
	output [7:0]data;   //并行数据输出口
	input Dbit_in,clk;   //字节位流输入口
	input Dbit_ena;     //字节位流使能输入口
	
	reg [7:0]data_buf;   //
	reg [3:0]state;      //状态变量寄存器
	reg p_out_link;      //并行输出控制寄存器
	
	assign data = (p_out_link == `YES) ? data_buf : 8'bz;
	
	always @(negedge clk)
		if(Dbit_ena)
			case(state)
				0 :	begin
							p_out_link <= `NO;
							data_buf[7] <= Dbit_in;
							state <= 1;
						end
				1 :	begin
							data_buf[6] <= Dbit_in;
							state <= 2;
						end
				2 :	begin
							data_buf[5] <= Dbit_in;
							state <= 3;
						end
				3 :	begin
							data_buf[4] <= Dbit_in;
							state <= 4;
						end
				4 :	begin
							data_buf[3] <= Dbit_in;
							state <= 5;
						end
				5 :	begin
							data_buf[2] <= Dbit_in;
							state <= 6;
						end
				6 :	begin
							data_buf[1] <= Dbit_in;
							state <= 7;
						end
				7 :	begin
							data_buf[0] <= Dbit_in;
							state <= 8;
						end
				8 :	begin
							p_out_link <= `YES;
							state <= 4'b1111;
						end
				default :	state <= 0;
			endcase
		else
			begin
				p_out_link <= `YES;
				state <= 0;
			end

endmodule

`timescale 1ns / 1ps

`define YES 1
`define NO  0
//
// Company: 
// Engineer: 
// 
// Create Date:    13:54:41 07/31/2019 
// Design Name: 
// Module Name:    P_S 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 把在nGet_AD_data 负跳变沿时刻后能维持约三个时钟周期的
//						并行字节数据取入模块,在时钟节拍下转换为字节的位流,并产生相应字节位流的有效信号
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module P_S(
				Dbit_out,
				link_S_out,
				data,
				nGet_AD_data,
				clk
    );
	input clk;	         //主时钟节拍
	input nGet_AD_data;  //负电平有效时取并行数据控制信号线
	input [7:0]data;     //并行输入的数据端口
	output Dbit_out;     //串行位流输出
	output link_S_out;    //允许串行位流输出的控制信号
	
	reg [3:0]state;     //状态变量寄存器
	reg [7:0]data_buf;  //并行数据缓存器
	reg link_S_out;     //串行位流输出的控制信号寄存器
	reg d_buf;        //位缓存器
	reg finish_flag;   //字节处理结束标志
	
	assign  Dbit_out = (link_S_out) ? d_buf : 0;    //给出串行数据
	
	always @(posedge clk or negedge nGet_AD_data)
	//nGet_AD_data下降沿置数,寄存器清零,clk上跳沿送出位流
		if(!nGet_AD_data)
			begin
				finish_flag <= 0;
				state <= 9;
				link_S_out <= `NO;
				d_buf <= 0;
				data_buf <= 0;
			end
		else
			case(state)
				9 :	begin
							data_buf <= data;
							state <= 10;
							link_S_out <= `NO;
						end
				10 :	begin
							data_buf <= data;
							state <= 0;
							link_S_out <= `NO;
						end
				0 :	begin
							link_S_out <= `YES;
							d_buf <= data_buf[7];
							state <= 1;
						end
				1 :	begin
							d_buf <= data_buf[6];
							state <= 2;
						end
				2 :	begin
							d_buf <= data_buf[5];
							state <= 3;
						end
				3 :	begin
							d_buf <= data_buf[4];
							state <= 4;
						end
				4 :	begin
							d_buf <= data_buf[3];
							state <= 5;
						end
				5 :	begin
							d_buf <= data_buf[2];
							state <= 6;
						end
				6 :	begin
							d_buf <= data_buf[1];
							state <= 7;
						end
				7 :	begin
							d_buf <= data_buf[0];
							state <= 8;
						end
				8 :	begin
							link_S_out <= `NO;
							state <= 4'b1111;     //do nothing state
							finish_flag <= 1;
						end	
				default :	begin
									link_S_out <= `NO;
									state <= 4'b1111;	//do nothing state
								end
			endcase
						
				

endmodule

`timescale 1ns / 1ps
`include "./P_S.v"
`include "./S_P.v"
//
// Company: 
// Engineer: 
// 
// Create Date:    14:57:00 07/31/2019 
// Design Name: 
// Module Name:    sys 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 把两个独立的逻辑模块合并到一个可综合的模块中,共用一条并行总线
//							配合有关信号,分时进行输入输出
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module sys(
			databus,
			use_p_in_bus,
			Dbit_out,
			Dbit_ena,
			nGet_AD_data,
			clk
    );
	 input nGet_AD_data;
	 input use_p_in_bus;
	 input clk;
	 inout [7:0]databus;
	 output Dbit_out;
	 output Dbit_ena;
	 
	 wire clk;
	 wire nGet_AD_data;
	 wire Dbit_out;
	 wire Dbit_ena;
	 wire [7:0]data;
	 assign databus = (!use_p_in_bus) ? data : 8'bzzzz_zzzz;
	 
	 P_S  m0(.Dbit_out(Dbit_out),.link_S_out(Dbit_ena),.data(databus),
					.nGet_AD_data(nGet_AD_data),.clk(clk));
	S_P	m1(.data(data),.Dbit_in(Dbit_out),.Dbit_ena(Dbit_ena),.clk(clk));


endmodule

测试代码

`timescale 1ns / 1ns


// Company: 
// Engineer:
//
// Create Date:   15:23:37 07/31/2019
// Design Name:   sys
// Module Name:   D:/FPGA/project/pssp_test/testbench/Top.v
// Project Name:  pssp_test
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: sys
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 


module Top;

	// Inputs
	
	reg nGet_AD_data;
	reg clk;

	reg [7:0]data_buf;
	reg D_Pin_ena;   //并行数据输入sys模块的使能信号寄存器
	// Outputs
	wire Dbit_out;
	wire Dbit_ena;

	wire [7:0]data;
	wire clk2;
	
	assign data = (D_Pin_ena) ? data_buf : 8'bz;
	
	
	

	// Instantiate the Unit Under Test (UUT)
	sys uut (
		.databus(data), 
		.use_p_in_bus(D_Pin_ena), 
		.Dbit_out(Dbit_out), 
		.Dbit_ena(Dbit_ena), 
		.nGet_AD_data(nGet_AD_data), 
		.clk(clk)
	);

	initial 
		begin
			// Initialize Inputs
			nGet_AD_data = 1;    //置取数据控制信号初始值为高电平
			clk = 0;
			data_buf = 8'b1001_1001;   //假设数据缓存器的初始值,可用于模拟并行数据的变化
			D_Pin_ena = 0;
		end
	
	initial
		begin
			repeat(100)
				begin
					#(100*14 + {$random}%23) nGet_AD_data = 0;//取并行数据开始
					#(112 + {$random}%12)	nGet_AD_data = 1; //	保持一定时间低电平后恢复高电平
					#({$random}%50)	D_Pin_ena = 1;  //并行数据输入sys模块的使能信号有效
					#(100*3+{$random}%5)	D_Pin_ena = 0;  //保持三个时钟周期后让出总线
					#333	data_buf = data_buf+1;  //假设数据变化,可为下次取得不同的数据
					#(100*11+{$random}%1000);   //
				end
		end
	always #(50 + $random%2) 	clk = ~clk;  //主时钟的产生
	
	
				
		

	
      
endmodule


布线后波形仿真

在这里插入图片描述

如何布线后仿真

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值