EDA上机2:VERILOG HDL 基本模块设计

  • 2020-10-22
  • 272
  • 0

第2题:7 裁判电路设计

逻辑描述

三种不同的设计方式,实现7裁判电路设计。7位输入,1位输出,0表示不同意,1表示同意。

信号类型 变量数据类型及位宽 变量含义
input wire a,b,c,d,e,f,g 七个裁判的输入信号,1表示同意,0表示不同意
output wire out 输出信号,1表示同意,0表示不同意
内部变量 wire[2:0] sum 计数有几个裁判同意

模块代码

  • 方法一:assign语句:
module main(a,b,c,d,e,f,g,out); // 模块定义
    input a,b,c,d,e,f,g;    // 输入
    output out;     // 输出,1:表决通过,0:表决不通过
    wire[2:0] sum;
    assign sum=a+b+c+d+e+f+g;
    assign out=sum[2]?1:0;
endmodule
  • 方法二:模块调用
module main(a,out);
    output out;
    input[6:0] a;
    wire[2:0] out1;
    test lab001(a,out1);
    assign out=out1[2]?1:0;
endmodule
module test(a,out);//子模块定义
    input[6:0] a;
    output[2:0] out;
    assign out=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6];
endmodule
  • 方法三:always语句
module main(a,b,c,d,e,f,g,out);// 模块定义
    input a,b,c,d,e,f,g;// 7位输入,1:同意,0:不同意
    output out;// 输出,1:表决通过,0:表决不通过
    reg[2:0] sum;
    assign sum=a+b+c+d+e+f+g;  
    always@(a,b,c,d,e,f,g)
        begin
            if(sum[2]) out=1;
            else out=0;
        end
endmodule

测试代码

`timescale 1 ps/ 1 ps//自动生成大部分
module main_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg a;
reg b;
reg c;
reg d;
reg e;
reg f;
reg g;
// wires                                               
wire out;
integer i;
// assign statements (if any)                          
main i1 (
// port map - connection between master ports and signals/registers   
    .a(a),
    .b(b),
    .c(c),
    .d(d),
    .e(e),
    .f(f),
    .g(g),
    .out(out)
);
initial
    begin                                                  
        a=0; b=0; c=0; d=0; e=0; f=0; g=0;
        for(i=0;i<128;i=i+1) // 对应二进制 0000000~1111111
        begin
            a=(i/1)%2;
            b=(i/2)%2;
            c=(i/4)%2;
            d=(i/8)%2;
            e=(i/16)%2;
            f=(i/32)%2;
            g=(i/64)%2;
            #10;    // 延时
      end
      $display("Running testbench");
    end
initial
    $monitor($realtime,,,"input:%d %d %d %d %d %d %d  output:%d",a,b,c,d,e,f,g,out);
endmodule


测试结果

  • 波形图

  • 文本输出

image-20201016203958224

结果分析

经过文本输出与波形图显示检验,有四个及以上1输入时输出为1,否则输出为0,符合七裁判电路的要求。


第3题:8-3优先编码显示电路

逻辑描述

现在由7—-0(优先级高到低)八路输入(高电平1为有效电平),转换为3位二进制,进而转换为7位输出信号用于七段数码管的输出。

信号类型 变量数据类型及位宽 变量含义
input wire[7:0] in 8个输入
output reg[6:0] out 输出信号,用于七段数码管显示

模块代码

module main(in,out);
    input [7:0] in; // 8输入,1有效
    output reg[6:0] out;// 7输出,用于七段管十进制数的显示
    always@(in)
        begin//开始编码,由于是优先编码器,所以从高位开始判断 
            if(in[7])           
                out=7'b1111000; 
            else if(in[6])      
                out=7'b0000010; 
            else if(in[5])      
                out=7'b0010010; 
            else if(in[4])      
                out=7'b0011001; 
            else if(in[3])      
                out=7'b0110000; 
            else if(in[2])      
                out=7'b0100100; 
            else if(in[1])      
                out=7'b1111001; 
            else if(in[0])      
                out=7'b1000000; 
            else                
                out=7'b1111111; 
        end
endmodule

测试代码

`timescale 1 ps/ 1 ps
module main_vlg_tst();
    reg [7:0] in;                          
    wire [6:0] out; 
    integer i;

    main i1 (  
        .in(in),
        .out7(out)
    );
//上面都是自己生成的,莫改
    initial
        begin
            for(i=0;i<256;i=i+1)
                begin
                    // 十进制转二进制
                    in[0]=(i/1)%2;
                    in[1]=(i/2)%2;
                    in[2]=(i/4)%2;
                    in[3]=(i/8)%2;
                    in[4]=(i/16)%2;
                    in[5]=(i/32)%2;
                    in[6]=(i/64)%2;
                    in[7]=(i/128)%2;
                    #10;    //延时10ms
                end
        end  
    initial
        $monitor($realtime,,,"%b %b",in,out);                                        
endmodule

测试结果

  • 波形图

image-20201016212101282

  • 文本输出

image-20201016212123756

结果分析

经过文本输出与波形图显示检验,本模块可以将8路输入信号转换成用于七段数码管显示的7路输出信号,经过与七段数码管原理图对比,本模块检验正确。


第4题:二进制数显示电路

逻辑描述

将8个拨动开关作为8位并行输入,即对应数码为 00000000—11111111,十进制数值为0-255,将编码对应的十进制数值显示在三个七段管上。

信号类型 变量数据类型及位宽 变量含义
input wire[7:0] in 8路输入,高电平1为有效电平
output reg[6:0] out1,out2,out3 三个数码管显示
内部变量 wire[3:0] bai,shi,ge 分别保存百十个位的值

模块代码

module main(in,out1,out2,out3);
    input [7:0] in;      // 8路输入,高电平1为有效电平
    output reg[6:0] out1; //个位的数码管
    output reg[6:0] out2; // 十位的数码管
    output reg[6:0] out3; // 百位的数码管
    wire[3:0] bai;  
    wire[3:0] shi;  
    wire[3:0] ge;   

    assign ge=in%10;                     // 个位赋值
    assign shi=(in/10)%10;                // 十位赋值
    assign bai=in/100;                // 百位赋值

    always@(in)
        begin
            if(in<10)        
                begin
                    show(ge,out1);     // 第一个七段管 显示个位
                    out2=7'b1111111;        // 第二个七段管不显示
                    out3=7'b1111111;        // 第三个七段管不显示
                end
            else if(in<100)      
                begin
                    show(ge,out1);     // 第一个七段管 显示个位
                    show(shi,out2);     // 第二个七段管 显示十位
                    out3=7'b1111111;        // 第三个七段管不显示
                end
            else                
                begin
                    show(ge,out1);     // 第一个七段管 显示个位
                    show(shi,out2);     // 第二个七段管 显示十位
                    show(bai,out3); // 第三个七段管 显示百位
                end
        end

    task show;//参考周孟卿的代码
        input integer decc;                 // 输入,十进制数
        output reg[6:0] outt;               // 输出,7位二进制数值
        if(decc==0)      outt=7'b1000000;   // 七段管显示0
        else if(decc==1) outt=7'b1111001;   // 七段管显示1
        else if(decc==2) outt=7'b0100100;   // 七段管显示2
        else if(decc==3) outt=7'b0110000;   // 七段管显示3
        else if(decc==4) outt=7'b0011001;   // 七段管显示4
        else if(decc==5) outt=7'b0010010;   // 七段管显示5
        else if(decc==6) outt=7'b0000010;   // 七段管显示6
        else if(decc==7) outt=7'b1111000;   // 七段管显示7
        else if(decc==8) outt=7'b0000000;   // 七段管显示8
        else if(decc==9) outt=7'b0011000;   // 七段管显示9
        else             outt=7'b1111111;   // 七段管不显示
    endtask

endmodule

测试代码

`timescale 1 ps/ 1 ps
module main_vlg_tst();
    reg [7:0] in;    
    wire [6:0]  out1;
    wire [6:0]  out2;
    wire [6:0]  out3;

    integer i;
    main i1 (  
        .in(in),
        .out1(out1),
        .out2(out2),
        .out3(out3)
    );
    //以上为生成代码,以下是输入信号
    initial
        begin
            // i对应二进制 00000000~11111111(8位),用于遍历in所有情况
            for(i=0;i<256;i=i+1)
                begin
                    in[0]=(i/1)%2;
                    in[1]=(i/2)%2;
                    in[2]=(i/4)%2;
                    in[3]=(i/8)%2;
                    in[4]=(i/16)%2;
                    in[5]=(i/32)%2;
                    in[6]=(i/64)%2;
                    in[7]=(i/128)%2;
                    #10;    //延时10ms
                end
            $display("begin");
        end                                                      

    initial
        $monitor($realtime,,,"dec:%d    bit:%b %b %b",in,out3,out2,out1);  //监视器
endmodule

测试结果

  • 波形图

image-20201017102646352

  • 文本输出

image-20201017102656800

结果分析

经过文本输出与波形图显示检验,本模块可以将8路输入信号转换成3位十进制数,并通过三个七段数码管输出,符合要求。


第5题:8 位二进制乘法

逻辑描述

两个8位二进制数a,b,c=a*b;将输入a,b和结果c显示到七段管上。

信号类型 变量数据类型及位宽 变量含义
input wire[7:0] ina,inb 两个8路输入啊和b
output reg[6:0] out1,out2,out3,out4,out5 5个数码管显示
output reg[15:0] out a和b的乘积
output reg[3:0] result1,result2,result3,result4,result5 乘积的每一位

模块代码

module main(ina,inb,out,out1,out2,out3,out4,out5,result1,result2,result3,result4,result5); 
    input[7:0] ina;
    input[7:0] inb;
    output reg[3:0] result1;
    output reg[3:0] result2;
    output reg[3:0] result3;
    output reg[3:0] result4;
    output reg[3:0] result5;
    output reg[15:0] out;
    output reg[6:0] out1;
    output reg[6:0] out2;
    output reg[6:0] out3;
    output reg[6:0] out4;
    output reg[6:0] out5;
    always@(ina,inb)
    begin
        out=ina*inb;    
        result1=out/10000;
        result2=out/1000%10;
        result3=out/100%10;
        result4=out/10%10;
        result5=out%10;

        if(out<=9)
            begin
                out1=7'b1111111;
                out2=7'b1111111;
                out3=7'b1111111;
                out4=7'b1111111;
                show(result5,out5);
            end
        else if(out<=99)
            begin
                out1=7'b1111111;
                out2=7'b1111111;
                out3=7'b1111111;
                show(result4,out4);
                show(result5,out5);
            end
        else if(out<=999)
            begin
                out1=7'b1111111;
                out2=7'b1111111;
                show(result3,out3);
                show(result4,out4);
                show(result5,out5);
            end
        else if(out<=9999)
            begin
                out1=7'b1111111;
                show(result2,out2);
                show(result3,out3);
                show(result4,out4);
                show(result5,out5);
            end
        else
            begin
                show(result1,out1);
                show(result2,out2);
                show(result3,out3);
                show(result4,out4);
                show(result5,out5);
            end
    end 

    task show;
        input integer result;
        output[6:0] out;
        if(result==0) out=7'b0111111; 
          else if(result==1) out=7'b0000110;
          else if(result==2) out=7'b1011011;
        else if(result==3) out=7'b1001111;
        else if(result==4) out=7'b1100110;
        else if(result==5) out=7'b1101101;
        else if(result==6) out=7'b1111101;
        else if(result==7) out=7'b0000111;
        else if(result==8) out=7'b1111111;
        else if(result==9) out=7'b1100111;
        else out=7'b1111111;   
    endtask
endmodule 

测试代码

`timescale 1 ps/ 1 ps
module main_vlg_tst();
reg eachvec;
reg [7:0] ina;
reg [7:0] inb;                                            
wire [6:0]  out1;
wire [6:0]  out2;
wire [6:0]  out3;
wire [6:0]  out4;
wire [6:0]  out5;
wire [15:0]  out;
wire [3:0]  result1;
wire [3:0]  result2;
wire [3:0]  result3;
wire [3:0]  result4;
wire [3:0]  result5;

integer i,j;//添加变量

main i1 (

    .ina(ina),
    .inb(inb),
    .out1(out1),
    .out2(out2),
    .out3(out3),
    .out4(out4),
    .out5(out5),
    .out(out),
    .result1(result1),
    .result2(result2),
    .result3(result3),
    .result4(result4),
    .result5(result5)
);

    //以上为自动生成,以下为输入信号
initial                                                
begin            
for(i=0;i<256;i=i+1)
begin
    inb=i;
    for(j=0;j<256;j=j+1)
    begin
        ina=j;
        #10;
    end
end                                               
    $display("begin");                       
end                                                    
 initial                                                     
$monitor($realtime,,,"ina: %b inb: %b out1: %b out2: %b out3: %b out4: %b out5: %b out: %d result1: %d result2: %d result3: %d result4: %d result5: %d",ina,inb,out1,out2,out3,out4,out5,out,result1,result2,result3,result4,result5);                                                                                                     
endmodule

测试结果

  • 波形图

image-20201017220618960

  • 文本输出

image-20201017220634908

结果分析

经过文本输出与波形图显示检验,本模块可以将两路8位输入相乘得到一个最多五位十进制的数字,并通过5个七段数码管输出,符合要求。

评论

还没有任何评论,你来说两句吧!

发表评论

     

鲁ICP备20004960号-3