- 2024-11-09
-
发表了主题帖:
pynq snn加速核工程分析求助
本帖最后由 小孩彦旻旻 于 2024-11-9 16:25 编辑
想问问大佬,pynq如何进行一个完整的数据流程分析。
图一是连线,怎么分析。(Block Design里面的所有模块该如何学习呢)
图二是这个snn工程。
我究竟该如何分析这个snn工程的完整数据流程呢
读PS端的python代码照着分析可以吗
- 2024-07-27
-
发表了主题帖:
LTC6910可控增益放大器
求助大神!为啥LTC6910运放的输出一直为高电平啊!救救孩子
- 2024-05-24
-
发表了主题帖:
为什么quartus仿真不出波形啊啊啊啊球球大佬帮忙看一下呗
RTL视图
顶层模块
dds正弦波信号发生模块
module dds_noip(
input wire sclk,
input wire rst_n,
input wire [7:0] FW,
output wire [7:0] o_wave,
output reg out
);
parameter FRQ_W=32'd85899346; //相当于M
parameter FRQ_ADD=32'd85899346/2;//相当于递增量
reg [31:0] phase_sum;
wire [8:0] addr;
reg [31:0] frq_word;
reg [6:0] div_cnt;
reg div_flag;
always @(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
phase_sum <= 1'd0;
else
phase_sum <= phase_sum + FRQ_W/FW;
assign addr = phase_sum[31:23];
always @(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
out <= 0;
else if(o_wave>128)
out <= 1;
else
out <= 0;
rom_512x8 rom_512x8_inst(
.address(addr),
.clock(sclk),
.rst(rst_n),
.q(o_wave)
);
endmodule
rom模块
module rom_512x8 (
address,
clock,
rst,
q
);
input [8:0] address;
input clock;
input rst;
output reg [7:0] q;
parameter SINE_FILE = "sine.txt";
reg [7:0] sine_rom [511:0];
initial
begin
$readmemh(SINE_FILE, sine_rom);
end
always@(posedge clock,negedge rst)
begin
if(!rst)
begin
q<=8'b0;
end
else
begin
q<=sine_rom[address];
end
end
endmodule
uart串口接收模块
module uart_rx(
clk,
res,
RX,
data_out,
en_data_out
);
input clk;
input res;
input RX;
output[7:0] data_out;//接收字节输出
output en_data_out;//输出使能
reg[7:0] state;//主状态机
reg[12:0] con;//用于计算比特宽度;
//系统时钟频率24兆赫兹(24,000,000),支持4800波特率
//计数24000000/4800=5000(0001 0011 1000 1000),13位
//1.5倍宽度,5000*1.5=7500,算8000(0001 1111 0100 0000),13位
reg[4:0] con_bits;//用于计算比特数,计转了多少圈
reg RX_delay;//RX延时
reg en_data_out;
reg[7:0] data_out;
always@(posedge clk or negedge res)
if(~res)begin
state<=0;con<=0;con_bits<=0;RX_delay<=0;
data_out<=0;en_data_out<=0;
end
else begin
RX_delay<=RX;//有时钟就在动,不需要条件
case(state)
0://等空闲,10个bit以上连续的1
begin
if(con==5000-1)begin
con<=0;//计数转了一圈
end
else begin
con<=con+1;
end
if(con==0)begin
if(RX)begin
con_bits<=con_bits+1;
end
else begin
con_bits<=0;
end
end
if(con_bits==12)begin
state<=1;
end
end
1://等起始位;
begin
en_data_out<=0;
if(~RX&RX_delay)begin
state<=2;
end
end
2://收最低位b0;
begin
//要等1.5Tbit,5000*1.5=7500
if(con==7500-1)begin
con<=0;
data_out[0]<=RX;
state<=3;
end
else begin
con<=con+1;
end
end
3://收最低位b1;
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[1]<=RX;
state<=4;
end
else begin
con<=con+1;
end
end
4://收最低位b2
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[2]<=RX;
state<=5;
end
else begin
con<=con+1;
end
end
5://收最低位b3
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[3]<=RX;
state<=6;
end
else begin
con<=con+1;
end
end
6://收最低位b4
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[4]<=RX;
state<=7;
end
else begin
con<=con+1;
end
end
7://收最低位b5
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[5]<=RX;
state<=8;
end
else begin
con<=con+1;
end
end
8://收最低位b6
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[6]<=RX;
state<=9;
end
else begin
con<=con+1;
end
end
9://收最低位b7
begin
//要等1Tbit,5000*1=5000
if(con==5000-1)begin
con<=0;
data_out[7]<=RX;
state<=10;
end
else begin
con<=con+1;
end
end
10://产生使能脉冲
begin
en_data_out<=1;
state<=1;
end
default://其他未定义状态
begin
state<=0;
con<=0;
con_bits<=0;
en_data_out<=0;
end
endcase
end
endmodule
rom的初始化文件也都放在和db、modelsim同级目录下面了,还是不是到什么问题,是模块连接的问题吗
- 2024-05-20
-
回复了主题帖:
verilog 实现rom,仿真输出一直为x。求助..
卿小小 发表于 2024-5-20 11:34
现象:仿真输出一直为x。
原因:在rom.v中,指定了仿真初始化文件为sinABFull256x16Hex.txt;但是你的仿 ...
解决啦,就是初始化文件没有放在modelsim文件里,非常感谢!
-
回复了主题帖:
verilog 实现rom,仿真输出一直为x。求助..
Jacktang 发表于 2024-5-20 07:28
帮楼主顶一下
谢谢哦
- 2024-05-19
-
发表了主题帖:
verilog 实现rom,仿真输出一直为x。求助..
写了一个rom,写入数据,为什么仿真的时候输出一直为x啊,有没有大佬帮我看看救命呜呜呜呜呜呜呜呜呜
module rom( rst,clk,o_sine);
input clk;
input rst; //复位信号
output o_sine;
reg [7:0] o_sine; //存储的数据位宽为8位
//parameter INIT_FILE = "../dat/ram_init.dat"reg [7:0] ROM [255:0];
parameter SINE_FILE = "sinABFull256x16Hex.txt"; //正弦波形数据
reg [7:0] sine_rom [255:0]; //存储器的深度为256
reg [7:0] cnt;
integer i;
initial
begin
$readmemh(SINE_FILE, sine_rom);
for(i=0;i<256;i=i+1)
$display("sine_rom[%d]= %h",i,sine_rom[i]);
end
always@(posedge clk,negedge rst)
begin
if(!rst)
begin
o_sine<=8'b0;
cnt<=0;
end
else if(cnt<256)
begin
o_sine<=sine_rom[cnt];
cnt<=cnt+1;
end
else
cnt<=0;
end
endmodule
下面是测试代码
`timescale 1ns / 1ps
module rom_tb( );
reg rst,clk;
wire [7:0] o_sine;
initial
begin
clk=0;
rst=1; //低电平复位信号赋初始值1
#40 rst=0;
#60 rst=1;
end
rom rom_test(.rst(rst),.clk(clk),.o_sine(o_sine));
always #1 clk=~clk; //时钟周期为2ns
endmodule