tag 标签: 串并转换

相关博文
  • 热度 23
    2016-4-17 16:48
    1026 次阅读|
    0 个评论
    串并转换在数字电路的设计,特别在通信方面在尤其重要,比如 uart 串口协议, iic 串口协议的发送都需要用到并串转换,而接收就 相反,需要用到串并转换器,下面我们首先一起来简单设计一个并转 串的电路。          1.并转串           并转串的设计思想是这样的,首先准备好一组寄存器,把需要发 送的数据放到这个寄存器组里面,然后通过不断左移位(右移),把 数据一位一位发送出去,所以我们仅仅要设计一个可以左移位的寄存 器组就可以了。 代码: module parallel_to_serial(   //并转串 clk,rst_n, parallel_data,//并行数据输入 parallel_load,//并行数据使能信号 serial_data,//串行数据输出 serial_turn//串行数据使能 ); input clk,rst_n; input  parallel_data; input parallel_load; input serial_turn; output  serial_data; reg  data; always @(posedge clk or negedge rst_n) begin if(!rst_n) data = 8'd0; else if(parallel_load)//使能信号 data = parallel_data; else if(serial_turn)//转换使能 data = {data ,data }; //不断左移位(右移) else data = data ; end assign serial_data = data; endmodule  `timescale 1ns/1ns `define clock_period 20 module parallel_to_serial_tb(); reg clk,rst_n; reg  parallel_data; reg parallel_load,serial_turn; wire serial_data; initial clk = 1; always #(`clock_period/2)clk = ~clk; initial begin rst_n = 0; parallel_data = 0; parallel_load = 0; serial_turn = 0; #(`clock_period*5 + 1); rst_n = 1; #(`clock_period + 1); parallel_data = 8'b1010_1101; parallel_load = 1; #(`clock_period*10); parallel_load = 0; serial_turn = 1; #(`clock_period*50); serial_turn = 0; #(`clock_period*50); $stop; end parallel_to_serial parallel_to_serial( .clk(clk),.rst_n(rst_n), .parallel_data(parallel_data),//并行数据输入 .parallel_load(parallel_load),//并行数据使能信号 .serial_data(serial_data),//串行数据输出 .serial_turn(serial_turn)//串行数据使能 ); endmodule 仿真波形图: 由仿真图可看到,当 parallel_load 为高电平的时候, save_data 把parallel_data的值给捕获,然后当 serial_turn 为高电平的时候, serial_data 开始输出串行数据, parallel_data = 8’ b10101101 而 serial_data 的变化是 1→0→1→0→1→1→0→1 跟 parall_data 的 数据完成一样。                2. 串转并   串转并的设计思想是这样的,首先准备好一组寄存器,当来了一 位数据的时候,寄存器组左移(右移)一位,然后把发送过来的数据 寄存到寄存器组的最低位(最高位),当一组数据完整接收完毕的时 候,标志位会变高,表示当前数据可以采样。   代码: module serial_to_parallel(   //并转串 clk,rst_n, parallel_data,//并行数据输出 parallel_turn,//并行数据转换使能信号 parallel_finsh,//并行数据输出标志位 serial_data//串行数据输入 ); input clk,rst_n; input serial_data;//串行数据输入 input parallel_turn,//并行数据转换使能信号 output reg parallel_finsh,//并行数据输出标志位 output reg  parallel_data,//并行数据输出 reg  cnt; reg  data; wire cmp_result;//计数器比较结果 assign cmp_result = (cnt  == 1'd1)?1'd1:1'd0;//判断移位次数是否满足8次 always @(posedge clk or negedge rst_n) begin if(!rst_n) data = 8'd0; else if(parallel_turn) data = {data ,serial_data}; else data = {data ,1'd0}; end always @(posedge clk or negedge rst_n) begin if(!rst_n)begin parallel_data = 8'd0; parallel_finsh = 1'd0; end else begin parallel_data = data; parallel_finsh = cmp_result;//并行数据标准为输出 end  end always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt = 4'd0; else if(parallel_turn ^ cmp_result) cnt = cnt + 1'd1; else if(parallel_turn) cnt = 4'd1;//连续转换,计数器初始值1 else cnt = 4;d0; end endmodule `timescale 1ns/1ns `define clock_period 20 module parallel_to_serial_tb(); reg clk,rst_n; reg serial_data; reg parallel_turn; wire parallel_finsh; wire  parallel_data; initial clk = 1; always #(`clock_period/2)clk = ~clk; initial begin rst_n = 0; parallel_turn = 0; serial_data = 0; #(`clock_period*5 + 1); rst_n = 1; #(`clock_period*5); parallel_turn = 1; #(`clock_period*50); $stop; end always @(posedge clk) serial_data = {$random}%2; serial_to_parallel serial_to_parallel(   //并转串 .clk(clk),.rst_n(rst_n), .parallel_data(parallel_data),//并行数据输出 .parallel_turn(parallel_turn),//并行数据转换使能信号 .parallel_finsh(parallel_finsh),//并行数据输出标志位 .serial_data(serial_data)//串行数据输入 ); endmodule 仿真波形图: 由仿真图可以看到, parallel_finsh 为高电平的时候, parallel_data 等于 8’ b11010101,而在 parallel_turn 变成高电平 的时候, serial_data 的变化为 1→ 1→ 0→ 1→ 0→1→ 0→ 1, parallel_data 的值完全等于 serial_data 的 8 次连续变化,而截至 第二次 parallel_finsh 为高电平的时候, parallel_data 等于 8’ b10100010,而 serial_data 接着之前 1→1→0→1→0→1→0→1 变化,继续变化成 1→0→1→0→0→0→1→0,也是跟 parallel_data 的值完全一样的
  • 热度 26
    2016-2-5 01:07
    6057 次阅读|
    0 个评论
    移位寄存器与串并转换 实验目的 : ( 1 )用位拼接操作符实现移位寄存器(注意区分左移与右移); ( 2 )利用移位寄存器实现串 — 并转换,从当前工程的根目录下的 data.txt 文本中读取数据,作为串 — 并转换器的输入比特流,然后将这些串行输入的比特流转换为每组有 8bit 的数据; ( 3 )学会使用文件控制任务 $readmemb ,完成存储器变量(寄存器组)的初始化; ( 4 )学会写 Modelsim 脚本测试文件,并掌握测试脚本常用的命令及仿真方法。 实验内容及过程 : ( 1 )用位拼接符实现移位寄存器( data_in 是输入的位宽为 1bit 的信号, shift_reg 是位宽为 8bit 的输出变量) 【右移操作】 思想:将每次输入的 data_in 放到 shift_reg 的最高位,同时去掉 shift_reg 的最低位,然后达到向右移位的效果。       shift_reg = {data_in, shift_reg };       // 过程枚举:       // 第 1 个时钟周期: (data_in_1,0000000)       // 第 2 个时钟周期: (data_in_2,data_in_1,000000)       //...... // 第 8 个时钟周期: (data_in_8,data_in_7,data_in_6,data_in_5,data_in_4,data_in_3,data_in_2,data_in_1) 【左移操作】 思想:将每次输入的 data_in 放到 shift_reg 的最低位,同时去掉 shift_reg 的最高位,然后达到向左移位的效果。             shift_reg = {shift_reg , data_in};       // 过程枚举:       // 第 1 个时钟周期: (0000000,data_in_1)       // 第 2 个时钟周期: (000000,data_in_1,data_in_2)       //......       // 第 8 个时钟周期: (data_in_1,data_in_2,data_in_3,data_in_4,data_in_5,data_in_6,data_in_7,data_in_8)          ( 2 )串 — 并转换 串 — 并转换是在移位寄存器的基础上实现的,将输入的串行数据 data_in 按照每 8bit 为一组的形式“组装”成新的并行数据。具体而言,就是将 data_in 输入的比特流一位一位地(逐位)送入移位寄存器,然后,串 — 并转换器每 8 个时钟周期读取一次移位寄存器输出端的数据(在这里也就是读 shift_reg 的值, 8 个时钟周期的控制由计数器完成),并将数据按照并行 8bit 的形式输出。 本实验应采用哪种移位操作方式呢?根据串行输入“先传低位,后传高位”的一般规则,故本实验需采用右移操作的方式,将最先送进来的比特放在 shift_reg 的最低位,然后依次按照“由低位至高位”的方式依次存放各比特。实验代码截图如下所示: Testbench 代码如下: 【文件控制任务 $readmemb 】 $readmemb 是专门用作读取文本文件中的二进制数据,并用这些数据初始化存储器变量(寄存器组),如: testbench 代码中的 $readmemb("./data.txt", mem1x16) 语句,它将是用来读取当前 modelsim 工程根目录下的 data.txt 中的数据(数据内容见图 1 所示),然后将这些值赋给 mem1x16 (它是一个有 16 个 1 位位宽的寄存器组)。 说明:上面的 ./data.txt 是相对路径, $readmemb 还可以使用绝对路径。 图 1 data.txt 中的数据 ( 3 )测试脚本的书写 对比传统的鼠标点击方式和使用测试脚本运行仿真,后者较前者更加快速和便捷,在提高调试代码的效率的同时,提高了仿真的准确性,避免了鼠标点击时易点错或者漏添加文件的现象。总之,使用测试脚本的方式更方便、快捷、高效。 注意:用测试脚本仿真也要先建工程,建完工程就不用管了(不用手动添加文件、编译文件等)。 ① # 号是注释符; ② quit –sim 命令是退出当前仿真(终止仿真过程,关闭仿真窗口,但不关闭当前工程), .main clear 命令是清除命令行显示窗口中的内容; ③ 本实验的测试脚本内容如下: # 退出当前仿真 quit   -sim # 清除命令行显示窗口的内容 .main       clear   # 创建库 lib (就是在当前工程根目录下创建文件夹) vlib   lib vlib   ./lib/work # 将 work 逻辑库映射到实际的文件路径上来 vmap   work   ./lib/work   # 也可以采用以下的简单用法 # vmap       work   work # 因为新建仿真工程的时候就自动生成了 work 库和 work 文件夹,所以只需要做简单的映射即可   # 编译(第 2 个 work 是逻辑库的名字, ./ 是当前目录, ../ 是上一目录) vlog   -work work   ./tb_ex_shift_reg.v vlog   -work work   ./../design/ex_shift_reg.v # 方法二 -- 用通配符,编译 design 文件夹中的所有 .v 文件(避免反复添加) vlog   -work work   ./../design/*.v   # 启动仿真( -voptargs=+acc 是编译参数,决定是否优化) vsim   -voptargs=+acc     work.tb_ex_shift_reg # 不带优化的仿真 # vsim       -novopt      work.tb_ex_shift_reg   # 添加波形( tb_ex_shift_reg 是模块名, data_in 是该模块的信号) add    wave   tb_ex_shift_reg/data_in add    wave   tb_ex_shift_reg/data_out add    wave   tb_ex_shift_reg/sclk add    wave   tb_ex_shift_reg/rst_n add    wave   tb_ex_shift_reg/mem1x16   # 添加例化模块的信号( ex_shift_reg_inst 是例化的模块名) add    wave   tb_ex_shift_reg/ex_shift_reg_inst/*   run 1us 仿真波形图如图 2 所示: 图 2 仿真波形图 由图 2 可知,串 — 并转换后的数据通过 data_out 输出,先输出的是 01010101 ( 0x55 ),后输出的是 00010001 ( 0x11 ),这与 data.txt 中的数据是一致的—— data.txt 中的存放顺序是 1010101010001000 ,经过串 — 并转换后,变为了 0101010100010001 ,因“低位先传,高位后传”的原因发生了逆序,但仿真结果与我们的设计初衷是一致的,故仿真验证通过。
  • 热度 18
    2015-11-28 11:51
    1170 次阅读|
    0 个评论
    笔者收集的一些设计思想的资料,下面是链接。链接是笔者在另外一个论坛发的帖子,希望大家支持。 http://www.16rd.com/thread-29007-1-1.html
相关资源
  • 所需E币: 1
    时间: 2020-12-20 22:14
    大小: 80KB
    上传者: zendy_731593397
    串并转换实验串并转换实验
  • 所需E币: 0
    时间: 2020-9-22 22:33
    大小: 17.49KB
    上传者: bwj312
    串并转换建模和数据流串并转换的实现
  • 所需E币: 3
    时间: 2019-12-25 16:06
    大小: 105.81KB
    上传者: 238112554_qq
    FPGA设计的四种常用思想与技巧……
  • 所需E币: 5
    时间: 2019-12-25 12:31
    大小: 59.5KB
    上传者: wsu_w_hotmail.com
    MASK调制VHDL程序及仿真8.12MASK调制VHDL程序与仿真见随书所附光盘中文件:8.12MASK调制VHDL程序与仿真。--文件名:PL_MASK--功能:基于VHDL硬件描述语言,对基带信号进行MASK调制--说明:这里MASK中的M为4--最后修改日期:2004.2.13libraryieee;useieee.std_logic_arith.all;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityPL_MASKisport(clk:instd_logic;--系统时钟start:instd_logic;--开始调制信号x:instd_logic;--基带信号y:outstd_logic_vector(7downto0));--8位DAC数据endPL_MASK;architecturebehavofPL_MASKissignalq:integerrange0to7;--计数器signalqq:integerrange0to3;--计数器signalxx:std_logic_vector(3downto0);--并行数据寄存器signalyy:std_logic_vector(7downto0);--8位DAC数据寄存器beginprocess(clk)……
  • 所需E币: 5
    时间: 2020-1-2 02:03
    大小: 146.67KB
    上传者: 二不过三
    借助EDA工具软件设计了一个逻辑控制部件,解决了CPU寻址空间不足、接口功能不全等问题.此基于CPLD的可重构硬件数字平台具有可移植性,使CPU对外接器件近似透明,在更换其他类型CPU后,仅做少量软件和硬件修改即可升级成为新系统.测控技木与仪器仪表基于CPLD的电子秤逻辑接口设计尹湛华,欧阳明星(广东松山职业技术学院电气工程系,广东韶关512126)摘要:借助EDA工具软件设计了一个逻辑控制部件,解决了CPU寻址空间不足、接口功能不全等问题。此基于CPLD的可重构硬件数字平台具有可移植性,使CPU砖外接器件近似透明,在更换其他类型CPU后,仅做少量软件和硬件修改即可升级成为新系统。关键词:CPLD可重构地址扩展串并转换Thelogicinter{如edesignofelectmnicplatfoHnbalancebasedonCPLDⅥNZhanHua,OUYANGMingXing(Depa栅衄t……
  • 所需E币: 5
    时间: 2019-12-25 05:58
    大小: 300.78KB
    上传者: 二不过三
    FPGA重要设计思想及工程应用之乒乓操作及串并转换设计……
  • 所需E币: 5
    时间: 2019-12-25 04:01
    大小: 300.74KB
    上传者: 微风DS
    FPGA工程应用之乒乓操作及串并转换……