一次输出8bit-n4-m序列Simulink仿真Verilog实现

合集下载

verilog实现输入三个8bit数,输出三个数据的中间数据。注意考虑资源优化的方式。 -回复

verilog实现输入三个8bit数,输出三个数据的中间数据。注意考虑资源优化的方式。 -回复

verilog实现输入三个8bit数,输出三个数据的中间数据。

注意考虑资源优化的方式。

-回复题目要求我们使用Verilog实现输入三个8位数,输出这三个数的中间数据,并且需要考虑资源优化的方式。

在本文中,我们将从以下几个方面进行讨论和实现:1. Verilog语言概述:我们将简要介绍Verilog语言的基本结构和特点,为后续的具体实现做好铺垫。

2. 输入三个8位数:通过使用Verilog的输入输出端口,我们可以实现将三个8位数作为输入写入Verilog代码中。

3. 输出中间数据:我们将介绍如何通过Verilog的内部变量来计算并输出三个8位数的中间数据。

具体实现的方式取决于我们对中间数据的定义和计算公式。

4. 资源优化:通过使用Verilog中的一些优化技术,如信号复用、指定可优化的结构以及使用FPGA资源分配得当等,我们可以在实现这个功能的同时尽量减少硬件资源的使用。

现在,让我们逐步回答这些问题。

1. Verilog语言概述Verilog是一种硬件描述语言(HDL),用于描述和模拟数字电路。

它是一种行为级(Behavioral)语言,并使用了逻辑门的概念来描述电路的功能和行为。

Verilog具有高度的可移植性和可扩展性,因此被广泛应用于数字电路设计和验证。

2. 输入三个8位数在Verilog中,我们可以通过使用input关键字定义输入端口,并指定位宽来实现输入三个8位数的功能。

具体的代码示例如下:verilogmodule input_module(input [7:0] num1,input [7:0] num2,input [7:0] num3);在上面的代码中,我们使用[num:low]的形式来定义位宽为8的输入端口num1、num2和num3。

3. 输出中间数据为了输出三个数的中间数据,在Verilog中,我们可以使用reg或wire 关键字定义内部变量,并使用assign关键字将这些变量与输出端口相连。

verilog实现8路数据选择器

verilog实现8路数据选择器

《串行数据检测器》实验报告* All right reserved*/module mux_8(addr, in1, in2, in3, in4, in5,in6,in7,in8,mout,ncs); input [2:0] addr; //输入的地址端,3位选择开关input [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //8路数据端输入input ncs; //使能信号output [3:0] mout; //一路输出reg [3:0] mout; //输出声明为寄存器类型always @(addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or ncs) //8路输入或者选择开关或者使能信号发生变化则条件触发beginif(!ncs) //低电平使能case(addr)3'b000: mout = in1; //选择开关的3位对应000时,输出等于in1输入;3'b001: mout = in2; //选择开关的3位对应001时,输出等于in1输入;3'b010: mout = in3; //选择开关的3位对应010时,输出等于in1输入;3'b011: mout = in4; //选择开关的3位对应011时,输出等于in1输入;3'b100: mout = in5; //选择开关的3位对应100时,输出等于in1输入;3'b101: mout = in6; //选择开关的3位对应101时,输出等于in1输入;3'b110: mout = in7; //选择开关的3位对应110时,输出等于in1输入;3'b111: mout = in8; //选择开关的3位对应111时,输出等于in1输入;endcaseelsemout = 0; //使能信号高电平时输出一直为0;endendmodule2.编写测试模块test_mux_8.v如下/*** @File test_mux_8.v* @Synopsis 这是8路数据选择器mux_8的测试模块* @Author 陈昊, @* @Version 1* @Date 2010-11-05*//* Copyright(0) 2010-* By* All right reserved*/`timescale 1ns/1nsmodule test_mux_8;wire[3:0] mout; //声明输出为线网型,4位reg [3:0] in1,in2,in3,in4,in5,in6,in7,in8; //声明8路输入信号reg [2:0] addr; //3位的选择开关,寄存型类型reg ncs; //1位的寄存器型使能信号//-------------------------------------------------------------产生测试信号------------------------------------------------------ initialbeginncs=0; //在初始化模块里将使能信号置为0,让选择器正常工作in8={$random}%16; //使用系统任务$random产生一个0至15之间的数in1={$random}%16; //并赋予输入in2={$random}%16;in3={$random}%16;in4={$random}%16;in5={$random}%16;in6={$random}%16;in7={$random}%16;addr=3'b000; //让选择开关的3位初始对应为000.repeat(5) //重复下面的语句块5次,赋5次值 begin#10 in8={$random}%16;in1={$random}%16;in2={$random}%16;in3={$random}%16;in4={$random}%16;in5={$random}%16;in6={$random}%16;in7={$random}%16;addr=addr+1; //每执行一次后改变一次选择开关的值,加1end#10 $stop;end//-------------------------------------------------------------------2.选择Altera STRATIX器件库利用Synplify Pro综合产生的RTL级电路如下五、分析与讨论。

一次输出8bit_n4_m序列Simulink仿真Verilog实现

一次输出8bit_n4_m序列Simulink仿真Verilog实现

1.4阶m序列生成器一开始希望通过使用8个PN序列生成器并行实现,但是,每个生成器都不能得到后8个状态的值。

由于后面的8bit PN序列,通过一个clk不可能通过状态转换实现,所以,只能通过计算得到利用Matlab计算得到后8位PN码与初始状态的关系,得到一个输出生成矩阵,使用生成矩阵与初始状态相乘,即可得到8位PN码同时,计算得到生成第8位PN码时移位寄存器的状态,得到一个初始值生成矩阵,使用此矩阵与初始状态相乘,即可得到生成第8位PN码时移位寄存器的状态,从而为下一次迭代提供初始状态。

两个矩阵在PN码生成过程中保持不变,而初始状态得到不断更新,8位PN码不断输出。

clc; clear;n = 4; % 4 orderbit = zeros(9,n^2);bit(1,:) = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1];initial = [1 0 0 0];for i = 2:9% generate polynimial, 1 + x + x^4, ==========x + x^4,bit(i,:) = [ mod( bit(i-1,1:n)+bit(i-1,3*n+1:4*n), 2), bit(i-1,1:3*n)];endgenmatrix = bit(2:9,3*n+1:4*n) % generate matrix remain the samefor j = 1:1mseq = mod(genmatrix*initial', 2)% Update initialtemp = initial;for k = 1:ninitial(k) = mod( sum(bit(9,(k-1)*n+1:k*n)*temp'), 2);endend输出生成矩阵为:genmatrix =0 0 1 00 1 0 01 0 0 01 0 0 11 0 1 11 1 1 10 1 1 11 1 1 0初始状态值生成矩阵为:gm_init =1 1 0 11 0 1 00 1 0 11 1 1 0Verilog代码:`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 15:24:21 05/01/2012// Design Name:// Module Name: PNcode8bit//////////////////////////////////////////////////////////////////////////////////// module PNcode8bit(clk,rst,init,PNout);// PN code n = 4, f(x) = 1 + x + x^4// Output 8 bit per clkparameter order = 4;input clk;input rst;output [order-1 : 0] init;output [7 : 0] PNout;// Output use registerreg [7 : 0] PNout = 0;reg [order-1 : 0] init = 0;// Generate matrix of output, use memoryreg [order-1 : 0] gm_out [7 : 0];// Generate matrix of initial state, use memoryreg [order-1 : 0] gm_init [3 : 0];integer i, j;//////////////////////////////////////////// Memory initialization file read here, generate by Matlabinitialbegin$readmemb("gm_out.txt", gm_out, 7, 0);$readmemb("gm_init.txt", gm_init, 3, 0);end//////////////////////////////////////////always @ (posedge clk)if(rst == 1)beginPNout <= 8'b0;init <= 4'b1000;endelsebeginfor(i=0; i<8; i=i+1)PNout[i] <= (gm_out[i][3] & init[3]) ^ (gm_out[i][2] & init[2]) ^ (gm_out[i][1] & init[1]) ^ (gm_out[i][0] & init[0]);for(j=0; j<4; j=j+1)init[j] <= (gm_init[j][0] & init[0]) ^ (gm_init[j][1] & init[1]) ^ (gm_init[j][2] & init[2]) ^ (gm_init[j][3] & init[3]);endendmodule说明:1.使用readmemb实现存储器数据的初始化,读取二进制内容,因为两个生成矩阵会比较大$readmemb("gm_out.txt", gm_out, 7, 0);"gm_out.txt"为读取的文件,gm_out为存放的存储器名字,7, 0为起始地址和结束地址,最好注明地址范围,不注明好像不太确定2.按位与、按位异或实现二进制矩阵乘法第一个for是输出生成矩阵(8x4)与初始值(4x1)相乘,得到8bit PN码的输出第二个for是初始状态值生成矩阵(4x4)与初始值(4x1)相乘,得到新的初始值gm_out.txt内容:没有空格00100100100010011011111101111110gm_init.txt内容:没有空格1101101001011110测试文件代码:`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 16:27:38 05/01/2012// Design Name: PNcode8bit// Module Name: E:/me/CAST/Project/FPGAcomm/PNcode8bit/PNcode8bit_tb.v// Project Name: PNcode8bit////////////////////////////////////////////////////////////////////////////////// module PNcode8bit_tb;// Inputsreg clk;reg rst;// Outputswire [3:0] init;wire [7:0] PNout;// Instantiate the Unit Under Test (UUT)PNcode8bit uut (.clk(clk),.rst(rst),.init(init),.PNout(PNout));initial begin// Initialize Inputsclk = 0;rst = 1;// Wait 100 ns for global reset to finish#100;rst = 0;// Add stimulus hereendalways beginforever #10 clk = !clk;endendmoduleModelSim仿真结果局部放大图,绿色竖线为周期间隔,一个周期的PN码为:001111010110010。

verilog实现输入三个8bit数,输出三个数据的中间数据。注意考虑资源优化的方式。 -回复

verilog实现输入三个8bit数,输出三个数据的中间数据。注意考虑资源优化的方式。 -回复

verilog实现输入三个8bit数,输出三个数据的中间数据。

注意考虑资源优化的方式。

-回复Verilog实现输入三个8bit数,输出三个数据的中间数据。

注意考虑资源优化的方式引言:Verilog是一种硬件描述语言,常用于数字电路设计和嵌入式系统开发。

在数字电路设计中,优化资源的使用是非常重要的,特别是在现代的高度集成的芯片中。

本文将介绍如何使用Verilog实现输入三个8bit数并输出三个数据的中间数据,并探讨如何通过优化资源以提高设计的效率。

第一部分:概述和设计需求首先,我们需要明确设计需求。

根据题目的要求,我们需要实现一个模块,该模块能够接收三个8bit数作为输入,并将三个数据的中间数据作为输出。

这意味着我们需要设计一个模块,它至少包含三个8bit的输入端口和一个8bit的输出端口。

第二部分:Verilog代码设计接下来,我们开始编写Verilog代码。

我们可以定义一个模块,并在该模块中声明输入和输出端口。

下面是一个简单的示例代码:module data_processing(input [7:0] data_in1,input [7:0] data_in2,input [7:0] data_in3,output [7:0] data_out);中间数据声明wire [7:0] intermediate_data;中间数据计算assign intermediate_data = (data_in1 + data_in2 + data_in3) / 3;输出端口赋值assign data_out = intermediate_data;endmodule在上述代码中,我们首先声明了输入和输出端口,然后定义了一个中间数据的wire变量。

接着,我们使用assign语句计算中间数据的值,计算方法是将三个输入数据相加,然后除以3。

最后,我们将中间数据赋值给输出端口。

第三部分:资源优化接下来,我们将讨论如何通过优化资源以提高设计的效率。

m序列Simulink仿真实现

m序列Simulink仿真实现

m序列Simulink仿真Verilog实现1. 4阶m序列生成器Simulink模型如下:其中,可以在Unit Delay属性中设置初始值为1000,由于Unit Delay输出为double,所以要将其转为Boolean以便进行模二加运算,使用XOR实现。

下面分别是最后一级和所有级的输出波形,可以看出,与上面的是一致的。

Verilog实现`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 11:02:17 05/01/2012// Design Name:// Module Name: PNcode// Project Name:////////////////////////////////////////////////////////////////////////////////// module PNcode(clk,rst,PNstate,PNout);input clk;input rst;output PNstate;output PNout;// PN code n = 4, f(x) = 1 + x + x^4parameter order = 4;reg PNout = 0;reg [order-1 : 0] PNstate = 0;always @ (posedge clk)if(rst == 1)beginPNout <= 0;PNstate <= 4'b1000; // PN seed = b1000endelsebeginPNout <= PNstate[0];PNstate <= {PNstate[3]+PNstate[0], PNstate[3:1]};endendmodule测试文件:`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 14:37:43 05/01/2012// Design Name: PNcode// Module Name: E:/me/CAST/Project/FPGAcomm/PNcode/PNcode_tb.v// Project Name: PNcode////////////////////////////////////////////////////////////////////////////////// module PNcode_tb;// Inputsreg clk;reg rst;// Outputswire [3:0] PNstate;wire PNout;// Instantiate the Unit Under Test (UUT)PNcode uut (.clk(clk),.rst(rst),.PNstate(PNstate),.PNout(PNout));initial begin// Initialize Inputsclk = 0;rst = 1;// Wait 100 ns for global reset to finish#100;rst = 0;// Add stimulus hereendalways beginforever #10 clk = !clk;endendmoduleclk使用一个单独的always模块输出序列:0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 2. 8阶m序列生成器,初始全为11。

simulink入门及仿真实例

simulink入门及仿真实例

17
结果如下:上图为v(t), 下图为h(t).
18
r1 r2 1, n1 n2 100, s1 0.5, s2 2, x0 y0 10.
对x(t), y(t)进行模拟, 研究其发展趋势.
16
例3 弹跳的皮球(help/demos/simulink中的一个例子):
v(t) 15 tgdt, g 9.81, 0 t 数学模型:h(t) 10 0 v(t)dt, when h 0, v 0.8v.
4
子库 Continuous和 Discrete分别存放连续 和离散的函数, 如连续函数有Derivative(求导 数), Integrator(积分器), State-Space(状态空间), Transfer Fcn( 传 递 函 数 ) 等 等 , 离 散 的 有 Discrete Transfer Fcn(离散传递函数), Discrete Filter(离散滤波器), Discrete State-Space(离散 状态空间)等等. 在Simulink Library Browser窗口中, 建立 一个新模型(new model), 即打开一个新的空 白模型窗口, 用鼠标左键点取所需要的模块 拖到模型窗口中, 用鼠标左键在模块间建立 连接线(若在已有连接线上分叉则用右键)即 可.
Simulink入门
什么是Simulink? Simulink是MATLAB提供的实现动态 系统建模和仿真的一个软件包. 它让用户 把精力从编程转向模型的构造. Simulink一个很大的优点是为用户省 去了许多重复的代码编写工作,
1
Simulink的启动
首先须确定MATLAB已安装了Simulink工 具箱. 在工具栏点击Simulink图标:

【仿真】【modelsim】:verilog功能仿真流程

【仿真】【modelsim】:verilog功能仿真流程⼀、编写verilog源⽂件,在diamond中编译。

编写testbench⽂件。

在diamond设置中将仿真⼯具设置为modelsim,运⾏仿真向导⼆、⾃动进⼊modelsim, 编译全部 运⾏仿真---library的work下,选则测试⽂件,右键仿真 点击运⾏到或者运⾏⼀段等testbench实例1 `timescale 1 ns/ 1 ps2module clk_tb();3// constants4// general purpose registers5reg eachvec;6// test vector input registers7reg CLK;8reg RSTn;9reg KEY_set;10reg KEY_add;11wire lcd_rst,sce,sclk,sdin,cd;1213// assign statements (if any)14 top sim15 (16 .CLK(CLK),17 .RSTn(RSTn),18 .KEY_set(KEY_set),19 .KEY_add(KEY_add),20 .lcd_rst(lcd_rst),21 .sce(sce),22 .sclk(sclk),23 .sdin(sdin),24 .cd(cd)25 );26initial27begin28 CLK = 0;29forever #25 CLK = ~CLK;30end3132initial33begin34 RSTn =1;35 #200 RSTn = 0;36 #300 RSTn = 1;37end3839initial40begin41 KEY_set =1;42 #1000 KEY_set =~KEY_set;43end4445endmodule1/**************************************************2module: DDS_test3author: wanganran4description: The testbench for module DDS5input:6output:7date: 2015.11.058**************************************************/9 `timescale 1ns / 100ps1011module DDS_test;1213parameter CLK_PERIOD = 40; //CLK_PERIOD=40ns, Frequency=25MHz1415reg sys_clk;16initial17 sys_clk = 1'b0;18always19 sys_clk = #(CLK_PERIOD/2) ~sys_clk;2021reg sys_rst_n; //active low22initial23begin24 sys_rst_n = 1'b0;25 #200;26 sys_rst_n = 1'b1;27end2829wire dac_clk_out;30wire [9:0] dac_data_out;31 DDS DDS_uut32 (33 .clk_in(sys_clk), //clock in34 .rst_n_in(sys_rst_n), //reset, active low35 .dds_en_in(1), //dds work enable36 .f_increment(24'h10000), //frequency increment37 .p_increment(0), //phase increment38 .dac_clk_out(dac_clk_out), //clock out39 .dac_data_out(dac_data_out) //data out40 );4142endmoduleView Code⼆、带IP核仿真遇到问题仿真⼯具,diamond⾃带activeHDL错误描述,仿真PLL时结果正常,仿真ROM的时候出现问题 # ELAB2: Fatal Error: ELAB2_0036 Unresolved hierarchical reference to "PUR_INST.PURNET" from module "FifoTest_tb.rom.rom_0_3" (module not found). ELAB2: Fatal Error: ELAB2_0036 Unresolved hierarchical reference to "PUR_INST.PURNET" from module "FifoTest_tb.fifo.FifoMacro_0_3" (module not found).问题解决,在仿真顶层⽂件中加GSR GSR_INST (.GSR (<global reset sig>));PUR PUR_INST (.PUR (<powerup reset sig>));即可括号中的具体参数可写为1’b1,即三、仿真波形的个性化1.颜⾊和线条等设置2.波形数据模拟显⽰。

verilog实现输入三个8bit数,输出三个数据的中间数据。注意考虑资源优化的方式。 -回复

verilog实现输入三个8bit数,输出三个数据的中间数据。

注意考虑资源优化的方式。

-回复标题:Verilog实现输入三个8bit数并输出中间数据的资源优化方法在数字设计和硬件编程中,Verilog作为一种硬件描述语言,被广泛用于设计和模拟数字系统。

本文将详细阐述如何使用Verilog实现输入三个8bit数,并输出这三个数据的中间数据,同时考虑资源优化的方式。

首先,我们需要明确问题的需求。

我们需要设计一个模块,该模块接受三个8bit的输入数据(a, b, c),并输出这三个数据的中间值。

中间值的定义为这三个数中居中的数值。

例如,如果输入的数据为a=10,b=20,c=30,那么中间值应为20。

以下是一个基本的Verilog代码实现:verilogmodule middle_value(input [7:0] a, b, c, output reg [7:0] mid);always (*) beginif(a > b) beginif(b > c)mid = b;else if(a > c)mid = c;elsemid = a;endelse beginif(a > c)mid = a;else if(b > c)mid = c;elsemid = b;endendendmodule以上代码实现了基本的功能,但是并没有进行资源优化。

在考虑资源优化时,我们主要关注的是如何减少逻辑门的数量和提高电路的运行速度。

一种可能的优化策略是通过比较运算符和条件语句的简化来减少逻辑门的数量。

以下是一个优化后的代码:verilogmodule middle_value(input [7:0] a, b, c, output reg [7:0] mid);wire [7:0] temp1, temp2;assign temp1 = (a > b) ? a : b;assign temp2 = (c > temp1) ? c : temp1;assign mid = temp2;endmodule在这个优化版本中,我们首先比较a和b,将较大的值赋给temp1。

verilog八位十进制计数器实验报告(附源代码)

8位10进制计数器实验报告一、实验目的●学习时序逻辑电路●学会用verilog语言设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显示原理二、实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。

4.每0.5s计数值加15.8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为06.用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。

7.用7段数码管的后两位显示16进制下8位结果。

三、实验结果拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。

之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。

从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。

之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。

拨动复位信号时,无视WE信号,直接复位。

仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。

这样就需要两种不同的频率信号。

一种是每0.5s一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。

【MATLAB课件】第六章simulink仿真


5
MATLAB语言
6.2.2建模与仿真 6.2.2建模与仿真
建模仿真的一般过程是: 建模仿真的一般过程是: 打开一个空白的编辑窗口; 打开一个空白的编辑窗口; 将模块库中模块复制到编辑窗口里, 将模块库中模块复制到编辑窗口里,并依照要求修改编辑 窗口中模块的参数; 窗按要求连接起来; 用菜单选择或命令窗口键入命令进行仿真分析, 用菜单选择或命令窗口键入命令进行仿真分析,在仿真的 同时,可以观察仿真结果,如果发现有不正确的地方, 同时,可以观察仿真结果,如果发现有不正确的地方,可 以停止仿真,对参数进行修正; 以停止仿真,对参数进行修正; 如果对结果满意,可以将模型保存。 如果对结果满意,可以将模型保存。
15
MATLAB语言
二、修饰模块 1.调整模块的大小 1.调整模块的大小 2.调制模块位置 2.调制模块位置 3.调制模块方向 3.调制模块方向 Format菜单→ Block:旋转180° 旋转180 Format菜单→Flip Block:旋转180° 菜单 Format菜单→ Block:顺时针旋转90° 顺时针旋转90 Format菜单→Rotate Block:顺时针旋转90° 菜单 4.调整模块颜色和效果 4.调整模块颜色和效果 Format菜单→ color:修改模块的前景颜色 Format菜单→Foreground color:修改模块的前景颜色 菜单 Format菜单→Background color:修改模块的背景颜色 Format菜单→ color:修改模块的背景颜色 菜单 Format菜单→ color:修改模型的背景颜色 Format菜单→Screen color:修改模型的背景颜色 菜单 Format菜单→ shadow:给模块添加阴影 Format菜单→Show drop shadow:给模块添加阴影 菜单
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.4阶m序列生成器
一开始希望通过使用8个PN序列生成器并行实现,但是,每个生成器都不能得到后8个状态的值。

由于后面的8bit PN序列,通过一个clk不可能通过状态转换实现,所以,只能通过计算得到
利用Matlab计算得到后8位PN码与初始状态的关系,得到一个输出生成矩阵,使用生成矩阵与初始状态相乘,即可得到8位PN码
同时,计算得到生成第8位PN码时移位寄存器的状态,得到一个初始值生成矩阵,使用此矩阵与初始状态相乘,即可得到生成第8位PN码时移位寄存器的状态,从而为下一次迭代提供初始状态。

两个矩阵在PN码生成过程中保持不变,而初始状态得到不断更新,8位PN码不断输出。

clc; clear;
n = 4; % 4 order
bit = zeros(9,n^2);
bit(1,:) = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1];
initial = [1 0 0 0];
for i = 2:9
% generate polynimial, 1 + x + x^4, ==========x + x^4,
bit(i,:) = [ mod( bit(i-1,1:n)+bit(i-1,3*n+1:4*n), 2), bit(i-1,1:3*n)];
end
genmatrix = bit(2:9,3*n+1:4*n) % generate matrix remain the same
for j = 1:1
mseq = mod(genmatrix*initial', 2)
% Update initial
temp = initial;
for k = 1:n
initial(k) = mod( sum(bit(9,(k-1)*n+1:k*n)*temp'), 2);
end
end
输出生成矩阵为:
genmatrix =
0 0 1 0
0 1 0 0
1 0 0 0
1 0 0 1
1 0 1 1
1 1 1 1
0 1 1 1
1 1 1 0
初始状态值生成矩阵为:
gm_init =
1 1 0 1
1 0 1 0
0 1 0 1
1 1 1 0
Verilog代码:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////// // Company:
// Engineer:
//
// Create Date: 15:24:21 05/01/2012
// Design Name:
// Module Name: PNcode8bit
//
////////////////////////////////////////////////////////////////////////////////// module PNcode8bit(
clk,
rst,
init,
PNout
);
// PN code n = 4, f(x) = 1 + x + x^4
// Output 8 bit per clk
parameter order = 4;
input clk;
input rst;
output [order-1 : 0] init;
output [7 : 0] PNout;
// Output use register
reg [7 : 0] PNout = 0;
reg [order-1 : 0] init = 0;
// Generate matrix of output, use memory
reg [order-1 : 0] gm_out [7 : 0];
// Generate matrix of initial state, use memory
reg [order-1 : 0] gm_init [3 : 0];
integer i, j;
//////////////////////////////////////////
// Memory initialization file read here, generate by Matlab
initial
begin
$readmemb("gm_out.txt", gm_out, 7, 0);
$readmemb("gm_init.txt", gm_init, 3, 0);
end
//////////////////////////////////////////
always @ (posedge clk)
if(rst == 1)
begin
PNout <= 8'b0;
init <= 4'b1000;
end
else
begin
for(i=0; i<8; i=i+1)
PNout[i] <= (gm_out[i][3] & init[3]) ^ (gm_out[i][2] & init[2]) ^ (gm_out[i][1] & init[1]) ^ (gm_out[i][0] & init[0]);
for(j=0; j<4; j=j+1)
init[j] <= (gm_init[j][0] & init[0]) ^ (gm_init[j][1] & init[1]) ^ (gm_init[j][2] & init[2]) ^ (gm_init[j][3] & init[3]);
end
endmodule
说明:
1.使用readmemb实现存储器数据的初始化,读取二进制内容,因为两个生成矩阵会比较大
$readmemb("gm_out.txt", gm_out, 7, 0);
"gm_out.txt"为读取的文件,gm_out为存放的存储器名字,
7, 0为起始地址和结束地址,最好注明地址范围,不注明好像不太确定
2.按位与、按位异或实现二进制矩阵乘法
第一个for是输出生成矩阵(8x4)与初始值(4x1)相乘,得到8bit PN码的输出
第二个for是初始状态值生成矩阵(4x4)与初始值(4x1)相乘,得到新的初始值
gm_out.txt内容:没有空格
0010
0100
1000
1001
1011
1111
0111
1110
gm_init.txt内容:没有空格
1101
1010
0101
1110
测试文件代码:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 16:27:38 05/01/2012
// Design Name: PNcode8bit
// Module Name: E:/me/CAST/Project/FPGAcomm/PNcode8bit/PNcode8bit_tb.v
// Project Name: PNcode8bit
//
////////////////////////////////////////////////////////////////////////////////
module PNcode8bit_tb;
// Inputs
reg clk;
reg rst;。

相关文档
最新文档