一、实验目的及要求 1.掌握用always语句实现组合逻辑电路; 2.学习测试模块中随机数的产生和应用; 3.每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位) 或输入数据发生变化时,输出数据也相应地变化。 二、实验设备(环境)及要求 1.实验设备:PC机一台 2.环境要求:安装Modelsim仿真软件以及Synplify Pro综合工具 三、实验内容与步骤 1.根据实验要求编写源代码mux_8.v如下 /** * @File mux_8.v * @Synopsis 每路输入数据与输出数据均为4位2进制数,当选择开关 * (至少3位)或输入数据发生变化时,输出数据也相应地变化。 * @Author mouter.net@gmail.com * @Version 1 * @Date 2010-11-05 */ /* Copyright(C) 2010- * By * All right reserved */
module mux_8(addr, in1, in2, in3, in4, in5,in6,in7,in8,mout,ncs); input [2:0] addr;
//输入的地址端,3位选择开关
input [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //8路数据端输入 input ncs;
//使能信号
//一路输出
output [3:0] mout; reg [3:0] mout;
//输出声明为寄存器类型
always @(addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or ncs) //8路输入或者选择开关或者使能信号发生变化则条件触发 begin if(!ncs)
//低电平使能
case(addr)
3'b000: mout = in1; //选择开关的3位对应000时,输出等于in1输
入; 输入; 输入; 输入;
3'b100: mout = in5; //选择开关的3位对应100时,输出等于in1
3'b011: mout = in4; //选择开关的3位对应011时,输出等于in1
3'b010: mout = in3; //选择开关的3位对应010时,输出等于in1
3'b001: mout = in2; //选择开关的3位对应001时,输出等于in1
输入; 输入; 输入; 输入; endcase else
mout = 0;
//使能信号高电平时输出一直为0;
3'b111: mout = in8; //选择开关的3位对应111时,输出等于in1
3'b110: mout = in7; //选择开关的3位对应110时,输出等于in1
3'b101: mout = in6; //选择开关的3位对应101时,输出等于in1
end endmodule
2.编写测试模块test_mux_8.v如下 /** * @File
test_mux_8.v
* @Synopsis 这是8路数据选择器mux_8的测试模块 * @Author 陈昊, mouter.net@gmail.com * @Version 1 * @Date */
/* Copyright(0) 2010- * By
2010-11-05
* All right reserved */
`timescale 1ns/1ns module test_mux_8; wire[3:0] mout;
//声明输出为线网型,4位
reg [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //声明8路输入信号
reg [2:0] addr; reg ncs;
//-------------------------------------------------------------产生测试信号------------------------------------------------------ initial begin ncs=0; 选择器正常工作
in8={$random}%16; 至15之间的数
in1={$random}%16; in2={$random}%16; in3={$random}%16; in4={$random}%16;
//并赋予输入
//使用系统任务$random产生一个0
//在初始化模块里将使能信号置为0,让
//3位的选择开关,寄存型类型
//1位的寄存器型使能信号
in5={$random}%16; in6={$random}%16; in7={$random}%16; addr=3'b000; 000.
repeat(5) begin
#10 in8={$random}%16; in1={$random}%16; in2={$random}%16; in3={$random}%16; in4={$random}%16; in5={$random}%16; in6={$random}%16; in7={$random}%16; addr=addr+1; 开关的值,加1 end
#10 $stop; end
//-------------------------------------------------------------------
//每执行一次后改变一次选择
//重复下面的语句块5次,赋5次值
//让选择开关的3位初始对应为
------------------------------------------------------------ //--------------------------------------------------------实例引用被测试模块----------------------------------------------------- mux_8 example(.addr(addr),.in1(in1),.in2(in2),.in3(in3),.in4(in4),.in5(in5),.in6(in6),.in7(in7),.in8(in8),.mout(mout),.ncs(ncs)); //------------------------------------------------------------------------------------------------------------------------------- endmodule 3.利用Modelsim编译纠错和仿真 4.利用Synplify Pro进行综合 5.利用QuartusⅡ进行布局布线 四、实验结果与数据处理 1.Modelsim仿真波形如下,自上向下信号依次为a、b、qOut 2.选择Altera STRATIX器件库利用Synplify Pro综合产生的RTL级电路如下 3.使用Quatus II进行布局布线结果如下 4.使用Modelsim进行后仿真波形如下 五、分析与讨论 1.该8路数据选择器成功通过了综合和布局布线,分析发现,前仿真结果逻辑正确。 2.分析后仿真结果发现,电路延时较为严重,本次选择的数据数据在下一次数据来到之后才输出,需要对代码进行进一步优化。 六、教师评语 签名: 日期: 成绩
因篇幅问题不能全部显示,请点此查看更多更全内容