组合逻辑电路实验报告
数字电子技术实验报告 实验名称:组合逻辑电路 班级 姓名学号
实验日期 年月日交报告日期年月日 组合逻辑电路
一、设计要求
1.使用HDL设计一个新的逻辑功能并验证,比如 。 2.设计一个4选1多路选择器,并在开发板上验证。
3.完成4位数码管动态显示设计,实现将8个SW输入的两位十六进制数对应的8421BCD码,显示在数码管上。 二、实验内容
任务1:实现逻辑功能 (1)HDL源文件——ge.v
module ge(
input a, input b, input c, input d,
output[0:0]z );
assign z[0]=~((a&b)|(c&d)); endmodule
(2)约束文件——ge.ucf
NET"a"LOC=P11; //SW0 NET"b"LOC=L3; //SW1 NET"c"LOC=K3; //SW2 NET"d"LOC=B4; //SW3 NET"z[0]"LOC=M5; //LD0 (3)仿真文件——test_ge.v
initial begin
a = 0;b = 0;c = 0;d = 0;
// Wait 100 ns for global reset to finish #100
a
a
a
a
#200
a
a
a
a
a
a
a
a
a
a
a
a
(4)仿真波形
分析:由仿真波形可见,所以程序实现了。 (5
任务2:4选1多路选择器的设计与验证 (1)HDL源文件——ge1.v
module ge1(
input wire a0,
input wire a1, input wire a2, input wire a3, input wire s1, input wire s0, output wire y );
assign y=(a0&(~s1)&(~s0))|(a1&(~s1)&s0)|(a2&s1&(~s0))|(a3&s0&s1); endmodule
(2)约束文件——ge1.ucf NET"a0"=P11; //SW0 NET"a1"=L3; //SW1 NET"a2"=K3; //SW2 NET"a3"=B4; //SW3 NET"s1"=G3; //SW4 NET"s0"=F3; //SW5 (3)仿真文件——test_ge1.v initial begin // Initialize Inputs a0=0;a1=0;a2=0;a3=0;s1=0;s0=0; // Wait 100 ns for global reset to finish #100 a0
(4)仿真波形:
分析:当s0=0,s1=0时,则y输出为a0的值,与a1,a2,a3值无关; 当s0=1,s1=0时,则y输出为a1的值,与a0,a2,a3值无关; 当s0=0,s1=1时,则y输出为a2的值,与a0,a1,a3值无关; 当s0=1,s1=1时,则y输出为a3的值,与a0,a1,a2值无关;
任务3:4位数码管动态显示设计 (1)HDL源文件——ge2.v
module ge2(
input wire[7:0]x, input wire clk, input wire clr,
output reg[6:0]a_to_g, output reg[3:0]an
);
wire[1:0] s; reg[3:0] digit; reg[19:0] clkdiv;
assign s=clkdiv[19:18];
always @(*) case(s)
0:if(x[3:0]>=4'b1010)digit=x[3:0]-4'b1010; else digit=x[3:0];
1:if(x[3:0]>=4'b1010)digit=4'b0001; else digit=4'b0000;
2:if(x[7:4]>=4'b1010)digit=x[7:4]-4'b1010; else digit=x[7:4];
3:if(x[7:4]>=4'b1010)digit=4'b0001; else digit=4'b0000; default:digit=4'b0000;
endcase
always@(*) case(digit)
0:a_to_g=7'b0000001; 1:a_to_g=7'b1001111; 2:a_to_g=7'b0010010; 3:a_to_g=7'b0000110; 4:a_to_g=7'b1001100; 5:a_to_g=7'b0100100; 6:a_to_g=7'b0100000; 7:a_to_g=7'b0001111; 8:a_to_g=7'b0000000; 9:a_to_g=7'b0000100; default:a_to_g=7'b0000001; endcase always@(*) begin
an=4'b1111; an[s]=0; end
always@(posedge clk or posedge clr) begin
if(clr==1) clkdiv
clkdiv
endmodule
(2)约束文件——ge2.ucf
NET"a_to_g[0]"LOC=M12; //数码管显示信号CG NET"a_to_g[1]"LOC=L13; //数码管显示信号CF NET"a_to_g[2]"LOC=P12; //数码管显示信号CE NET"a_to_g[3]"LOC=N11; //数码管显示信号CD NET"a_to_g[4]"LOC=N14; //数码管显示信号CC NET"a_to_g[5]"LOC=H12; //数码管显示信号CB NET"a_to_g[6]"LOC=L14; //数码管显示信号CA NET"an[3]"LOC=K14; //数码管显示信号AN0 NET"an[2]"LOC=M13; //数码管显示信号AN1 NET"an[1]"LOC=J12; //数码管显示信号AN2 NET"an[0]"LOC=F12; //数码管显示信号AN3 NET"clk"LOC=B8; //MCLK NET"clr"LOC=G12; //BTN0 NET"x[7]"LOC=N3; //SW7 NET"x[6]"LOC=E2; //SW6 NET"x[5]"LOC=F3; //SW5
NET"x[4]"LOC=G3; //SW4 NET"x[3]"LOC=B4; //SW3 NET"x[2]"LOC=K3; //SW2 NET"x[1]"LOC=L3; //SW1 NET"x[0]"LOC=P11; //SW0