二○一○~二○一一学年 第二学期 (A)卷 课程名称 Verilog硬件描述语言 填空题(共26分,每空 2 分) 1. Verilog的基本设计单元是模块。它是由两部分组成,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。 2. 用assign描述的语句我们一般称之为组合逻辑,并且它们是属于并行语句,即于语句的书写次序无关。而用always描述的语句我们一般称之为组合逻辑或时序逻辑,并且它们是属于串行语句,即于语句的书写有关。 1. 在case语句中至少要有一条default语句 二、简答题(共15分,每小题5分) 1. 怎样理解在进程语句中,阻塞语句没有延迟这句话? 答:这是因为,在进程语句中,有阻塞语句和非阻塞语句这两种,非阻塞语句是有延迟的,而阻塞语句它也是有延迟的,这是因为因果系统都有延迟的,只是阻塞语句的延迟比非阻塞语句的延迟小若干个数量级,因此可视为没有延迟。 2. 在进程中什么情况下综合为时序电路?什么情况下综合为组合电路?
答:在进程中只有当敏感信号是沿触发(即上升沿或下降沿)时,此时综合为时序电路;而在进程中只有当敏感信号是电平沿触发时,此时综合为组合电路。 3. 为什么在Verilog语言中,其综合只支持次数确定的循环,而不支持次数不确定的循环? 答:这是因为,在Verilog语言中,它是为电路设计而设计的一门语言,它如高级语言不同,若循环的次数不确定,则会带来不确定的延迟,而这在电路中是不允许存在的,故综合只支持次数确定的循环,即对于一个具体的芯片,其延迟是一个定值。 三、改错(15分) //下述是一个实现四位数的BCD码加法的程序 module bcdadd(clk,a,b,c,d,a1,b1,c1,d1,q1,q2,q3,q4,cout); input clk; input [3:0]a,b,c,d,a1,b1,c21,d21; output [3:0]q1,q2,q3,q4; output cout; //输出进位 reg [3:0] q1,q2,q3,q4;
always @( clk,or a or b or c or d or a1 or b1 or c1 or d1 ) begin q1=a+a1; if(q1>9) {cout,q1}=q1+6; q2=b+b1+cout; if(q2>9) {cout,q2}=q2+6; q3=c+c1+cout; if(q3>9) {cout,q3}=q3+6; q4=d+d1+cout; if(q4>9) {cout,q4}=q4+6; endmodule 四、编程 (15分) 编程实现带异步清0、异步置1的D触发器。
module DFF1(q,qn,d,clk,set,reset); input d,clk,set,reset; output q,qn; reg q,qn; always @(posedge clk or negedge set or negedge reset) begin if (!reset) begin q <= 0; //异步清0,低电平有效 qn <= 1; end else if (!set) begin q <= 1; //异步置1,低电平有效 qn <= 0;
end else begin q <= d; qn <= ~d; end end endmodule 五、编程 (15分) 编程实现求补码的程序,输入是带符号的8位二进制数。 module test12 (clk, din,dout); input clk; input[7:0] din; output [7:0]dout;
reg [7:0]dout; reg x; reg [6:0]y; always@( clk or din) begin x=din[7]; //符号位赋给x if(x==1) //当符号位为1,即负数 begin y=din[6:0]; //除符号位之外的7位赋值给y dout[6:0]=~y; //对其取反 dout[7]=x; //符号位不变 end else
dout=din; //若符号位不为1,即为0,正数,补码为其本身 end endmodule 六、编程 (14分) 编程实现一个并行加载串行输出的程序,输入是一个8位的二进制数。 module test12 (clk, en, d_in, s_out); input clk; input en; input[9:0] d_in; output s_out; reg s_out; reg[3:0] I; always@(posedge clk)
begin if(en == 1'b1) begin if(I == 4'b0000) begin s_out <= d_in[9]; end if(I == 4'b0001) begin s_out <= d_in[8]; end if(I == 4'b0010) begin
s_out <= d_in[7]; end if(I == 4'b0011) begin s_out <= d_in[6]; end if(I == 4'b0100) begin s_out <= d_in[5]; end if(I == 4'b0101) begin s_out <= d_in[4];
end if(I == 4'b0110) begin s_out <= d_in[3]; end if(I == 4'b0111) begin s_out <= d_in[2]; end if(I == 4'b1000) begin s_out <= d_in[1]; end
if(I == 4'b1001) begin s_out <= d_in[0]; end I = I+1; if (I>4'b1001) begin I = 4'b0000; end end end endmodule 二○一○~二○一一学年 第二学期 (B)卷
参及评分标准 课程名称 Verilog硬件描述语言 一、 填空题(共10分,每空 2 分) 1. 已知x=4’b1001,y=4’0110,则x的4位补码为4’b1111,而y的4位的补码为4’b0110 2. 在case语句中至少要有一条default语句。 3. 两个进程之间是并行语句。而在Always中的语句则是顺序语句。 二、简答题(共20分,每小题 5 分) 1. 进程语句的启动条件是怎样? 答:进程语句的启动条件是敏感信号发生变化,则进程语句启动,并且从上到下执行一次,然后就处于等待状态,当敏感信号再发生变化,再从复上述过程。 2. 为什么在Verilog语言中,其综合只支持次数确定的循环,而不支持次数不确定的循环? 答:这是因为,在Verilog语言中,它是为电路设计而设计的一门语言,它如高级语言不同,若循环的次数不确定,则会带来不确定的延迟,而这在电路中是不允许存在的,故综合只支持次数确定的循环,即对于一个具体的芯片,其延迟是一个定值。
3. Reg型和wire型信号有什么本质的区别?Reg型信号的初始值一般是什么? 答:Reg型信号用于进程语句中,并且其语句是顺序语句;而wire型信号则用于模块中,并且其语句是并发语句;Reg型信号的初始值一般为左边值,即0。 4. 在Verilog语言中什么情况下必需使用复合语句?表达一个复合语句的的语法是怎样的? 答:在进程语句中,其条件和循环语句中,只能执行一条语句,当多于一条语句时,则要采用复合语句,复合语句以begin开头,以 end作为结束。 三、改错(15分) //下述是一个实现计数器,并用数码管显示: module alpher(choice,data,clk) ; input clk; output[6:0] choice, data; reg[3:0] count; always @ (posedge clk or choice) begin
count <= count + 1; case (count) 4'b0000: data <= 8'b11111100;//(共阴的数字0) 4'b0001: data <= 8'b01100000; 4'b0010: data <= 8'b11011010; 4'b0011: data <= 8'b11110010; 4'b0100: data <= 8'b01100110; 4'b0101: data <= 8'b10110110; 4'b0110: data <= 8'b10111110; 4'b0111: data <= 8'b11100000; 4'b1000: data <= 8'b11111110; 4'b1001: data <= 8'b11110110; 4'b1010: data <= 8'b11101110;
4'b1011: data <= 8'b00111110; 4'b1100: data <= 8'b10011100; 4'b1101: data <= 8'b01111010; 4'b1110: data <= 8'b10011110; endcase choice = 8'b1000000;//(点亮第1位数码管) endmodule 四、编程(15分) 编程实现带同步清0、同步置1的D触发器。 module DFF2(q,qn,d,clk,set,reset); input d,clk,set,reset; output q,qn; reg q,qn;
always @(posedge clk) begin if (reset) begin q <= 0; qn <= 1; //同步清0,高电平有效 end else if (set) begin q <=1; qn <=0; //同步置1,高电平有效 end else begin q <= d; qn <= ~d; end end endmodule
五、编程(15分) 编程实现两个4位二进制数相减的程序。 module updown_count(a,d,clk,sub); input[3:0]a,d; input clk; output[3:0] sub; reg[3:0] sub; always @(clk or a or d) begin if (a>=d) sub=a-d; else sub=d-a; end endmodule
六、编程(10分) 编程实现一个并行加载串行输出的程序,输入是一个8位的二进制数。 module test12 (clk, en, d_in, s_out); input clk; input en; input[9:0] d_in; output s_out; reg s_out; reg[3:0] I; always@(posedge clk) begin if(en == 1'b1) begin
if(I == 4'b0000) begin s_out <= d_in[9]; end if(I == 4'b0001) begin s_out <= d_in[8]; end if(I == 4'b0010) begin s_out <= d_in[7]; end if(I == 4'b0011)
begin s_out <= d_in[6]; end if(I == 4'b0100) begin s_out <= d_in[5]; end if(I == 4'b0101) begin s_out <= d_in[4]; end if(I == 4'b0110) begin
s_out <= d_in[3]; end if(I == 4'b0111) begin s_out <= d_in[2]; end if(I == 4'b1000) begin s_out <= d_in[1]; end if(I == 4'b1001) begin s_out <= d_in[0];
end I = I+1; if (I>4'b1001) begin I = 4'b0000; end end end endmodule 七、编程 (15分) 用阻塞赋值方式编程实现二选一功能。 module sel(d0,d1,sel,q); output q;
input d0,d1,sel; reg q; always @(d0 or d1 or sel) begin if (sel==1) q=d0; else q=d1; end endmodule assign (sel==0)?d0:d1
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务