东华大学可编程ASIC技术作业赵SG课件Word文档下载推荐.docx
- 文档编号:20622976
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:14
- 大小:387.17KB
东华大学可编程ASIC技术作业赵SG课件Word文档下载推荐.docx
《东华大学可编程ASIC技术作业赵SG课件Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《东华大学可编程ASIC技术作业赵SG课件Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
in1);
3.设计一个功能和引脚与74138类似的译码器,并仿真。
译码器程序:
moduleencoder(out,in,en);
output[7:
0]out;
/*定义八位二进制码输出口*/
input[2:
0]in;
/*定义三位二进制码输入口*/
0]en;
/*三个使能端*/
reg[7:
always@(inoren)
begin
if(en==3'
b100)
case(in)
3'
d0:
out=8'
b11111110;
d1:
b11111101;
d2:
b11111011;
d3:
b11110111;
d4:
b11101111;
d5:
b11011111;
d6:
b10111111;
d7:
b01111111;
endcase
elseout=8'
b11111111;
end
4.设计一个4位、可预置、可清零的移位寄存器,并仿真。
可预置、可清零的移位寄存器程序:
moduleshift_register(out,in,reset,set,clk);
//定义四位输出端
inputin,reset,set,clk;
//输入信号、清零端、置数端、时钟信号
0]md;
//置数寄存器
always@(posedgeclk)
begin
beginmd=8'
b00001101;
end//这里预置数为00001101,可以根据需要更改
if(reset)
beginout<
=0;
end
else
if(set)
=md;
end//置数信号为1,置数
else
={out,in};
5.设计一个上升沿触发的可预置、可清零16进制计数器,并仿真。
如果要改为10进制计数器,应对该设计做哪些修改?
modulecounter_16(Q,en,clock,clear,S);
output[3:
0]Q;
input[3:
0]S;
inputen,clock,clear;
reg[3:
always@(posedgeclock)
if(clear==0)
Q<
=4'
b0000;
elseif(en==1)
=S;
=Q+1'
b1;
10进制计数器
修改增加if(Q>
b1001)
Q<
//当Q的值大于等于9,跳到0
6.分别用结构描述、数据流描述、行为描述三种方式,设计一个2位加法器,并比较上述三种方式各自的优缺点。
结构描述
modulefull_add(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
wires1,m1,m2,m3;
and(m1,a,b),(m2,b,cin),(m3,a,cin);
xor(s1,a,b),(sum,s1,cin);
or(cout,m1,m2,m3);
‘include“full_add.v”
moduleadd_2_1(sum,cout,a,b,cin);
inputcin;
input[1:
0]a,b;
output[1:
0]sum;
outputcout;
full_addf0(a[0],b[0],cin,sum[0],cin1);
//级联
full_addf1(a[0],b[0],cin1,sum[1],cout);
数据流描述
moduleadd_2_2(a,b,cin,sum,cout);
input[1:
output[1:
assign{cout,sum}=a+b+cin;
行为描述
moduleadd_2_3(cout,sum,a,b,cin);
reg[1:
regcout;
always@(aorborcin)
begin
{cout,sum}=a+b+cin;
end
7.利用状态机设计一个序列检测器,该检测器在有“101”序列输入时输出为1,其他输入情况下,输出为0。
请画出状态转移图,并用Verilog语言描述实现,并仿真。
状态说明:
S0:
表示初始状态;
S1:
表示检测到一个“1”信号;
S2:
表示检测到一个“10”信号;
S3:
表示检测到一个“101”信号;
序列检测器程序:
moduleserial_detected(out,in,clk,reset);
/*结果输出端*/
inputin;
/*串行输入的数据*/
inputreset,clk;
/*清零信号、时钟信号*/
regout;
reg[2:
0]S,NS;
parameterS0=2'
b00,S1=2'
b01,S2=2'
b10,S3=2'
b11;
/*状态编码*/
always@(posedgeclkornegedgereset)/*根据输入信号更新状态*/
if(!
reset)S<
=S0;
elseS<
=NS;
always@(Sorin)/*根据输入,锁存记忆输入信号*/
case(S)
S0:
if(in)NS=S1;
elseNS=S0;
S1:
elseNS=S2;
S2:
if(in)NS=S3;
S3:
endcase
end
always@(Sorresetorin)/*输出对应的结果*/
begin
if(!
reset)out<
=0;
elseif(S==S3)out<
=1;
elseout<
8.设计一个加法器,实现sum=a0+a1+a2+a3,a0、a1、a2、a3宽度都是8位。
如用下面两种方法实现,哪种方法更好一些(即速度更快and/or资源更省)。
(1)sum=((a0+a1)+a2)+a3
(2)sum=(a0+a1)+(a2+a3)
9.用流水线技术对上例中的sum=((a0+a1)+a2)+a3的实现方式进行优化,对比最高工作频率,并分析说明:
流水线设计技术为什么能提高数字系统的工作频率?
未采用流水线技术程序:
moduleadder8_1(sum,cout,cout1,cout2,a1,a2,a3,a4,cin,clk);
/*和*/
outputcout1,cout2,cout;
/*每执行一个加法产生的进位信号*/
input[7:
0]a1,a2,a3,a4;
/*四个八位二进制数*/
inputcin,clk;
/*cin为低位进位信号,低位加法时为0,clk为时钟信号*/
0]S1,S2,sum;
regcout1,cout2,cout;
{cout1,S1}=a1+a2+cin;
/*第一个时钟来执行第一步加法*/
{cout2,S2}=S1+a3;
/*第二个时钟来执行第二步加法*/
{cout,sum}=S2+a4;
/*第三个时钟来执行第三步加法*/
采用流水线技术程序:
moduleaddder8_3(cout1,cout2,cout3,sum,a1,a2,a3,a4,cin,clk);
/*总和*/
outputcout1,cout2,cout3;
/*每执行两个数相加产生的进位信号*/
/*四个加数*/
/*低位进位信号,作低位加法器为0、时钟信号*/
0]sum,sum1,sum2;
regcout1,cout2,cout3,firstc,secondc,thirdc;
0]tempa1,tempa2,tempa3,tempb1,tempb2,tempb3,firstsum,secondsum,thirdsum;
/*存储每四位相加的寄存器类型数*/
{firstc,firstsum}=a1[3:
0]+a2[3:
0]+cin;
/*a1和a2低四位相加*/
tempa1=a1[7:
4];
tempb1=a2[7:
{cout1,sum1[7:
4]}=tempa1+tempb1+firstc;
/*a2和a2高四位相加*/
sum1[3:
0]=firstsum;
{secondc,secondsum}=sum1[3:
0]+a3[3:
0];
/*前两数的和的低四位和a3低四位相加*/
tempa2=sum1[7:
tempb2=a3[7:
{cout2,sum2[7:
4]}=tempa2+tempb2+secondc;
/*前两数的和的高四位和a3高四位相加*/
sum2[3:
0]=secondsum;
{thirdc,thirdsum}=sum2[3:
0]+a4[3:
/*前三数的和的低四位和a4低四位相加*/
tempa3=sum2[7:
tempb3=a4[7:
{cout3,sum[7:
4]}=tempa3+tempb3+thirdc;
/*前两数的和的高四位和a2高四位相加*/
sum[3:
0]=thirdsum;
一级的寄存器组将大的组合逻辑切割成小的组合逻辑,以牺牲电路的面积来换取速度的。
10.分析下列的VerilogHDL模块,画出对应的逻辑图或写出逻辑表达式(组),并概括地说明其逻辑功能。
moduleexe1(out,d3,d2,d1,d0,s1,s0);
outputout3,out2,out1,out0;
inputd3,d2,d1,d0,s1,s0;
not(not_s1,s1),(not_s0,s0);
and(out0,d0,not_s1,not_s0),(out1,d1,not_s1,s0);
and(out2,d2,s1,not_s0),(out3,d3,s1,s0);
or(out,out0,out1,out2,out3);
根据不同的s1和s0,输出通道进行变化:
(1)当s1=0,s0=0时,out0=d0;
(2)当s1=0,s0=1时,out1=d1;
(3)当s1=1,s0=0时,out2=d2;
(4)当s1=1,s0=1时,out3=d3。
逻辑表达式组:
out0=S1S0d0
out1=S1S0d1
out2=S1S0d2
out3=S1S0d3
out=out0+out1+out2+out3
实现的逻辑功能就是典型的数据通道选择器
11.分析下列的VerilogHDL模块,用时序波图形或流程框图描述其行为,并概括地说明其逻辑功能。
moduleexe2(fd_out,clk,d,clr);
outputfd_out;
regfd_out;
input[15:
0]d;
inputclk,clr;
reg[15:
0]cnt;
if(!
clr)cnt<
=4'
h0000;
elsebegin
cnt<
=cnt-1;
if(cnt==0)beginfd_out<
cnt<
=d;
elsefd_out<
该程序实现的是可变模的减法计数器,输出的是每当到达设定模值就输出1,相当于对设定模进行检测。
12.分析下列的VerilogHDL模块,写出对应的逻辑表达式(组)或真值表,并概括地说明其逻辑功能。
moduleexe3(op_result,func_sel,op_a,op_b);
output[7:
0]op_result;
input[2:
0]func_sel;
0]op_a,op_b;
reg[7:
always@(func_selorop_aorop_b)
case(func_sel)
3'
b000:
op_result<
=op_a+op_b;
b001:
=op_a-op_b;
b010:
=op_a*op_b;
b011:
=op_a/op_b;
b100:
=op_a&
op_b;
b101:
=op_a|op_b;
b110:
=op_a^op_b;
b111:
=op_a~^op_b;
endcase
(1)当fun_sel=000时,op_result=op_a+op_b
(2)当fun_sel=001时,op_result=op_a-op_b;
(3)当fun_sel=010时,op_result=op_a*op_b;
(4)当fun_sel=011时,op_result=op_a/op_b;
(5)当fun_sel=100时,op_result=op_a&
(6)当fun_sel=101时,op_result=op_a|op_b;
(7)当fun_sel=110时op_result=op_a^op_b;
(8)当fun_sel=111时op_result=op_a~^op_b;
由此可知,该段程序实现的功能是:
根据不同的输入选择信号(000,001,010,011,100,101,110,111),对于两个四位二进制数进行加、减、乘、除、与、或、异或、同或运算。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东华 大学 可编程 ASIC 技术 作业 SG 课件
![提示](https://static.bdocx.com/images/bang_tan.gif)