verilog 6.1 阻塞赋值和非阻塞赋值有什么本质的区别? 6.2 用持续赋值语句描述一个4选1数据选择器。 6.3 用行为语句设计一个8位计数器,每次在时钟的上升沿,计数器加1,当计数器溢出时,自动从零开始重新计数。计数器有同步复位端。 6.4 设计一个4位移位寄存器。 6.5 initial语句与always 语句的关键区别是什么? 6.6 分别用任务和函数描述一个4选1多路选择器。 6.7 总结任务和函数的区别。
时间: 2024-02-19 15:57:24 浏览: 312
阻塞赋值与非阻塞赋值详解.pdf
6.1 阻塞赋值和非阻塞赋值的本质区别在于执行的时间点不同。阻塞赋值在执行时会阻止其他语句的执行,直到该语句执行完成,而非阻塞赋值则不会阻止其他语句的执行,可以与其他语句并发执行。
6.2 持续赋值语句描述的4选1数据选择器如下所示:
```
assign out = sel[0] ? in0 : (sel[1] ? in1 : (sel[2] ? in2 : in3));
```
其中,sel为2位选择信号,in0~in3为4个数据输入,out为数据输出。
6.3 行为语句设计的8位计数器如下所示:
```
reg [7:0] cnt;
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt <= 0;
end else if (cnt == 8'hFF) begin
cnt <= 0;
end else begin
cnt <= cnt + 1;
end
end
```
其中,cnt为8位计数器,rst为同步复位信号,clk为时钟信号。
6.4 设计的4位移位寄存器如下所示:
```
reg [3:0] reg_data;
always @(posedge clk) begin
reg_data <= {reg_data[2:0], in};
end
assign out = reg_data;
```
其中,in为输入信号,out为输出信号,clk为时钟信号。
6.5 initial语句和always语句的关键区别在于执行的时机不同。initial语句在仿真开始时执行一次,而always语句在时钟上升沿等触发事件发生时执行。
6.6 任务描述的4选1多路选择器如下所示:
```
task mux4(input [3:0] sel, input [3:0] in, output reg out);
begin
case (sel)
4'b0001: out = in[0];
4'b0010: out = in[1];
4'b0100: out = in[2];
4'b1000: out = in[3];
default: out = 0;
endcase
end
endtask
```
函数描述的4选1多路选择器如下所示:
```
function [3:0] mux4(input [3:0] sel, input [3:0] in);
begin
case (sel)
4'b0001: mux4 = in[0];
4'b0010: mux4 = in[1];
4'b0100: mux4 = in[2];
4'b1000: mux4 = in[3];
default: mux4 = 0;
endcase
end
endfunction
```
6.7 任务和函数的区别主要有以下几点:
- 任务可以有输出端口,而函数只能有一个输出。
- 任务可以包含多个语句,而函数只能有一个语句。
- 任务可以使用延时语句,而函数不能使用延时语句。
- 任务可以并发执行,而函数只能顺序执行。
阅读全文