3、downto0);-混频输出端口S_in,S_Oc:outstd_Iogic_vector(9downto0);一混频信号出入端口LDoc,LDmix:outstd_logic);endMyMixer;architectureBehavioralofMyMixeris-实例化名为“sin”的ROM,产生正弦波输出componentsinport(clka:instdjogic;addra:instd_logic_vector(9downto0);douta:outstd_logic_vector(9downto0));endcomponent;-实例化
4、一个DDS,产生本振信号componentocport(clk:instdjogic;sine:outstd_logic_vector(9downto0));endcomponent;signalInSin,OcSin,Addr:std_logic_vector(9downto0);signalmult,mean,mt:std_logic_vector(19downto0);signalmadd:std_logic_vector(22downto0);signalmI,m2,m3,m4,m5,m6,m7:std_logic_vector(19downt
5、o0);signalDoc,Dinix:std」ogic;begin-实例化sin输入信号组件及本振信号DDS核的oc组件u1:sinportmap(clk,Addr,InSin);—625kHzu2:ocportmap(clk,OcSin);--625KHzS_in<=InSin;S_Oc<=OcSin;process(rst,clk)beginifrst=Tthenmult<=(others=>'0*);Addr<=(others=>,0,);elsifrising_edge(clk)thenmult<=InSin*OcSin;-■实现混频输出Ad
6、dr<=Addr+l;一产生正弦信号RAM的地址信号endif;endprocess;-求均值process(rst,clk)—elk为5MHzbeginifrst=*1'thenm1<=(others=>,0');m2<=(others=>,0');m3<=(others=>,0,);m4<=(others=>,0,);m5<=(others=>r0');m6<=(others=>,0');m7<=(others=>,0,);elsifrising_edge(clk)thenml<=mult;m2<=m1;m3<=m2;m4<=m3;m5<=m4;m
7、6<=m5;m7<=m6;endif;endprocess;-这里采样8次数据,也就是这8次的数据符号位都是相同的,所以--mult(19)就能表示符号位了-这里我们分析一下,为什么可以使用mult(19)来填充后三位。-首先我们要知道,在计算机屮,数的加减运算是以补码的形式进行的。-而正数的反码和补码都是本身,负数的补码是反码加1,也就是说,补码-的出现时为了解决负数的运算的。-现在假设我们采样的是正数。也就是说mult(19)都为0,所以填充没影-响,这不难理解。-如果假设为负数,贝U符号位mulg9)就是1了,咋一看,好像不太对。•.其实还是对的
8、。前面我们知道,负数的补码是反码加1,所以半进行加运-算的时候,倒数第二、第三位变成了反码()