前言
- 本科阶段,单纯以为硬件电路开发就是画画电路图,焊焊板子,跑跑程序等等…随着学习的深入,逐渐发现,硬件电路的开发也有一套严谨有序的开发流程。
- 需求分析是硬件电路设计的第一步,需要什么样的功能,功能实现的指标是我们首要考虑的。指标越高,所需要的成本也就越高。硬件电路设计的一个准则就是在性能和成本中寻求平衡。
- 设计算法,进行算法仿真。Matlab以其强大的数学运算能力为我们的科研生活带来了极大的便利。
- 使用matlab进行波形,首先得验证我们使用的方法是否正确,我们先用matlab产生一个频率为1MHz的,来测试我们用以进行波形分析的代码!
clear;
Fs=2E7;
F=1E6;
N=60;
n=0:N-1;
t=n/Fs;
x=sin(2*pi*F*t);
y=fft(x,N);
y_abs=abs(y);
y1=abs(20*log10(y_abs));
y2=20*log10(y_abs);
f=(0:N-1)*Fs/N;
subplot(2,2,1:2),stem(t,x);
subplot(2,2,3),stem(f(1:N/2),y_abs(1:N/2));
subplot(2,2,4),stem(f(1:N/2),y2(1:N/2));
[外链图片转存中…(img-c990x779-1648537457579)]
1. 正弦信号的频率为1MHz,采样频率为20MHz,60/(20/1)=3个整周期的采样点。
2. 频谱图和增益图满足工程需求(噪声被压制在-300dB以下),所以可以用此方法进行后续的波形分析。
3.硬件电路仿真。以FPGA为例,芯片厂商都为自家的芯片开发了一系列硬件电路开发板和仿真软件。比如Altera的quartus,Xinlinx的ise。
- 在未拿到实际的开发板之前,没有时钟激励,没有实际的导线,我们如何将所设计的程序跑起来呢,modelsim为我们提供了一个良好的仿真平台。下面设计一些基于modelsim的实验。
实验一 2补码的溢出回绕特性##
-
知识背景:
在有符号数中,最小值-1=最大值,最大值-1=最小值。我们称之为回绕wrap around。
为什么最小值-1=最大值?这要从计算机内部数字表示形式开始,都是采用补码表示。
补码表示有一些好处:
1、 统一了0([0]补=0000;).
2、 把减法都可以转换为加法。
3、 良好的溢出性质
补码加法:
[x]补+[y]补=[x+y]补
例:x=+1011;y=-0101;求x+y;
解:[x]补=01011;[y]补=11011;
[x]补 01011
[y]补 11011
[x+y]补 (进位1丢掉)00110
结果为x+y=+0110;
补码加法的特点:1是符号位要作为数的一部分参与运算,而是要在模2(n+1)的意义下相加,即超过2(n+1)要丢掉。
实验验证2补码的溢出回绕特性
先令两个有符号四位二进制数相加溢出,再将结果减去一个有符号四位二进制数,的最终运算结果,观察验证结果是否正确。 -
quartus代码片:
module lab1(a,b,c,sum);
input signed [4-1:0] a,b,c;
output signed [4-1:0] sum;
assign sum = a + b + c;
endmodule
- modelsim代码片
`timescale 1 ps/ 1 ps
module lab1_vlg_tst();
reg eachvec;
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
wire [3:0] sum;
lab1 i1 (
.a(a),
.b(b),
.c(c),
.sum(sum)
);
initial
begin
a=1;
b=1;
c=1;
end
always
begin
#10 a=a+1;
b=b+2;
c=c+3;
end
endmodule
- Modelsim仿真图
[外链图片转存中…(img-E01NdAXC-1648537457582)]
- 实验分析:
有符号四位的范围为-8~7;由modelsim仿真图可以看出,4+7=11(溢出),4+7-6=5,结果正确,由此有验证了2补码的溢出回绕特性。
- 占用资源图
[外链图片转存中…(img-wwqbCjDn-1648537457583)]
实验二 不同长度的2补码数据运算##
-
实验验证:
先设计一个无符号的三位二进制数a和一个有符号的四位二进制数b,a补一位和b相加得sum1,a补两位,b补一位,两者此时数据对齐,相加得sum2,观察sum1和sum2是否和正确一致。 -
quartus代码片:
module lab_2(a,b,c,sum1,sum2);
input [2:0]a;
input signed [3:0]b;
output signed [4:0]c;
output [3:0]sum1;
output [4:0]sum2;
reg [4:0]c;
reg [3:0]sum1;
reg [4:0]sum2;
always@(a or b or c )
begin
c={2'b0,a};
sum1={1'b0,a}+b;
if(b[3]==0)
sum2=c+{1'b0,b};
else
sum2=c+{1'b1,b};
end
endmodule
- modelsim代码片:
module lab_2_vlg_tst();
reg eachvec;
reg [2:0] a;
reg signed[3:0] b;
wire [3:0] sum1;
wire [4:0] sum2;
wire [4:0] c;
lab_2 i1 (
.a(a),
.b(b),
.c(c),
.sum1(sum1),
.sum2(sum2)
);
initial
begin
a=0;
b=4'b1001;
end
always
begin
#10
a=a+1;
if(b==4'b0111)