北航数字EDA实验1-8+数字去噪器

reg [3:0] temp;

always @(posedge clk)

begin if(!reset) result<=0;

else if (n[3]==0) begin result =1; for (temp={n[2],n[1],n[0]}; temp > 0; temp = temp - 1) result =times(result ,data); end else if (n[3]==1)

result = factorial(data); end

function [8:0] times; input [8:0] data1; input [8:0] data2; begin times = data1 * data2; end

endfunction

function [8:0] factorial; input [3:0] operand; reg [3:0] index; begin factorial = operand ? 1 : 0; for(index = 2; index <= operand; index = index + 1) factorial = index * factorial; end

endfunction

endmodule

`timescale 1ns/100ps `define clk_cycle 50

17

module six;

reg[3:0] data; reg[3:0] n; reg reset,clk; wire[8:0] result;

initial begin

data=0; reset=1; clk=0;

#100 reset=0; #100 reset=1;

#200 data=5; n=4'b0000; #200 n=4'b0001; #200 n=4'b0010; #200 n=4'b0011; #200 data=3; n=4'b1000; #200 data=5; n=4'b1000; #200 $stop; end

always #`clk_cycle clk=~clk;

funct m (.clk(clk),.data(data),.n(n),.result(result),.reset(reset));

endmodule

18

实验仿真:

19

练习七在Verilog HDL中使用任务(task)

实验目的:

(1)掌握任务在verilog模块设计中的应用;

(2)学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。

实验原理:

当我们希望能够将一些信号进行运算并输出多个结果时,采用函数结构就显得非常不方便,而任务结构在这方面的优势则十分突出。任务本身并不返回计算值,但它通过类似C语言中的形参与实参的数据变换,非常容易实现运算结果的调用。此外,还常常利用任务来包装模块设计中的许多复杂的过程,将许多复杂的操作步骤用一个命名清晰易懂的任务隐藏起来,大大提高程序可读性。

(1)任务和函数的不同

函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;函数不能启动任务但任务能启动其他任务和函数;函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;函数返回一个值,任务则不返回值。

(2)任务定义 Task<任务名>

<端口及数据类型声明语句> <语句1> ?? Endtask

(3)任务调用

<任务名>(端口1,端口2,?端口n);

实验内容:

用两种不同的方法设计一个功能相同的模块,该模块能完成四个8位2进制输入数据的冒泡排序。第一种,模仿上面的例子用纯组合逻辑实现;第二种,假设8位数据是按照时钟节拍串行输入的,要求用时钟触发任务的执行法,每个时钟周期完成一次数据交换。比较两种不同方法的运行速度和消耗资源的不同。

实验代码:

module sort4_1(ra,rb,rc,rd,a,b,c,d);

output[7:0] ra,rb,rc,rd; input[7:0] a,b,c,d;

20

联系客服:779662525#qq.com(#替换为@)