复杂电路编程题.docx
《复杂电路编程题.docx》由会员分享,可在线阅读,更多相关《复杂电路编程题.docx(18页珍藏版)》请在冰豆网上搜索。
复杂电路编程题
1、行为描述的74LS74。
moduledff_7474(d,clk,clrn,prn,q,qn);//dff为触发器
inputd,clk,clrn,prn;
outputq,qn;
regq;
assignqn=!
q;
always@(posedgeclkornegedgeclrnornegedgeprn)
begin
if(clrn==0)
q<=0;//清0
elseif(prn==0)
q<=1;//置1
else
q<=d;//置数
end
endmodule
2、比较x、y的大小,位数由参数决定。
Modulecompare_n(x,y,xgy,xsy,xey);
parameterwidth=8;
input[width-1:
0]x,y;
outputxgy,xsy,xey;
regxgy,xsy,xey;
always@(xory)
begin
if(x==y)xey=1;
elsexey=0;
if(x>y)beginxgy=1;xsy=0;end
elsebeginxgy=0;xsy=1;end
end
endmodule
3、多路器(根据地址信号在多路输入中选择一路输出)
modulemux_8(addr,in1,in2,in3,in4,in5,in6,in7,in8,mout,ncs);
parameterwidth=8;
input[2:
0]addr;
inputncs;
input[width-1:
0]in1,in2,in3,in4,in5,in6,in7,in8;
output[width-1:
0]mout;
reg[width-1:
0]mout;
always@(addrorin1orin2orin3orin4orin5orin6orin7orin8orncs)
begin
if(!
ncs)//即if(ncs==0)
case(addr)
3’b000:
mout=in1;
3’b001:
mout=in2;
3’b010:
mout=in3;
3’b011:
mout=in4;
3’b100:
mout=in5;
3’b101:
mout=in6;
3’b110:
mout=in7;
3’b111:
mout=in8;
endcase
else
mout=0;
end
endmodule
4、参数化的奇偶校验生成器
moduleparity_g(data_in,odd_par,even_par);
parametern=4;
input[n-1:
0]data_in;
outputodd_par,even_par;
assignodd_par=^~data_in;
assigneven_par=~odd_par;
endmodule
5、带有异步清零端的同步4位二进制加法计数器
modulencounter(rst,clk,q);
inputrst,clk;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclkornegedgerst)
if(!
rst)
q<=0;
elseif(q==15)
q<=0;
else
q<=q+1;
endmodule
☆6、设计一个4位加1/减1双向同步计数器,其计数输入时钟为clk,输出为q[3:
0](以十进制计数)。
要求有1个低电平有效的使能端能ncs,1个低电平有效的清0端nrst,1个低电平有效的同步置数端load。
加1/减1控制信号s,进位/借位信号为c。
moduleudcnt(clk,nrst,d,q,ncs,s,c,load);
inputclk,nrst,ncs,s,load;
input[3:
0]d;
outputc;
output[3:
0]q;
regc;
reg[3:
0]q;
always@(posedgeclk)
if(!
nrst)beginq<=0;end
elseif(load)beginq<=d;end
elseif(s)
begin
if(q==4'b1111)
beginq<=q+1;c<=1;end
elsebeginq<=q+1;c<=0;end
end
else
begin
if(q==4'b0000)
beginq<=q-1;c<=1;end
elsebeginq<=q-1;c<=0;endend
endmodule
7、总线和总线操作
modulesampleofbus(databus,link_bus,write);//databus总线
inout[11:
0]databus;
inputlink_bus,write;
reg[11:
0]outsigs;//outsigs为挂在总线上的
reginsigs;
assigndatabus=(link_bus)?
outsigs:
12’hzzz;
always@(posedgewrite)
begin
insigs<=databus*3;//insigs为寄存器
end
endmodule
8、分频器的设计,16分频(采用行为级描述)
modulenfrequency(rst,clk,q,clkout);
inputrst,clk;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclkornegedgerst)
if(!
rst)
q<=0;
elseif(q==15)//可以实现16分频
q<=0;
else
q<=q+1;
endmodule
☆请设计一个模为60的BCD码加法计数器(即60s的BCD码计数器/秒表)
例8-5:
分频器的设计(同步清0)
modulenfrequency(rst,clk,q);
inputrst,clk;
output[3:
0]q;
reg[3:
0]q;
wireout;
assignout=q[3];
always@(posedgeclk)
if(!
rst)
q<=0;
elseif(q==15)//可以实现16分频
q<=0;
else
q<=q+1;
endmodule
例8-4b:
14分频器的设计(异步清0)
modulenfrequency(rst,clk,q,out);
inputrst,clk;
output[3:
0]q;
reg[3:
0]q;
regout;
always@(posedgeclkornegedgerst)
if(!
rst)
q<=0;
elseif(q==6)
beginout<=1;q<=q+1;end
elseif(q==13)
beginout<=0;q<=0;end
elseq<=q+1;
endmodule
9、设计一个24分频器,其输入为IN和RESET,输出为OUT。
当RESET信号为高时,OUT为低。
要求输出信号OUT的占空比为1:
2。
【分频器部分必考,参考实验部分】
modulefrequ(in,reset,out);
inputin,reset;
outputout;
regout;
reg[4:
0]cnt;
always@(posedgein)
if(reset)
beginout<=0;cnt<=0;end
elseif(cnt<8)
out<=1;
elseif((cnt>=8))
out<=0;
elseif(cnt==23)
cnt<=0;
else
cnt=cnt+1;
endmodule
10、计一个23分频器,要求输出为方波,占空比为1:
1。
11.试设计一个16位移位寄存器。
要求:
具有串行输入端din、串行输出端dout、同步并行输入端data[15:
0]、同步清零端nrst和并行输出端q[15:
0]。
并行输出端具有三态输出缓冲结构,输出允许信号为noe。
时钟信号为clk。
moduleyi_wei_jcq(din,dout,data,nrst,q,q1,clk,noe,mov,set);
inputclk,noe,din,nrst,mov,set;
input[15:
0]data;
output[15:
0]q,q1;
outputdout;
reg[15:
0]q1;
wire[15:
0]q;
regdout;
always@(posedgeclk)
if(!
nrst)
q1<=0;
elseif(set)
q1<=data;
elseif(mov)
beginq1<={q1[14:
0],din};dout<=q1[15];end
else
beginq1<={din,q1[15:
1]};dout<=q1[0];end
assignq=!
noe?
q1:
16'hzzzz;
endmodule
12、4位BCD码加减计数器
modulecounter(rst,clk,q,m);
inputrst,clk,m;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclk)
if(!
rst)
q<=0;
elseif(m==0)
if(q==9)q<=0;elseq<=q+1;
elseif(m==1)
if(q==0)q<=9;elseq<=q-1;
endmodule
13、设计一个8位线编码器,输入为D7-D0,D7优先级最高,D0最低。
当Di为高电平输入时,F=1,OUT为其编码,否则F=0。
modulecode(d,f,out);
input[7:
0]d;
outputf;output[2:
0]out;
reg[2:
0]out;regf;
always@(d)
case(d)
8’b1?
?
?
?
?
?
?
:
beginf=1;out=3’b111;end
8’b01?
?
?
?
?
?
:
beginf=1;out=3’b110;end
8’b001?
?
?
?
?
:
beginf=1;out=3’b101;end
8’b0001?
?
?
?
:
beginf=1;out=3’b100;end
8’b00001?
?
?
:
beginf=1;out=3’b011;end
8’b000001?
?
:
beginf=1;out=3’b010;end
8’b0000001?
:
beginf=1;out=3’b001;end
8’b00000001:
beginf=1;out=3’b000;end
default:
beginf=0;out=3’b000;end
endcase
endmodule
14、11111010000序列检测器
moduleshift(q,s,d,clk);
output[11:
0]q;
outputs;
inputd;
inputclk;
reg[11:
0]q;
regs;
always@(posedgeclk)
beginq<=q<<1;q[0]<=d;end
always@(posedgeclk)
if(q==12'b11111010000)
s<=1;
else
s<=0;
endmodule
15、11010100序列信号发生器。
modulegenerator(out,clk);
output[2:
0]state;
outputout;
inputclk;
reg[2:
0]state;
regout;
always@(posedgeclk)
begin
state<=state+1;
case(state)
3’b000:
out<=1;
3’b001:
out<=1;
3’b010:
out<=0;
3’b011:
out<=1;
3’b100:
out<=0;
3’b101:
out<=1;
3’b110:
out<=0;
3’b111:
out<=0;
default:
out<=0;
endcase
end
endmodule
16、设计一个位宽为8位、深度为8层的堆栈。
17、一个挂在总线上的8位寄存器。
moduleregister0(db,nce,nwe);
inout[7:
0]db;
inputnce,nwe;
reg[7:
0]q;
assigndb=(nce&&(!
nwe))?
q:
8'bzzzzzzzz;
always@(posedgenwe)
begin
if(nce==0)
q<=db;
end
endmodule
18、设计每周期8个采样点的锯齿波信号发生器。
19、设计每周期12个采样点的正弦波信号发生器。
modulesin(wave_out,clk,rst);
output[12:
0]wave_out;
inputclk,rst;
reg[3:
0]state;
reg[12:
0]wave_out;
parameters0=4'b0000,s1=4'b0001,s2=4'b0010,s3=4'b0011,s4=4'b0100,s5=4'b0101,
s6=4'b0110,s7=4'b0111,s8=4'b1000,s9=4'b1001,s10=4'b1010,s11=4'b1011;
always@(posedgeclkorposedgerst)
begin
if(rst)beginwave_out<=13'b0;state<=s0;end
else
begin
case(state)
s0:
beginwave_out<=13'd4096;state<=s1;end//4096
s1:
beginwave_out<=13'd6144;state<=s2;end//6144
s2:
beginwave_out<=13'd7643;state<=s3;end//7643
s3:
beginwave_out<=13'd8191;state<=s4;end//8191
s4:
beginwave_out<=13'7643;state<=s5;end//7643
s5:
beginwave_out<=13'6144;state<=s6;end//6144
s6:
beginwave_out<=13'd4096;state<=s7;end//4096
s7:
beginwave_out<=13'd2048;state<=s8;end//2048
s8:
beginwave_out<=13'd549;state<=s9;end//549
s9:
beginwave_out<=13'd0;state<=s10;end//0
s10:
beginwave_out<=13'd549;state<=s11;end//549
s11:
beginwave_out<=13'd2048;state<=s0;end//2048
default:
beginwave_out<=13'b00000000;state<=s0;end//0
endcase
end
end
endmodule
20.某数字系统的状态转换图如下图示。
要求以独热码状态机结构实现其功能。
moduleexample_6(x,z,clk);
inputx,clk;
outputz;
reg[4:
0]state;
regz;
parameters0=5'b00001,s1=5'b00010,s2=5'b00100,s3=5'b01000,s4=5'b10000;
always@(posedgeclk)
case(state)
s0:
if(x==1)beginstate<=s1;z<=1;end
elsebeginstate<=s4;z<=0;end
s1:
if(x==0)beginstate<=s2;z<=1;end
elsebeginstate<=s4;z<=0;end
s2:
if(x==1)beginstate<=s3;z<=0;end
elsebeginstate<=s0;z<=0;end
s3:
if(x==1)beginstate<=s2;z<=0;end
elsebeginstate<=s4;z<=1;end
s4:
if(x==1)beginstate<=s0;z<=0;end
elsebeginstate<=s4;z<=0;end
endcase
endmodule
22、试设计一个时序发生器,其输入为clock和rst,输出为t1、t2、t3和t4,相互之间的关系如下图所示。
(20分)
moduletimer(clock,rst,t1,t2,t3,t4);
outputt1,t2,t3,t4;
inputclock,rst;
regt1,t2,t3,t4;
reg[1:
0]state;
parameter
s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
initial
begin
t1<=0;t2<=0;t3<=0;t4<=0;state<=s0;
end
always@(posedgeclock)
if(rst)
begint1<=0;t2<=0;t3<=0;t4<=0;state<=s0;end
else
begin
case(state)
s0:
begint1<=1;t2<=0;t3<=0;t4<=0;state<=s1;end
s1:
begint1<=0;t2<=1;t3<=0;t4<=0;state<=s2;end
s2:
begint1<=0;t2<=0;t3<=1;t4<=0;state<=s3;end
s3:
begint1<=0;t2<=0;t3<=0;t4<=1;state<=s0;end
default:
state<=s0;
endcase
end
endmodule
23、请设计一个32x8的RAM。
(请基于Verilog建模)
练习一.简单的组合逻辑设计
//(方法一):
//---------------文件名compare.v-----------------
modulecompare(equal,a,b);
inputa,b;
outputequal;
assignequal=(a==b)?
1:
0;
//a等于b时,equal输出为1;a不等于b时,equal输出为0。
endmodule
//(方法二):
modulecompare(equal,a,b);
inputa,b;
outputequal;
regequal;
always@(aorb)
if(a==b)//a等于b时,equal输出为1;
equal=1;
else//a不等于b时,equal输出为0。
equal=0;//思考:
如果不写else部分会产生什么逻辑?
endmodule
//-------------------------------------------------------------
//----------测试模块源代码(方法之一):
`timescale1ns/1ns//定义时间单位。
`include"./compare.v"//包含模块文件。
在有的仿真调试环境中并不需要此语句。
//而需要从调试环境的菜单中键入有关模块文件的路径和名称
modulet;
rega,b;
wireequal;
initial//initial常用于仿真时信号的给出。
begin
a=0;
b=0;
#100a=0;b=1;
#100a=1;b=1;
#100a=1;b=0;
#100a=0;b=0;
#100$stop;//系统任务,暂停仿真以便观察仿真波形。
end
comparem(.equal(equal),.a(a),.b(b));//调用被测试模块t.m
endmodule