基于verilog的QPSK调制解调系统,书上代码有了 就是不知道如何进行编写testbench 还请大虾劳驾了 10
用的是modelsim6.5*******************************QPSK调制****************************module...
用的是modelsim 6.5
*******************************
QPSK调制
****************************
module QPSK(clk,rst,x,y);
input clk; //系统工作时钟
input rst; //系统复位信号
input x; //系统输入信号:每4个clk周期输入一个x的值
output y; //QPSK调制输出信号:在8个clk周期内按bit输出
reg [2:0] count; //计数器
reg [1:0] xreg; //输入信号的中间寄存器
reg [1:0] yreg;
reg [3:0] carriers; //4路载波信号
//实现QPSK解调
assign y = (yreg == 2'b00)?carriers[3] :
(yreg == 2'b01)?carriers[2] :
(yreg == 2'b10)?carriers[1] :
(yreg == 2'b11)?carriers[0] : 0;
//完成计数器,从而对模块时钟分频
always @ (posedge clk or negedge rst)
if(!rst)
count <= 3'b000;
else
count <= count +1;
//寄存输入:每4个clk周期,将输入x寄存到xreg中
always @ (posedge clk or negedge rst)
if(!rst)
count <= 2'b00;
else
if(count[1:0]==2'b11)
xreg <= {xreg[0],x};
else
xreg <= xreg;
//产生载波信号并且每8个周期将寄存器xreg的值送到yreg中,供后面判断输出
always @ (posedge clk or negedge rst)
if(!rst)
begin
carriers <= 4'b000;
yreg <= 2'b00;
end
else
begin
case(count)
3'b000:
begin
yreg <= xreg;
carriers <= 4'b1100;
end
3'b010: carriers <= 4'b1001;
3'b100: carriers <= 4'b0011;
3'b110: carriers <= 4'b0110;
default: carriers <= carriers;
endcase
end
endmodule
*************************************
QPSK解调
*************************************
module QPSK_de (clk,rst,x,y);
input clk;
input rst;
input x;
output y;
reg[7:0] temp;
reg[7:0] temp2;
reg[2:0] count;
wire [1:0] y1;
//根据temp的值,解调出相应的输入组合
assign y1 = (rst == 0) ? 2'b00:
(temp == 8'b11110000) ? 2'b00:
(temp == 8'b11000011) ? 2'b01:
(temp == 8'b00001111) ? 2'b10:
(temp == 8'b00111100) ? 2'b11:2'b00;
//qpsk解调输出信号
assign y = (count[2] == 0) ? y1[1] :y1[0];
//产生temp2和temp的值:每个clk周期,输入x到temp2,8个clk周期后,
//将temp2的值输入到temp中,供后面判断输出
always@(posedge clk or negedge rst)
if(!rst)
begin
count <= 3'b111;
temp <= 8'b0;
temp2 <= 8'b0;
end
else
begin
temp2 <= {temp2[6:0],x};
count <= count +1;
if(count == 3'b111)
temp <= temp2;
else
temp <= temp;
end
endmodule 展开
*******************************
QPSK调制
****************************
module QPSK(clk,rst,x,y);
input clk; //系统工作时钟
input rst; //系统复位信号
input x; //系统输入信号:每4个clk周期输入一个x的值
output y; //QPSK调制输出信号:在8个clk周期内按bit输出
reg [2:0] count; //计数器
reg [1:0] xreg; //输入信号的中间寄存器
reg [1:0] yreg;
reg [3:0] carriers; //4路载波信号
//实现QPSK解调
assign y = (yreg == 2'b00)?carriers[3] :
(yreg == 2'b01)?carriers[2] :
(yreg == 2'b10)?carriers[1] :
(yreg == 2'b11)?carriers[0] : 0;
//完成计数器,从而对模块时钟分频
always @ (posedge clk or negedge rst)
if(!rst)
count <= 3'b000;
else
count <= count +1;
//寄存输入:每4个clk周期,将输入x寄存到xreg中
always @ (posedge clk or negedge rst)
if(!rst)
count <= 2'b00;
else
if(count[1:0]==2'b11)
xreg <= {xreg[0],x};
else
xreg <= xreg;
//产生载波信号并且每8个周期将寄存器xreg的值送到yreg中,供后面判断输出
always @ (posedge clk or negedge rst)
if(!rst)
begin
carriers <= 4'b000;
yreg <= 2'b00;
end
else
begin
case(count)
3'b000:
begin
yreg <= xreg;
carriers <= 4'b1100;
end
3'b010: carriers <= 4'b1001;
3'b100: carriers <= 4'b0011;
3'b110: carriers <= 4'b0110;
default: carriers <= carriers;
endcase
end
endmodule
*************************************
QPSK解调
*************************************
module QPSK_de (clk,rst,x,y);
input clk;
input rst;
input x;
output y;
reg[7:0] temp;
reg[7:0] temp2;
reg[2:0] count;
wire [1:0] y1;
//根据temp的值,解调出相应的输入组合
assign y1 = (rst == 0) ? 2'b00:
(temp == 8'b11110000) ? 2'b00:
(temp == 8'b11000011) ? 2'b01:
(temp == 8'b00001111) ? 2'b10:
(temp == 8'b00111100) ? 2'b11:2'b00;
//qpsk解调输出信号
assign y = (count[2] == 0) ? y1[1] :y1[0];
//产生temp2和temp的值:每个clk周期,输入x到temp2,8个clk周期后,
//将temp2的值输入到temp中,供后面判断输出
always@(posedge clk or negedge rst)
if(!rst)
begin
count <= 3'b111;
temp <= 8'b0;
temp2 <= 8'b0;
end
else
begin
temp2 <= {temp2[6:0],x};
count <= count +1;
if(count == 3'b111)
temp <= temp2;
else
temp <= temp;
end
endmodule 展开
4个回答
展开全部
QPSK调制程序的testbench程序如下:
********************************************************************************
`timescale 1ns/1ns //单位时间,时间精度
module qpsk_tb; //qpsk调制的testbench
reg clk;
reg rst;
reg x;
wire y;
qpsk qpsk(.clk(clk),.rst(rst),.x(x),.y(y)); //将tb输入输出与主程序qpsk关联起来
always #25 clk=~clk; //#25表示25个时间单位,
// 这句表示clk信号的周期是50(*1ns)
initial
begin
clk=0;x=0;rst=0; //赋初值
#10;rst=1;x=1; //间隔10ns,将复位信号置为1
#10;x=0;
#400; x=1; //时钟周期是50ns,这里的信号表示的波形为
#400; x=0; //1111111100000000111100001100
#200; x=1;
#200; x=0;
#100; x=1;
#100; x=0;
end
endmodule
QPSK解调程序的testbench程序如下:
********************************************************************************
`timescale 1ns/1ns //单位时间,时间精度
module qpsk_detb; //qpsk解调的testbench
reg clk;
reg rst;
reg x;
wire y;
qpsk_de qpsk_de(.clk(clk),.rst(rst),.x(x),.y(y)); //将tb输入输出与主程序qpsk_de关联起来
always #25 clk=~clk; //#25表示25个时间单位
initial
begin
clk=0;x=0;rst=0;
#10;rst=1;x=1;#10;x=0; //时钟周期是50ns,这里的信号表示的波形为
#400;x=1;#400;x=0; //1111111100000000
#200;x=1;#200;x=0; //11110000
#200;x=0;#200;x=1; //00001111
#100;x=0;#200;x=1;#100;x=0; //00111100
#100;x=1;#200;x=0;#100;x=1; //11000011
#100;x=1;#100;x=0; //1100
end
endmodule
********************************************************************************
`timescale 1ns/1ns //单位时间,时间精度
module qpsk_tb; //qpsk调制的testbench
reg clk;
reg rst;
reg x;
wire y;
qpsk qpsk(.clk(clk),.rst(rst),.x(x),.y(y)); //将tb输入输出与主程序qpsk关联起来
always #25 clk=~clk; //#25表示25个时间单位,
// 这句表示clk信号的周期是50(*1ns)
initial
begin
clk=0;x=0;rst=0; //赋初值
#10;rst=1;x=1; //间隔10ns,将复位信号置为1
#10;x=0;
#400; x=1; //时钟周期是50ns,这里的信号表示的波形为
#400; x=0; //1111111100000000111100001100
#200; x=1;
#200; x=0;
#100; x=1;
#100; x=0;
end
endmodule
QPSK解调程序的testbench程序如下:
********************************************************************************
`timescale 1ns/1ns //单位时间,时间精度
module qpsk_detb; //qpsk解调的testbench
reg clk;
reg rst;
reg x;
wire y;
qpsk_de qpsk_de(.clk(clk),.rst(rst),.x(x),.y(y)); //将tb输入输出与主程序qpsk_de关联起来
always #25 clk=~clk; //#25表示25个时间单位
initial
begin
clk=0;x=0;rst=0;
#10;rst=1;x=1;#10;x=0; //时钟周期是50ns,这里的信号表示的波形为
#400;x=1;#400;x=0; //1111111100000000
#200;x=1;#200;x=0; //11110000
#200;x=0;#200;x=1; //00001111
#100;x=0;#200;x=1;#100;x=0; //00111100
#100;x=1;#200;x=0;#100;x=1; //11000011
#100;x=1;#100;x=0; //1100
end
endmodule
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具有以下基本参数:1. 工作频率:72MHz2. 外部时钟:最高可达120MHz3. 存储器容量:64K bytes4. 数据总线宽度:32位5. 输入/输出端口...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
对边写,每4个周期x变一次,然后与解调输出比较就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
好像代码有问题。解调部分没看,调制部分yreg应该根据xreg的值选择载波carriers。这里却根据count选择
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也遇到这个问题了,我想问下这个代码是正确的不啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询