基于modelsim的十个Verilog入门试验程序(3)(顺序排列+二进制除法器)—程序+测试代码+波形+结果分析

内容
实验一:7人表决器的设计
实验二:算数逻辑单元的设计
实验三:JK触发器的设计
实验四:环形计数器的设计
实验五:顺序排列的设计
实验六:二进制除法器的设计
实验七:数字显示频率计的设计
实验八:序列检测器的设计
实验九:数字秒表的设计
实验十:自助售票机的设计

实验五:顺序排列的设计
编设a,b,c,d四个数,按从小到大的顺序重新排列并输出到ra,rb,rc,rd中。
要求:(1)需在Verilog HDL描述中使用任务(task)。

//程序:
module order(a, b, c, d, ra, rb, rc, rd);
input[3:0] a, b, c, d;
output reg[3:0] ra, rb, rc, rd;
reg[3:0] i, j, k, q;
always@ (a or b or c or d)
begin
	compare2(a, b, i, j); 
	compare2(c, d, k, q); 
	compare2(i, k, ra, rb);
	compare2(j, q, rc, rd); 
end
task compare2;
input[3:0] in_x, in_y;
output[3:0] out_rx, out_ry;
begin 
	if(in_x<= in_y)
	{ out_rx, out_ry}= { in_x, in_y};
	else
	{ out_rx, out_ry}= { in_y, in_x};
end
endtask
endmodule

//测试代码:
`timescale 1ns/ 1ns
module order_tb;
reg [3:0] a, b, c, d;
wire[3:0] ra, rb, rc, rd;

order u1(.a(a), .b(b), .c(c), .d(d),
	 .ra(ra), .rb(rb), .rc(rc), .rd(rd));

initial
begin
	 a<=0; b<=0; c<=0; d<=0;
	#10 a<=6; b<=9; c<=2; d<=8;
	#10 a<=1; b<=4; c<=1; d<=5;
	#10 a<=3; b<=8; c<=5; d<=0;
	#10 a<=8; b<=0; c<=3; d<=7;
	#10 a<=6; b<=6; c<=6; d<=6;
end
endmodule

波形仿真
《基于modelsim的十个Verilog入门试验程序(3)(顺序排列+二进制除法器)—程序+测试代码+波形+结果分析》
结果分析:
数值比较器,对输入的四个数重新排序,以从小到大的顺序输出,输入四个变量,输出四个变量。
用task函数对2个数比较大小后排序,在主函数中调用4此task函数实现4个数的大小排序
测试程序对5组无序数列进行排序,仿真结果符合预期,测试波形如下图所示。

实验六:二进制除法器的设计

//程序:
module div(input[7:0] a, input[3:0] b, output reg [7:0] yshang, output reg [7:0] yyushu );  
reg[7:0] tempa, tempb;
reg[15:0] temp_a, temp_b;   
integer i;  
always @(a or b)  
begin tempa <= a;  tempb <= { 4'b0000,b}; end always @(tempa or tempb) begin temp_a = {8'b00000000,a};  
    temp_b = { 4'b0000,b,8'b00000000};   
    for(i = 0;i < 8;i = i + 1)  
      begin  temp_a = temp_a<<1;  
      if(temp_a[15:8] >= tempb)  
        temp_a = temp_a - temp_b + 1'b1; 
 else  temp_a = temp_a; end  
    yshang <= temp_a[7:0];  
yyushu <= temp_a[15:8];  
end  
endmodule  


//测试代码:
`timescale 1ns/1ns  
module div_tb;    
reg [7:0] a;  
reg [3:0] b;  
wire [7:0] yshang;  
wire [7:0] yyushu; 
initial  
begin  
    #10 a=8'b00001111;b=4'b1000; 
    #100 a=8'b11111111;b=4'b1010;
    #100 a=8'b11110000;b=4'b1000; 
    #100 a=8'b11111100;b=4'b1011; 
end  
div u1 (.a(a),.b(b),.yshang(yshang),.yyushu(yyushu));  
endmodule  

波形仿真:《基于modelsim的十个Verilog入门试验程序(3)(顺序排列+二进制除法器)—程序+测试代码+波形+结果分析》
结果分析:
计算机所能完成的最基本操作是加减法和左右移;
应该使用位移运算来取代除法运算;
二进制除法的原理与在十进制时差不多,但实现起来要比二进制乘法稍微复杂一些;结果如波形

    原文作者:也许只有四五次
    原文地址: https://blog.csdn.net/weixin_42672920/article/details/117631541
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞