|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
目前代码是书上简陋的相位选择法来实现的,testbeach是小白自己编的,
- module qpsk_tb; //qpsk调制的testbench非常想请教大牛们,目前不知道编的对不对,小白又不太会看simulation的图像,请指教,谢谢!
- reg clk=0;
- reg rst=0;
- reg [7:0]reg_buf;
- reg x,clk_div=0;
- wire y;
- QPSK qpsk_tb(.clk(clk),.rst(rst),.x(x),.y(y)); //将tb输入输出与主程序qpsk关联起来
- initial
- #10 rst=1;
- begin
- always #25 clk=~clk; //#25表示25个时间单位,
- always #100 clk_div=~clk_div;
- always @ (posedge clk or negedge rst)
- begin
- if (!rst)
- reg_buf[7:0]<=8'b10000100;
- else
- reg_buf[7:0]<={reg_buf[6:0],reg_buf[2]^reg_buf[7]};
- x<=reg_buf[7]^clk_div;
- end
- end
- endmodule
复制代码
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=2'b00; //输入信号的中间寄存器
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 |
|