赞
踩
解:
寄存器型变量可以理解为实际电路中的寄存器,具有记忆特性,是数据存储单元的抽象,在输入信号消失后它可以保持原有的数值不变。
线网型变量可以理解为实际电路中的导线,通常表示为结构实体之间的物理连接,不可以存储任何值,是被“驱动”的,其值由驱动源决定。
因此,寄存器型变量和线网型变量最本质的区别是寄存器型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。
(1)一个名为data_in的8位向量线网。
(2)一个名为MEM1的存储器,含有128个数据,每个数据位宽为8位。
(3)一个名为data_out的8位寄存器。
解:
(1)wire [7:0] data_in;
(2)reg [7:0] MEM1 [127:0];
(3)reg [7:0] data_out;
解:
module mem();
reg [3:0] mem[255:0] ;
integer i;
initial
begin
for(i=0;i<256;i = i+1)
begin
if (i%2) mem[i] = 0; //奇元素初始化为0
else mem[i] = 1; //偶元素初始化为1
end
end
endmodule
解:
区别1:函数可以调用其他函数但不能调用任务,而任务能调用其他任务和函数;
区别2:函数只能与主模块共用一个仿真时间单位,而任务可定义自己的仿真时间单位;
区别3:函数定义不能包含任何时间控制语句,任务定义则可以包含时间控制语句;
区别4:函数至少要有一个输入变量,不能有输出和双向变量,而任务可以没有变量或者有多种任何类型的变量;
区别5:函数返回一个值而任务不返回值。
解:
并发执行的操作:
1.模块实例化是并发执行的;
2.多个initial语句块之间是并发执行的;
3.多个always语句块之间是并发执行的;
4.always语句块和initial语句块是并发执行的;
5.并行块fork…join中的语句是并发执行的;
6.多个assign语句进行连续赋值是并发执行的;
7.非阻塞赋值是并发执行的。
顺序执行的操作:
1.单个initial语句块内的语句是顺序执行的;
2.单个always语句块内的语句是顺序执行的;
3.串行块begin…end中的语句是顺序执行的;
4.阻塞赋值是顺序执行的。
解:
法1:
module mux4to1_1( input wire a,b,c,d, input wire[1:0] sel, output wire mux_out ); reg out; always @(a,b,c,d,sel) begin case(sel) 0:assign out = a; 1:assign out = b; 2:assign out = c; 3:assign out = d; endcase end assign mux_out = out; endmodule
法1对应波形:
法2:
module mux4to1_2(
input a,b,c,d,
input [1:0]sel,
output mux_out
);
// 11--d,10--c,01--b,00--a
assign mux_out = sel[1]?(sel[0]?d:c):(sel[0]?b:a);
endmodule
法2对应仿真波形
解:
以第9题的方法二为例,将其改写为函数和任务的代码形式。并让sel是11的时候对应a,sel是10的时候对应b,sel是01的时候对应c,sel是00的时候对应d。
1.用函数描述的四选一数据选择器:
module mux4to1_func(
input a,b,c,d,
input [1:0]sel,
output mux_out
);
// 11--a,10--b,01--c,00--d
function mux4to1;
input d1,d2,d3,d4;
input[1:0] con;
mux4to1 = con[1]?(con[0]?d1:d2):(con[0]?d3:d4);
endfunction
assign mux_out = mux4to1(a,b,c,d,sel);
endmodule
用函数描述的四选一数据选择器对应仿真波形:
2.用任务描述的四选一数据选择器:
`timescale 1ns/1ns module mux4to1_task(); // 11--a,10--b,01--c,00--d reg a,b,c,d; reg[1:0] sel; reg mux_out; always begin mux4to1(a,b,c,d,sel,mux_out); end task mux4to1; input d1,d2,d3,d4; input[1:0] con; output reg out; out = con[1]?(con[0]?d1:d2):(con[0]?d3:d4); endtask endmodule
仿真波形同上,此处略之。
解:
非阻塞赋值在整个过程块结束后才完成赋值操作,是一种比较接近真实电路赋值和输出的赋值方式,当执行某条非阻塞赋值语句时,仅计算"<="右边表达式的值,但并不马上执行赋值,然后继续执行后面的操作,多条非阻塞赋值操作是同时完成的,与非阻塞赋值表达式的书写顺序无关。
阻塞赋值在该语句结束时就立即完成赋值操作,连续的阻塞赋值操作是按顺序完成的。
因此,两者最本质的区别是:非阻塞赋值是并行执行的,而阻塞赋值是按顺序执行的。
解:
行为语句的可综合性如下表所示:
解:
module count_8(
input clk,clr,
output reg[7:0] count
);
always @(posedge clk) begin
if(clr) count =0;
else if(count==255) count =0;
else count = count +1;
end
endmodule
对应仿真波形为
解:
module Shift_4reg ( input wire clk, rst,din,// 时钟信号,复位信号,输入数据 output reg [3:0] dout // 输出数据(四位) ); //异步复位,放入输入数据 always @(posedge clk or posedge rst) begin if (rst) dout <= 4'b0000; // 复位时,将寄存器清零 else dout[0]<=din; end //向左移位 genvar i; generate for(i=0;i<=3;i=i+1)begin:shift_4reg always @(posedge clk)begin dout[i+1] <=dout[i]; end end endgenerate endmodule
对应仿真波形图为:
解:
initial块内的语句指定的内容在仿真开始时执行一次,且仅执行这一次。主要应用于初始化模块中的变量、寄存器等。此外intial语句主要用于仿真测试,一般不用于逻辑综合;
always块内的语句在满足触发条件的情况下能够不断重复执行。主要应用于描述组合逻辑或时序逻辑的行为。此外always语句在仿真测试和逻辑综合中均可使用。
因此,两者最关键的区别是执行时机和主要用途的不同。
解:
给触发器复位的方法有同步复位和异步复位两种。
同步复位是指复位操作只有在时钟的有效跳变位置进行;异步复位是指复位操作与时钟无关,当异步复位信号到来时,触发器立即复位。
如果时钟进程中用了敏感信号表,异步复位要求把复位信号放在敏感信号表中,这样才能摆脱时钟的控制,实现当异步复位信号到来时,触发器立即复位。
解:
锁存器对毛刺敏感,无异步复位端,不能让芯片在上电时处在一个确定的状态,极其容易引起竞争冒险,同时静态时序分析工具也很难分析穿过锁存器的路径,使静态时序分析变得复杂,不利于设计的可重用。
Verilog HDL避免锁存器产生的方法:
1.使用条件语句时,应列出条件所有分支;
2.使用完整的敏感事件列表;
3.使用完整的case语句;
4.避免组合逻辑反馈等异步逻辑。
解:
module mux8to1( input [31:0] datain, input [2:0] sel, output reg[3:0] dataout ); always @(datain,sel) begin case(sel) 0: dataout = datain[3:0]; 1: dataout = datain[7:4]; 2: dataout = datain[11:8]; 3: dataout = datain[15:12]; 4: dataout = datain[19:16]; 5: dataout = datain[23:20]; 6: dataout = datain[27:24]; 7: dataout = datain[31:28]; endcase end endmodule
对应的仿真波形为:
解:
`timescale 1ns/1ns module even_div ( input wire rst , input wire clk_in, output wire clk_out ); parameter N1 = 5e8; reg [31:0] cnt1; reg clk_1; always @(posedge clk_in or negedge rst) begin if(rst) cnt1 <= 32'b0; //计数器赋初值 else if (cnt1 == N1-1) cnt1 <= 32'b0; //计数器清零 else cnt1 <= cnt1 + 1'b1; //计数器计数 end always @(posedge clk_in or negedge rst) begin if(rst) clk_1 <= 1'b0; else if (cnt1 == N1/2) clk_1 <= ~clk_1; else if (cnt1 <= 32'b0) clk_1 <= ~clk_1; else clk_1 <= clk_1; end assign clk_out = clk_1; endmodule
仿真波形如下:
由该波形可知,分频后的时钟周期为1s,即题目要求的秒脉冲时钟信号。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。