用verilog语言写的的BPSK数字调制器代码

如题所述

module psk(clk,clr,fcw,angle,M,EN,psk_output);
input[31:0]fcw;//载波频率
input[9:0]angle;//载波相位
input clk,clr;
input M,EN;//M为输入的序列
output [7:0]psk_output;//输出波形
reg [7:0]psk_output;
wire [7:0]psk_zaibo;

mydds dds_ask(
.gclock(clk),
.clr(clr),
.fcw(fcw),
.pcw(angle),
.outputwave(psk_zaibo));//正弦发生模块,产生载波
always@(posedge clk)
begin
if(EN!=0)
begin
if(M==0)psk_output<=~psk_zaibo;//M=0时相位为180
else psk_output<=psk_zaibo;//M=1时相位为0
end
else psk_output<=0;
end

endmodule

②DPSK模块:方式一
module dpsk(clk,clr,fcw,angle,EN,dpsk_output,a,M);
input[31:0]fcw;//载波频率控制字
input[9:0]angle;//载波相位控制字

input clk,clr;//系统时钟,清零信号
input EN;//系统使能信号
output [7:0]dpsk_output;//输出波形
output a,M;//输出产生的M序列与输出波形相对照
reg [7:0]dpsk_output;
wire [7:0]dpsk_zaibo;
reg a;
initial //初始化模块
begin
a=0;//a存放M序列上一码元的值
end

m1 m1(
.gclock(clk),
.EN(EN),
.M_code(M),
.clk(clk_M));//产生M序列
mydds dds_ask(
.gclock(clk),
.clr(clr),
.fcw(fcw),
.pcw(angle),
.outputwave(dpsk_zaibo)); //正弦发生模块,产生载波

always@(posedge clk)
begin
if(EN!=0)
begin
if(M==a)dpsk_output<=~dpsk_zaibo;//当前后码元相同时输出波形相位为180
else
begin
dpsk_output<=dpsk_zaibo; //当前后码元不同时输出波形相位为0
end
end
else dpsk_output<=0;//当系统没使能时,输出为0
end

always@(posedge clk_M)//根据M序列的同步时钟,来存储M序列当前的值,以便与M序列下一值相比较
begin
a=M;
end

endmodule

③DPSK1模块:方式二
module DPSK1(clk,clr,angle,DPSK_zaibo,EN,DPSK_out,M);
input clk,EN,clr;
input[31:0]DPSK_zaibo;//载波频率控制字
input[9:0]angle;//载波相位控制字
output[7:0] DPSK_out;
output M;
reg[7:0]DPSK_out;

reg[9:0]address1,address2;
reg[9:0]address3,address4;
wire[9:0]address;
reg [9:0]dpsk_zaibo1;
wire[7:0]DPSK_out1;
wire[31:0]data_in;
reg a;
initial //初始化地址
begin
address1=0;
address2=0;
address2[9]=1;
a=0;
end

m1 m1(
.gclock(clk),
.EN(EN),
.M_code(M),
.clk(clk_M));//产生M序列

add_fcw add_fcw(
.clr(clr),
.clk(clk),
.fcw(DPSK_zaibo),
.sum(data_in)
);//频率控制字累加

add_pcw add_pcw(
.clr(clr),
.clk(clk),
.pcw(angle),
.data_in(data_in),
.address(address)
); //与相位控制字相加
always@(posedge clk ) //根据前后码元的异同来修正查询地址
begin
if(EN!=0)

begin
address3=address1+address;
address4=address2+address;
if(M==a)dpsk_zaibo1<=address3;//前后码元相同时,相位为0
else
begin
dpsk_zaibo1<=address4; ;//前后码元不同时,相位为180
end
end
else dpsk_zaibo1<=0;
end

sinrom sinrom (
.a(dpsk_zaibo1), // Bus [9 : 0]
.clk(clk),
.qspo(DPSK_out1)); // Bus [7 : 0]//查询正弦查询表

always@(posedge clk_M) /根据M序列的同步时钟,来存储M序列当前的值,以便与M序列下一值相比较
begin
a=M;
end

always@(posedge clk)
begin
DPSK_out=DPSK_out1;
end

endmodule

m序列自己可以再网上查~
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-10
module psk(clk,clr,fcw,angle,M,EN,psk_output);
input[31:0]fcw;//载波频率
input[9:0]angle;//载波相位
input clk,clr;
input M,EN;//M为输入的序列
output [7:0]psk_output;//输出波形
reg [7:0]psk_output;
wire [7:0]psk_zaibo;

mydds dds_ask(
.gclock(clk),
.clr(clr),
.fcw(fcw),
.pcw(angle),
.outputwave(psk_zaibo));//正弦发生模块,产生载波
always@(posedge clk)
begin
if(EN!=0)
begin
if(M==0)psk_output<=~psk_zaibo;//M=0时相位为180
else psk_output<=psk_zaibo;//M=1时相位为本回答被提问者采纳
相似回答